概要
AWS FireLens を利用して、Fargate に立ち上げた nginx から EC2 インスタンスに用意した td-agent にログを落とす構成を作ってみます。今回の例は ECS(Fargate) ですが、CPU Unit や Memory Limit 周り以外は設定としては ECS(EC2) でも同様です。
のような構成を作ります。
構築
Fargate で nginx が動作している状態
Task Definition は以下のようになっているはずです。
nginx コンテナは以下のようになっています。
FireLens の設定を入れる
Task Definition の設定で、 Enable FireLens integration
にチェックを付けて Apply
します。
すると、コンテナに log_router というコンテナが増えます(内部では用意されたイメージで fluentbit が動作します)
ログを出力する方のコンテナ(ここでは nginx) 側で、ログをどう処理するかの設定を行います。今回は所定の fluentd が動作しているホストに forward したいので、以下のような設定を nginx コンテナに足します。
Log driver を awesfirelens
にして、Name を forward
にします。これでログの転送が行われます。Host と Port は今回用意するログの受け側のFluentd/td-agentのIPアドレス/ポートに設定します。
ECS 側の設定はこれで完了です。
fluentd におけるログのタグは <container name>-firelens-* が FireLens に付与されます。この Task Definition だと、nginx-firelens-* というタグが付きます。
td-agent をインストールした EC2 インスタンスを用意する
ログの受け側の EC2 インスタンスを作ります。
通常の Amazon Linux 2 でインスタンスを作成して、適切に security group を開けた後、以下のように設定を投入します。
td-agent のインストール
# curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
# mkdir -p /var/log/firelens/nginx
# chown -R td-agent:td-agent /var/log/firelens/
td-agent の設定
この設定により、転送されてきたログが /var/log/firelens/nginx.YYYYMMDD.log
に出力されます。
<source>
@type forward
@id input_forward
</source>
# FireLens の設定により、 nginx-firelens-* というタグで飛んでくるので、こうしておきます
<match nginx-firelens-*>
@type file
@id mdoi-nginx
append true
path /var/log/firelens/nginx
time_slice_format %Y%m%d
flush_interval 1s
<format>
@type single_value
message_key log
</format>
</match>
新しい Task Definition をデプロイする
受け側が設定できたので、Service で新しい Task Definition を展開すると、設定が反映されます。 td-agent 側の flush_interval にもよりますが、nginx にアクセスすると、すぐにアクセスログが /var/log/firelens/nginx.YYYYMMDD.log
に出力され始めます。
ハマったところ
- Fargate ではなく EC2 のクラスタで試した際にインスタンスの ECS Agent のバージョンが古いと正しく設定できないことがありました。 ECS Agent のバージョンは最新にしておきましょう。
-
Enable FireLens integration
したあと、何故か Task Definition がエラーで保存できないことがありましたが、 コンテナの設定を開いたり閉じたりしてみると解消します。エラーになったら試してみましょう。