📝

ECS Windows コンテナに Fluent Bit をデプロイするチュートリアルをやってみた

に公開

Amazon ECS Windows コンテナに Fluent Bit をデプロイする - Amazon Elastic Container Service
上記チュートリアルをやってみました。
手順通りにできなかった部分もあったので紹介します。

チュートリアルからの変更点

  • ECS クラスター名
  • ecs-windows-fluent-bit タスクのイメージ

事前準備

ECS クラスターを作成しておきます。
今回は EC2 インスタンスを ECS 外で起動するため、キャパシティプロバイダーは使用しない設定で作成します。

ステップ 1: IAM アクセスロールを作成する

ドキュメントの手順で OK です。

ステップ 2: Amazon ECS Windows コンテナインスタンスを作成する

Amazon ECS に最適化された Windows AMI メタデータを取得する - Amazon Elastic Container Service
まずは使用する AMI ID を確認する必要があります。
後述の手順との兼ね合いもあり、今回は Windows Server 2019 Core の AMI ID を取得します。

$ aws ssm get-parameters \
--names /aws/service/ami-windows-latest/Windows_Server-2019-English-Core-ECS_Optimized

{
    "Parameters": [
        {
            "Name": "/aws/service/ami-windows-latest/Windows_Server-2019-English-Core-ECS_Optimized",
            "Type": "String",
            "Value": "{\"image_name\":\"Windows_Server-2019-English-Core-ECS_Optimized-2025.04.14\",\"image_id\":\"ami-0b99f4ee36e51da31\",\"ecs_runtime_version\":\"Docker (CE) version 25.0.6\",\"ecs_agent_version\":\"1.91.2\"}",
            "Version": 77,
            "LastModifiedDate": "2025-04-23T17:31:50.743000+00:00",
            "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/ami-windows-latest/Windows_Server-2019-English-Core-ECS_Optimized",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

AMI ID は ami-0b99f4ee36e51da31 であることがわかりましたので、EC2 コンソールで AMI を検索して EC2 インスタンスを起動します。

EC2 インスタンス起動時の設定はドキュメント通りです。
ユーザーデータの cluster-name は事前準備で作成した ECS クラスター名に置換してください。
今回は test という ECS クラスター名で作成したので、cluster-name を test に置換しました。

<powershell>
Import-Module ECSTools
Initialize-ECSAgent -Cluster test -EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]'
</powershell>

ステップ 3: Fluent Bit の設定

今回は設定せずにデフォルトで進めます。

ステップ 4: ログを CloudWatch にルーティングする Windows Fluent Bit タスク定義を登録する

手順はドキュメント通りで問題ありませんが、使用するイメージを変更しました。

  • ドキュメント: public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-latest
  • 変更後: public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-stable

ドキュメントのイメージだと以下の挙動でした。

  • EC2 インスタンスの OS が Windows Server 2022 Full: コンテナ起動
  • EC2 インスタンスの OS が Windows Server 2019 Core: コンテナが起動しない

当初は Windows Server 2022 Full で検証していましたが、後述の windows-app-task のイメージが ervercore:ltsc2019 であるため、EC2 インスタンスの OS を Windows Server 2019 Core に変更したところ、ecs-windows-fluent-bit のタスクが起動しなくなりました。

windowsservercore-latest と Windows Server 2019 Core に互換性がなかったことが原因だと思われたため、windowsservercore-stable に変更しました。

変更後の ecs-windows-fluent-bit のタスク定義は以下の通りです。
(イメージを変更したためリビジョンが 2 になっています)

{
    "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:012345678901:task-definition/ecs-windows-fluent-bit:2",
    "containerDefinitions": [
        {
            "name": "fluent-bit",
            "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-stable",
            "cpu": 512,
            "memory": 512,
            "portMappings": [
                {
                    "name": "fluent-bit-24224-tcp",
                    "containerPort": 24224,
                    "hostPort": 24224,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "entryPoint": [
                "Powershell",
                "-Command"
            ],
            "command": [
                "C:\\entrypoint.ps1 -ConfigFile C:\\ecs_windows_forward_daemon\\cloudwatch.conf"
            ],
            "environment": [
                {
                    "name": "AWS_REGION",
                    "value": "ap-northeast-1"
                }
            ],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/fluent-bit-logs",
                    "awslogs-create-group": "true",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "flb"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "family": "ecs-windows-fluent-bit",
    "taskRoleArn": "arn:aws:iam::012345678901:role/ecsTaskExecutionRole",
    "revision": 2,
    "volumes": [],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2"
    ],
    "cpu": "512",
    "memory": "512",
    "registeredAt": "2025-05-08T13:04:21.328Z",
    "registeredBy": "xxx",
    "tags": []
}

ステップ 5: デーモンスケジューリング戦略を使用して ecs-windows-fluent-bit タスク定義を Amazon ECS サービスとして実行する

ドキュメント通りの手順で OK です。
create-service コマンドの --cluster で指定するクラスター名は事前準備で作成した ECS クラスター名です。

$ aws ecs create-service \
--cluster test \
--service-name FluentBitForwardDaemonService \
--task-definition ecs-windows-fluent-bit:1 \
--launch-type EC2 \
--scheduling-strategy DAEMON \
--region ap-northeast-1

タスクが起動するまで数分かかります。
タスク起動後に CloudWatch ロググループ「/ecs/fluent-bit-logs」が作成され、ログストリームも作成されます。

ログストリームには以下のログが記録されていました。

AWS for Fluent Bit Container Image Version 2.31.12
Fluent Bit v1.9.10
* Copyright (C) 2015-2022 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

[2025/05/09 02:03:58] [ info] [fluent bit] version=1.9.10, commit=b256069337, pid=516
[2025/05/09 02:03:58] [ info] [storage] version=1.4.0, type=memory-only, sync=normal, checksum=disabled, max_chunks_up=128
[2025/05/09 02:03:58] [ info] [cmetrics] version=0.3.7
[2025/05/09 02:03:58] [ info] [input:forward:forward.0] listening on 0.0.0.0:24224
[2025/05/09 02:03:58] [ warn] [aws_credentials] Failed to initialize profile provider: HOME, AWS_CONFIG_FILE, and AWS_SHARED_CREDENTIALS_FILE not set.
[2025/05/09 02:03:59] [ info] [sp] stream processor started
[2025/05/09 02:03:59] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] worker #0 started

ステップ 6: ログを生成する Windows タスク定義を登録する

ドキュメントの手順で OK です。

ステップ 7: windows-app-task タスク定義を実行する

ドキュメントの手順で OK です。
run-task コマンドの --cluster で指定するクラスター名は事前準備で作成した ECS クラスター名です。

$ aws ecs run-task \
--cluster test \
--task-definition windows-app-task:1 \
--count 2 \
--region ap-northeast-1

タスクが起動するまで数分かかります。
タスク起動後に CloudWatch ロググループ「/aws/ecs/FluentBit-cluster.windows-app-task」が作成され、ログストリームも作成されます。

ステップ 8: CloudWatch でログを確認する

以下の 2 つのロググループでログを確認できれば OK です。

  • /ecs/fluent-bit-logs
  • /aws/ecs/FluentBit-cluster.windows-app-task

後者のログストリームには以下のログが記録されていました。

{
    "ecs_cluster": "test",
    "ecs_container_name": "sample-container",
    "container_id": "ff3747f41f0ed6b5fa8aa4166a3b551b43bad80b78efa4d6cae2f9daa2ac5158",
    "source": "stdout",
    "ecs_task_definition_family": "windows-app-task",
    "ecs_task_arn": "arn:aws:ecs:ap-northeast-1:012345678901:task/test/7fef8bc59b7a4d5d88bfed1fe25ae45e",
    "container_name": "/ecs-windows-app-task-1-sample-container-889bf88dd0ffe5c25800",
    "log": "1",
    "ecs_task_definition_version": "1"
}

まとめ

今回は ECS Windows コンテナに Fluent Bit をデプロイするチュートリアルをやってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion