[インフラ] Fluentd でEC2 から S3 にapache のログ送信してみた

EC2 のdisk がいっぱいだけどログは保存したいみたいな需要であったり、監査のためにログを保存したいけど、EC2 から取り出すのはめんどくさそうだなとか思ったことがあると思います。

そんな時にS3に保存できたら、便利だなって一度は思ったことあると思います。それを叶えてくれるのが、fluentd です。今回はAlma linux 9 を使って、fluentd でEC2 からS3 にログを送信してみた時の備忘録書きます。


# 今回の環境

EC2 (Alma linux 9) + S3 へのfull access role 付き
S3 
fluentd
apache 2.4.57

今回はEC2 S3 などは作成した前提で書いていきます。

# apache のインストール

```
# install
dnf install httpd

# version check
httpd -v

# start
systemctl start httpd

```

ここまでできたらapache の準備は万端です。

# fluentd のインストール

fluentd の公式を見てみると pre-install の手順もあると思いますが、推奨設定なので、設定はおすすめしますが、今回は省略します。

インストールしていくと、Happy Logging と表示されれば、問題なくインストールはできています。

```
# インストール
curl -fsSL https://toolbelt.treasuredata.com/sh/install-redhat-fluent-package5-lts.sh | sh


Installed:
  fluent-package-5.0.4-1.el9.x86_64

Complete!

Installation completed. Happy Logging!

```

loggin することにおいて、時間は大事になってくるので、(特にappとかだと) ntp の設定はしておきましょう。後は、時間も日本時間に設定しておくことをかなりおすすめします。(設定しなくても大丈夫ですが、かなり計算が面倒になります)


# 時間の設定 (chrony)

最初に時間をJST に合わせていきましょう！！
色々やり方はありますが、今回はtimedatectl で合わせていきます。
```
#timedatectl での時間設定
timedatectl set-timezone Asia/Tokyo


# 確認(東京になっていると大丈夫です)

               Local time: Sat 2024-08-31 12:51:14 JST
           Universal time: Sat 2024-08-31 03:51:14 UTC
                 RTC time: Sat 2024-08-31 03:51:14
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

```

それから、chrony で時間を合わせていきます。今回はAWS のサービスを使用しているので、Amazon Time Sync Service の記事に書かれている設定で合わせていきます。けれども、Alma linux 9 ではすでに設定が入っているので、今回は内容だけ記載します。
(fluentd の公式の記事でも推奨されている設定になります)

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-ec2-ntp.html#ptp-hardware-clock-requirements

```
# 
vim /etc/chrony.conf

下の設定が入っているとオッケーです
----------------------------------------

# Select which information is logged.
#log measurements statistics tracking
# Amazon Time Sync Service
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

---------------------------------------

```

ここまで確認できたら、いよいよ設定に入ります。

# fluentd の設定について

とりあえず、fluentd を立ち上げます
問題なく、起動していれば大丈夫です！！

```
systemctl start fluentd

systemctl status fluentd
```

今回はS3 に対してログを送信するので、S3 に送信のために必要なplugin をインストールします

```
# plugin install
fluent-gem install fluent-plugin-s3
fluent-gem install fluent-plugin-forest
fluent-gem install fluent-plugin-ec2-metadata

```

そして、fluentd がログを読み取れるように、httpd のログのディレクトリなどの、権限を変更していきます

```
chmod o+rx /var/log/httpd/

chmod o+r /var/log/httpd/access_log
```

後は、fluentd.conf に以下を記述！(log がapache なのかmessages かによって、若干記述が変わるので、注意)
apache2 とか(主にubuntu) だと、apache の書き方が変わるので、注意が必要になる。

今回は、role をつけているので、aws access key や、private key は必要ない。role をつけない場合は必要になるので、注意!(運用としてつける方が楽なので、個人的にはこっちがおすすめ）

timekey はテストように、60 秒とかに一時的にするのを推奨。そうしない場合は、1時間待たないといけないので。。本番環境では適切な値に設定してください。
```
<source>
  @type tail

  format apache
  path /var/log/httpd/access_log
  pos_file /var/log/fluent/httpd.access.log.pos
  tag s3.httpd.access
</source>

<match s3.*.*>
  @type s3
  #aws_key_id
  #aws_sec_key
  s3_bucket <your-bucket-name>
  s3_region ap-northeast-1
  path log_
  time_slice_format %Y%m%d%H%M
   <buffer>
    @type file
    path /var/log/apache-fluent/s3
    timekey 60 #1分間
    timekey_wait 1m
    chunk_limit_size 256m
  </buffer>
</match>

```


これで fluentd をrestart して、apache に対してリクエストを送ってください。そうすると、S3 にログが送信されていたら、検証が完了です。エラーが出てないのに上手く行かない場合は、format の書き方とか間違っている可能性あるので、公式ドキュメントや他の方が書いてるブログなどを参考にして、確認してみてください。


# 参考記事


https://docs.fluentd.org/installation/install-by-rpm


https://techgekka.hateblo.jp/entry/2016/11/08/195406


https://se-brain.com/2022/01/29/ec2%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%92s3%E3%81%AB%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%EF%BC%88fluentd%EF%BC%89/#toc4