ECS FireLensを使ってコンテナログをS3に転送する方法

ECS FireLensを使ってコンテナログをS3に転送する方法

2025.08.01

はじめに

かつまたです。
今回はECSでFluent Bitを使用してコンテナログをS3に転送する方法について紹介します。ECSのFireLens機能を使うことで、コンテナログを様々な宛先に転送できますが、今回はS3をターゲットにしてみます。
マネジメントコンソールでの設定説明となっておりますが、最後にタスク定義のJSONも記載しています。

Fluent Bit とは

Fluent Bitは様々なソースからログを収集し、異なる宛先に転送することができるオープンソースのツールです。軽量で高性能なため、コンテナ環境やクラウド環境での利用に適しています。

やってみた

前提

  • ログ配信用S3バケット作成済み
  • ECSタスクロール作成済み
IAMロール例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名",
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}

タスク定義作成

  1. 「ECS」→「タスク定義」からタスク定義を作成します。ECSのタスク定義でアプリケーションコンテナを設定します。コンテナ名を「app」とし、イメージには「nginx:latest」を指定します。ポートマッピングでは80番ポートを公開します。
    スクリーンショット 2025-07-11 17.37.01.png

  2. 次に、アプリケーションコンテナのログ設定を行います。ログ収集で「Amazon Firelens経由でS3にログをエクスポートする」を選択し、以下のオプションを設定します:

    • bucket: ログを保存するS3バケット名
    • total_file_size: ログファイルの最大サイズ(例:1M)
    • s3_key_format: S3に保存する際のパス形式(例:/logs/year=%Y/month=%m/day=%d/hour=%H/%Y-%m-%d-%H-%M-%S)
    • use_put_object: S3へのアップロード方法(On)
    • upload_timeout: アップロードのタイムアウト時間(例:30s)
    • region: S3バケットのリージョン
    • Match: ログのフィルタリングパターン(例:*)
    • Name: 出力先の指定(例:s3)

ECSにおけるFluent Bitのログ設定の推奨は以下リファレンスから確認可能です。
https://docs.fluentbit.io/manual/pipeline/outputs/s3#using-s3-without-persisted-disk

スクリーンショット 2025-07-11 17.37.09.png

  1. ログルーターコンテナ(FireLens)を設定します。コンテナ名を「log_router」とし、イメージには「public.ecr.aws/aws-observability/aws-for-fluent-bit:stable」を指定します(ログ収集で「Amazon Firelens経由でS3にログをエクスポートする」が選択されていると自動で設定されます)。
    スクリーンショット 2025-07-11 17.37.17.png

  2. ログルーターコンテナ自体のログ設定も行います。ログ収集で「Amazon Cloudwatch」を選択し、以下のオプションを設定します:

    • awslogs-group: CloudWatchロググループ名
    • awslogs-region: CloudWatchのリージョン
    • awslogs-stream-prefix: ログストリームのプレフィックス
      スクリーンショット 2025-07-11 17.37.26.png

ECSクラスターとサービス作成

  1. ECSクラスターを作成します。クラスター名を記入し、Fargateを使用するサーバーレスクラスターとして設定します。
    スクリーンショット 2025-07-11 17.39.08.png

  2. 作成したタスク定義を使用してサービスを起動します。作成したタスク定義を選択し、必要なタスク数を設定します。起動タイプは「FARGATE」を選択します。VPCやサブネット、セキュリティグループについても設定します。
    スクリーンショット 2025-07-11 17.39.38.png

スクリーンショット 2025-07-11 17.40.05.png

確認

  1. サービスが正常に起動すると、Nginxのデフォルトページにアクセスできるようになります。起動した「サービス」→「タスク」の詳細画面からパブリックIPアドレスを確認し、Webブラウザで検索することで正常起動できているか確認できます。
    開いたWebページでリロードなどの操作を行い、S3バケットに配信する用のログを発生させます。

スクリーンショット 2025-07-11 17.41.23.png

  1. S3バケットを確認すると、設定したパス形式に従ってログファイルが保存されていることが確認できます。ログファイルには、Nginxのアクセスログやエラーログが含まれます。
    スクリーンショット 2025-07-11 17.34.24.png

タスク定義(JSON)

上記で作成したタスク定義はJSONで表記すると以下のようになります。

タスク定義例
{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:XXXXXXXXXXXX:task-definition/firelens-fluentbit-s3:7",
    "containerDefinitions": [
        {
            "name": "app",
            "image": "nginx:latest",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "app-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "environment": [],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awsfirelens",
                "options": {
                    "bucket": "ecs-fluentbit-log-XXXXX",
                    "total_file_size": "1M",
                    "s3_key_format": "/logs/year=%Y/month=%m/day=%d/hour=%H/%Y-%m-%d-%H-%M-%S",
                    "use_put_object": "On",
                    "upload_timeout": "30s",
                    "region": "us-east-1",
                    "Match": "*",
                    "Name": "s3"
                }
            },
            "systemControls": []
        },
        {
            "name": "log_router",
            "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable",
            "cpu": 0,
            "memoryReservation": 50,
            "portMappings": [],
            "essential": true,
            "environment": [],
            "mountPoints": [],
            "volumesFrom": [],
            "user": "0",
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/aws/ecs/firelens-fluentbit-s3",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "firelens"
                }
            },
            "systemControls": [],
            "firelensConfiguration": {
                "type": "fluentbit",
                "options": {
                    "enable-ecs-log-metadata": "true"
                }
            }
        }
    ],
    "family": "firelens-fluentbit-s3",
    "taskRoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/ecs-fluentbit-s3-put-logs",
    "executionRoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "revision": 7,
    "volumes": [],
    "status": "ACTIVE",
    "requiresAttributes": [
        // 属性情報(省略)
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2",
        "FARGATE"
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "3072",
    "registeredAt": "2025-07-11T08:14:34.907Z",
    "registeredBy": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/cm-XXXXX/cm-XXXXX",
    "tags": []
}

おわりに

今回はECSのFireLens機能を使ってFluent BitでコンテナログをS3に転送する方法を紹介しました。
この方法で、コンテナログを長期保存したり、後から分析したりすることが可能になります。
また、Fluent Bitの設定を変更し、S3以外にもKinesis Data Firehose、CloudWatch Logsなど様々な宛先にログを配信できるようになります。

ご覧いただきありがとうございました。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.