Help us understand the problem. What is going on with this article?

Fargate のログを FireLens を通して、EC2 の Fluentd/td-agent に出力する

概要

AWS FireLens を利用して、Fargate に立ち上げた nginx から EC2 インスタンスに用意した td-agent にログを落とす構成を作ってみます。今回の例は ECS(Fargate) ですが、CPU Unit や Memory Limit 周り以外は設定としては ECS(EC2) でも同様です。

図示すると
image.png

のような状態から、
image.png

のような構成を作ります。

構築

Fargate で nginx が動作している状態

Task Definition は以下のようになっているはずです。

image.png (155.0 kB)

image.png (270.9 kB)

image.png (108.5 kB)

nginx コンテナは以下のようになっています。

image.png (158.0 kB)

image.png (132.9 kB)

FireLens の設定を入れる

Task Definition の設定で、 Enable FireLens integration にチェックを付けて Apply します。

image.png (113.2 kB)

すると、コンテナに log_router というコンテナが増えます(内部では用意されたイメージで fluentbit が動作します)

image.png (72.5 kB)

ログを出力する方のコンテナ(ここでは nginx) 側で、ログをどう処理するかの設定を行います。今回は所定の fluentd が動作しているホストに forward したいので、以下のような設定を nginx コンテナに足します。
Log driver を awesfirelens にして、Name を forward にします。これでログの転送が行われます。Host と Port は今回用意するログの受け側のFluentd/td-agentのIPアドレス/ポートに設定します。

image.png (67.4 kB)

ECS 側の設定はこれで完了です。
fluentd におけるログのタグは -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 がエラーで保存できないことがありましたが、 コンテナの設定を開いたり閉じたりしてみると解消します。エラーになったら試してみましょう。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away