Firelensとは
去年ECSのログ出力先をカスタマイズできる「Firelens」機能がリリースされました。 それまでは、ECSコンテナのログはCloudwatchLogsか自前でFluendコンテナを立ててログ取集する仕組みを作るみたいなやり方だったと思います。 CloudwatchLogsはログが見づらくてつらすぎるし、Fluentdコンテナ立てて自前でログ収集基盤を構築しメンテナンスするのもしんどい。ここら辺マネージドサービスでいい感じにしてくれる機能がFirelensです。
どうやって使うかざっくり説明すると、1タスク定義の中にFirelens用コンテナを立ててアプリケーションコンテナのログ出力先をFirelensにするだけ。やってみたらサクッと設定できてしまいました。FluentBitのイメージはAWS側が提供しているのでそれを指定してあげればOK。
構成
構成は以下の通りで、Firelensコンテナをサイドカー構成にしています。 Kinesis Data Firehoseを経由してS3バケットにログをzip形式で出力するようにしました。
Kinesis Data Firehoseは初めて使ったのですが、設定は本当に簡単。 ストリーミングデータをデータレイクや分析ツールに送ってくれる中継サービスなので、受けたストリーミングデータをどこにどんな形式でどれくらいの間隔で送ればいいか指定するだけでS3バケットによしなに格納してくれます。
タスク定義
タスクはいつものようにアプリケーションコンテナの設定を行い、ログ設定のところだけいじります。
"logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "firehose", <--- ルーティング先を"firehose"にする "region": "ap-northeast-1", "delivery_stream": "test" <--- ストリーム名 }
そしてLog用コンテナを立ててマネージドイメージを指定し自身のコンテナログはCloudwatchLogsに出力されるようにします。
{ "name": "log_router", "image": "906394416424.dkr.ecr.ap-northeast-1.amazonaws.com/aws-for-fluent-bit:latest", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "firelens_test", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "aws-for-fluent-bit" } }, "firelensConfiguration": { "type": "fluentbit" } }
タスク立ち上げてS3バケットに出力されているか確認。問題なさそう。
気をつけること
タスクロールにログをKinesis Data Firehoseにルーティングするための権限を忘れずに付与してあげます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecordBatch" ], "Resource": [ "*" ] } ] }
Kinesis Data firehoseのロールには対象S3バケットの権限を付与します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "[YOUR-S3-ARN]" } ] }
参考文献
SansanさんのBuilders Book1を参考にさせていただきました わかりやすくてよかったです。