【Fluentd/td-agent】エラーログ通知メールを送信する

# はじめに

## 環境
EC2：AmazonLinux2023
Fluentdバージョン：LTS5
メールソフト：postfix

## 目的
サービスにエラーが起きた際、ログの内容をメールで通知する。
サービスとfluentdは別インスタンスにする。

# Fluentd用インスタンスの設定

## Fluentdをインストール
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# curl -fsSL https://toolbelt.treasuredata.com/sh/install-amazon2023-fluent-package5-lts.sh | sh
```

起動と有効化
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# systemctl start fluentd.service
[root@ip-xx-xx-xx-xx etc]# systemctl enable fluentd.service
Created symlink /etc/systemd/system/td-agent.service → /usr/lib/systemd/system/fluentd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/fluentd.service → /usr/lib/systemd/system/fluentd.service.
[root@ip-xx-xx-xx-xx etc]# systemctl status fluentd.service
```

## 必要なプラグインをインストール

### fluent-plugin-grepcounter
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# fluent-gem install fluent-plugin-grepcounter
```

### fluent-plugin-mail
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# fluent-gem install fluent-plugin-mail
```

### postfix
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# dnf install postfix
[root@ip-xx-xx-xx-xx etc]# systemctl start postfix
[root@ip-xx-xx-xx-xx etc]# systemctl enable postfix
```

### confファイルの設定

監視先インスタンスのエラーログが
/var/log/fluent/example.log
に転送されるものと仮定した記述になります。

#### /etc/fluent/fluentd.conf
```markdown:/etc/fluent/fluentd.conf
<match example>
  @type copy
  <store>
    @type file
    path /var/log/fluent/example.log
  </store>
  <store>
    @type grepcounter
    count_interval 100
    input_key message
    regexp ERROR
    threshold 1
    add_tag_prefix mailerror
  </store>
    <store>
    @type grepcounter
    count_interval 100
    input_key message
    regexp WARNING
    threshold 1
    add_tag_prefix mailwarning
  </store>
</match>

<match mailerror.example>
  @type copy
  <store>
    @type mail
    host localhost
    port 25
    from "error@example.com" 
    to "a@example.com, b@example.com" 
    subject "ERRORメールの件名" 
    message Log :%s
    message_out_keys message
  </store>
</match>
<match mailwarning.example>
  @type copy
  <store>
    @type mail
    host localhost
    port 25
    from "error@example.com" 
    to "a@example.com, b@example.com"
    subject "WARNINGメールの件名" 
    message Log!:%s
    message_out_keys message
  </store>
</match>
```

Fluentdを再起動

```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# systemctl restart fluentd
[root@ip-xx-xx-xx-xx etc]# systemctl status fluentd
```

# サービス用インスタンスの設定

## Fluentdをインストール
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# curl -fsSL https://toolbelt.treasuredata.com/sh/install-amazon2023-fluent-package5-lts.sh | sh
```

起動と有効化
```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# systemctl start fluentd.service
[root@ip-xx-xx-xx-xx etc]# systemctl enable fluentd.service
Created symlink /etc/systemd/system/td-agent.service → /usr/lib/systemd/system/fluentd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/fluentd.service → /usr/lib/systemd/system/fluentd.service.
[root@ip-xx-xx-xx-xx etc]# systemctl status fluentd.service
```

## 監視先インスタンスの /etc/fluent/fluentd.conf

```markdown:EC2
<source>
  @type tail
  path 監視・転送したいログファイルのPATHを記述
  tag example
  pos_file /var/log/fluent/example.pos
  format none
</source>

<match example>
  @type forward
  time_as_integer true
  flush_interval 60s
  <server>
    host xx.xx.xx.xx (fluentdのインスタンスのIP)
    port 24224
  </server>
</match>

```

Fluentdを再起動

```markdown:EC2
[root@ip-xx-xx-xx-xx etc]# systemctl restart fluentd
[root@ip-xx-xx-xx-xx etc]# systemctl status fluentd
```

# PORTの設定

Fluentd用・サービス用それぞれのインスタンスのセキュリティグループに24224の疎通を追加する。