こんにちは。
技術課の山本です。
以下記事では、Java コンテナの出力する複数行のログが、CloudWatch上で複数のログレコードに分かれてしまう場合に、1つのログレコードにまとめる方法を解説しました。
AWS Fargate で FireLens を利用し、FireLens の multiline parser 機能を使って、複数行で出力するログを1つのログレコードにまとめました。
その際に、ログルーターである Fluent Bit のコンテナイメージを、利用者側で ECR のプライベートリポジトリに保管していました。
引き続き調査してみたところ、ECR のパブリックリポジトリにある AWS 公式の Fluent Bit のコンテナイメージを、直接利用する方法があると分かりました。
利用者側では、Fluent Bit の設定ファイルを、S3 バケット上に配置するのみで良い方法です。
本記事で、簡単な環境を作ってみましょう。
S3 バケットに fluentbit の設定ファイル (extra.conf) を配置する
fluentbit の設定ファイル (extra.conf) を作成します。 前回の記事で使用したものと同じです。
[FILTER] name multiline match * multiline.key_content log multiline.parser java
extra.conf を配置する S3 バケットを作成します。Fargate と同じリージョンにしました。
extra.conf を S3 バケットに配置します。
ARN をコピーしておきます。
IAM ポリシーを作成し、ECS タスクロールに追加する
1つ目の IAM ポリシー
fluentbit の設定ファイル (extra.conf) を取得するための IAM ポリシーです。
fluentbit の設定ファイル (extra.conf) を保管した S3 バケットへの Get / GetBucketLocation を許可する IAM ポリシーを作成します。
Resource セクションには S3 バケットの ARN を記載します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::test-yamamoto-fluentbit/*", "arn:aws:s3:::test-yamamoto-fluentbit" ] } ] }
2つ目の IAM ポリシー
ログを CloudWatch に出力するためのポリシーです。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents" ], "Resource": "*" }] }
ECS タスクロール用の IAM ロール
ECS タスクロール用の IAM ロールを作成します。
信頼されたエンティティは以下にします。
- AWS のサービス
- Elastic Container Service
- Elastic Container Service Task
- Elastic Container Service
上で作成した2つの IAM ポリシーを 付与します。
ECS のタスク定義を作成する
AWS CLI で作成します。(新しいマネジメントコンソールから作成できないので、泣く泣く AWS CLI にしています。)
パラメータの詳細は前回の記事に書いていますので、お手数ですが、以下もご参照ください。
以下は置き換えください。
・<AWSアカウント番号>
・<上で作成したECSタスクロール名>
・<JavaコンテナのイメージURL>
{ "family": "firelens-example-multiline", "taskRoleArn": "arn:aws:iam::<AWSアカウント番号>:role/<上で作成したECSタスクロール名>", "executionRoleArn": "arn:aws:iam::<AWSアカウント番号>:role/ecsTaskExecutionRole", "containerDefinitions": [ { "essential": true, "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:init-2.28.4", "name": "log_router", "firelensConfiguration": { "type": "fluentbit" }, "memoryReservation": 50, "environment": [ { "name": "aws_fluent_bit_init_s3_1", "value": "arn:aws:s3:::test-yamamoto-fluentbit/extra.conf" } ] }, { "essential": true, "image": "<JavaコンテナのイメージURL>", "name": "app", "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "cloudwatch_logs", "region": "ap-northeast-1", "log_group_name": "multiline-test/application", "auto_create_group": "true", "log_stream_prefix": "multiline-" } }, "memoryReservation": 100 } ], "requiresCompatibilities": ["FARGATE"], "networkMode": "awsvpc", "cpu": "256", "memory": "512" }
前回の記事との設定差分を説明します。
8行目の "image" (変更)
- public.ecr.aws/aws-observability/aws-for-fluent-bit:init-2.28.4
- AWS 公式の Fluent Bit のコンテナイメージから、「init-」で始まるイメージのURLを使用します。(S3 から設定ファイルを取得可能なイメージです。)
- 「init-」の先はバージョン番号です。stable 版は 以下のファイルから確認します
- aws-for-fluent-bit/AWS_FOR_FLUENT_BIT_STABLE_VERSION at mainline · aws/aws-for-fluent-bit · GitHub
- 2.28.4 は※2023/3/3 時点の stable版です。
- public.ecr.aws/aws-observability/aws-for-fluent-bit:init-2.28.4
14〜18行目の environment(追加)
name
- aws_fluent_bit_init_s3_ で始まる文字列を記載します。
- aws_fluent_bit_init_s3_1 としました。
value
- arn:aws:s3:::test-yamamoto-fluentbit/extra.conf
- extra.conf の ARN です。S3 バケットの ARN を記載し、末尾に "/extra.conf" を付与しました。
前回の記事の12〜15行目にあった、options セクションを削除しています。
- 代わりに、14〜18行目の environment に、 S3 上の設定ファイルの情報を記載しています。
以下の AWS CLI コマンドでタスク定義を作成します。
aws ecs register-task-definition --cli-input-json file://multiline-task-definition.json --region ap-northeast-1
タスクを動かして結果を確認する。
タスクを動かしてみたところ、Fluent Bit コンテナも、Java コンテナも、Exit code : 0 で正常終了していました。
ログも出ています。
FireLens の multiline parser 機能を使って、複数行で出力するログを1つのログレコードにまとめることができています。
まとめ
ECR のパブリックリポジトリにある AWS 公式の Fluent Bit のコンテナイメージを、直接利用する方法を紹介しました。
Fluent Bit のコンテナイメージを、利用者側で ECR のプライベートリポジトリに保管する必要がなくなり、Fluent Bit の設定ファイルを、S3 バケット上に配置するのみで良くなります。
FireLens を利用する際の敷居が、少し下がりそうですね。
余談
暖かくなってきて、春の残雪期に群馬や新潟の山を歩くのが楽しみです。
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。
基本的にのんびりした性格です。座右の銘は「いつか着く」