概要
fluentd
でEC2で動いているアプリケーションのログをGUI上で監視したいと思いました。
そのため、 CloudWatchLog
に投げ、GUI上でログを見れるようにしていきます。
IAMロールの作成
IAMでロールを作成します。
今回はCloudWatchにフルアクセスできるロールを新規に作成しました。
これをEC2にアタッチします。
アクション>インスタンスの設定 からIAMロールの割当を行ってください。
IAMの設定は以上で完了です。
導入
まずは公式サイトに沿って導入します。
$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
次にCloudWatchに投げたいので、プラグインを導入します。
プラグインは fluent-plugin-cloudwatch-logsを使います。
$ td-agent-gem install fluent-plugin-cloudwatch-logs
次にApacheをインストールします。
fluentdがアクセスできるように、ログディレクトリの権限変更も行います。
$ yum install -y httpd
$ chmod 777 -R /var/log/httpd
以上で導入は完了です。
設定
設定は /etc/td-agent/td-agent.conf
に記載します。
今回はテストとして、Apacheのログをターゲットにします。
# アクセスログ
<source>
@type tail
format apache
path /var/log/httpd/access_log
pos_file /var/log/td-agent/httpd.access.log.pos
tag td.apache.access
</source>
# logsへログを転送
<match td.apache.**>
@type cloudwatch_logs
region ap-northeast-1
log_group_name apache
auto_create_stream true
use_tag_as_stream true
</match>
これで設定はOKです。
では早速動かしてみます。
$ systemctl start td-agent
これで起動したので、ログを吐き出してみます。
$ curl -vvv http://127.0.0.1
するとCloudWatchのapacheロググループに、td.apache.accessというログストリームができ、Apacheのアクセスログがあることが確認できると思います。
個人的に詰まったポイント
AWSアカウントを読み込まない
プラグインでAWSアカウントが必要なので、設定しようとしましたが、苦戦しました。
最初はrootユーザのenvに設定しましたが読み込まず、設定ファイルにアカウントのキーとシークレットキーを記載して動かしました。
(FYI EC2のログをfluentdでCloudWatchに投げる - juve534のブログ)
最終的には「AWS的にはロールで管理した方が良い」というアドバイスを受け、EC2にロールを設定することで解決としました。
ログストリーム名が動的にならない
ログストリーム名をタグ名にしようと設定ファイルに、 log_stream_name {$tag}
と設定しましたが、 {$tag}
というストリーム名になってしました。
こちらはプラグインのREADMEを見直し、 use_tag_as_stream
という設定値を見つけたので、これを設定して解決しました。
まとめ
EC2のログをCloudWatchに投げることができました。
fluentdを使うことで、サーバにsshしなくても、ログを確認できるようになりました。
自分の詰まったポイントと合わせ、参考になれば幸いです。
以上、最後まで読んでいただきありがとうございました。