ECR のパブリックリポジトリにある、 AWS 公式の Fluent Bit のコンテナイメージを直接利用して、 AWS Fargate で FireLens を利用する。

記事タイトルとURLをコピーする

こんにちは。
技術課の山本です。

以下記事では、Java コンテナの出力する複数行のログが、CloudWatch上で複数のログレコードに分かれてしまう場合に、1つのログレコードにまとめる方法を解説しました。
AWS Fargate で FireLens を利用し、FireLens の multiline parser 機能を使って、複数行で出力するログを1つのログレコードにまとめました。

blog.serverworks.co.jp

その際に、ログルーターである 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

上で作成した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" (変更)

  • 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 を利用する際の敷居が、少し下がりそうですね。

余談

暖かくなってきて、春の残雪期に群馬や新潟の山を歩くのが楽しみです。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)