AWS FireLensとは何か?(ECSのログ出力)
コア機能
AWS FireLens とは、有り体にいうと、 ECSで使えるDockerのロギングドライバの一種です。
たとえば、下記のようなECS定義で アプリコンテナ
と ログルーターコンテナ
が同一マシン内に立ち上がっている場合、アプリコンテナ
の標準出力を ログルーターコンテナ
にJSONログとして 投げつけることができます。サイドカーパターンですね。
-
アプリコンテナ
- ECSタスク定義:
logConfiguration { logDriver = 'awsfirelens', ... }
- ECSタスク定義:
-
ログルーターコンテナ
- ECSタスク定義:
firelensConfiguration { type = 'fluentbit' }
- ECSタスク定義:
アプリコンテナ
側は単純に普通のDockerイメージのように標準出力にアプリログを出力すればよく、それの調理はログルーターコンテナ
(とその後ろのコンポーネント)が自由に決定できます。ログルーターにログを集める設定(アドレスやポートなど)は全部AWSがやってくれます。
Docker自体、標準出力の処理方法を示すロギングドライバとしてfluentd
など指定できるようになっていますが、 それのAWSカスタマイズドなバージョンだと思えばいいです。
便利なDockerイメージ
FireLensに使える便利なログルーター用のAWS標準のFluent BitのDockerイメージ が提供されています。
標準のFluent BitのイメージにCloudWatch LogsやFirehoseなどへのドライバを含んだ構成になっています。
このDockerイメージを用いることにより、単純なログルーティングの設定なら、アプリコンテナ側のECSタスク定義(logConfiguration.options
)に設定を書くことにより実装できます。
たとえば下記はCloudWatch Logsにログを出力させるアプリコンテナ側の設定です。
"logConfiguration": {
"logDriver": "awsfirelens",
"options": {
"Name": "cloudwatch",
"region": "us-east-1",
"log_group_name": "firelens-container",
"auto_create_group": "true",
"log_stream_prefix": "from-app"
}
},
上記のアプリコンテナ側の設定は、最終的にはログルーターコンテナ内の /fluent-bit/etc/fluent-bit.conf
にデフォルトの設定ファイルとしてマウントされます。
Q. アプリのログを複数箇所(e.g. CloudWatch Logs & Firehoseとか)に出力したい場合は、どういう設定をすればいいのか?
標準の仕組みでは対応できないので、自作のFluent Bit設定ファイルを用意しましょう。
# /fluent-bit/etc/my-fluentbit.conf
# ${XXX} は実行時に環境変数に置換される (Fluent Bitの機能)
# ログルーター側の環境変数として設定値を提供してください
[OUTPUT]
Name firehose
Match *
region ${FIREHOSE_REGION}
delivery_stream ${FIREHOSE_DELIVERY_STREAM}
[OUTPUT]
Name firehose
Match *
region ${FIREHOSE_REGION_02}
delivery_stream ${FIREHOSE_DELIVERY_STREAM_02}
上記の設定ファイルをなんとかしてログルーターにマウントして読ませればいいのですが、EC2起動タイプのECSの場合はS3に設定ファイルを置くという選択肢が標準で使えるのですが、 Fargate起動タイプの場合はS3による設定ファイル指定を今のところ(2020-09-28時点)使えません。
ログルーターコンテナにNFSから設定ファイルをマウントするという手もありますが、大仰すぎるので、Fargate起動タイプの読み込むログルーター用イメージを作成してECRに置いておきましょう。
# (Dockerfile)
FROM amazon/aws-for-fluent-bit:2.7.0
ADD my-fluentbit.conf /fluent-bit/etc/my-fluentbit.conf
上記のようなカスタム設定ファイルを用いる場合は下記のようにログルーター側のECSタスク定義上で設定ファイル位置を指定します。
// ログルーターのECSタスク定義
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"config-file-type": "file", // S3の場合はs3を指定
// ここに自作設定ファイルの位置を書く
"config-file-value": "/fluent-bit/etc/my-fluentbit.conf"
}
},
ここで指定した自作設定ファイルは、標準の設定ファイルからインクルードされます。 CloudWatch LogsとFirehoseというケースの場合、標準設定側にCloudWatch Logsを書いておいて、自作設定ファイル側にFirehoseの設定を記述すればいいと思います。
この記事で触れていないこと
- IAMロールの設定 (通常通りにやってください)
- Fluentd (Fluent Bitの代わりに指定できます)
Discussion