Firelens for Fargateでログを複数箇所に吐き出す

Fargate上のNginxコンテナのアクセスログを、fluent bitから複数の宛先(CloudWatchLogs / Kinesis Firehose)に出力できるか検証しました。

結論からいうとできる、が、タスク定義だけでは解決できず、CustomConfigurationを使う必要がありそう。というところです。

カスタムログルーティング - Amazon ECS

注意点としては、Fargate起動モードの場合、CustomConfigurationのソースにS3が使えないため、カスタムDockerImageを作成する必要がある点です。

Fargate 起動タイプを使用するタスクの場合、サポートされる config-file-type の値は file のみです。

FluentBit用DockerFile

FROM amazon/aws-for-fluent-bit:latest

COPY fluent-bit.conf /tmp/

fluent-bit.conf

[OUTPUT]
    Name   firehose
    Match  *
    region ap-northeast-1
    delivery_stream mgm-sample
[OUTPUT]
    Name cloudwatch
    Match  *
    region ap-northeast-1
    log_group_name fluent-bit-cloudwatch
    log_stream_prefix from-fluent-bit-
    auto_create_group true

taskdefinitions.json

{
    "family": "FireLensSample",
    "taskRoleArn": "arn:aws:iam::123456789012:role/RoleForESCTasksFireLens",
    "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
    "containerDefinitions": [
        {
            "essential": true,
            "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/custom-fluent-bit",
            "name": "log_router",
            "firelensConfiguration": {
                "type": "fluentbit",
                "options": {
                    "config-file-type": "file",
                    "config-file-value": "/tmp/fluent-custom.conf"
                }
            },
            "memoryReservation": 500
         },
         {
             "essential": true,
             "image": "nginx:latest",
             "name": "Nginx",
             "logConfiguration": {
                "logDriver":"awsfirelens"
            },
            "memoryReservation": 1000,
            "portMappings": [
                {
                    "hostPort": 80,
                    "protocol": "tcp",
                    "containerPort": 80
                }
            ]
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "networkMode": "awsvpc",
    "cpu": "1024",
    "memory": "2048"
}

もう少し確認したい点は、 fluent-bit.confFILTER が自分の環境だとうまく動作しなかった点。
Include/Exclude Patternを柔軟に設定できると、便利度がグーンと上がるけど、そもそもtaskdef.jsonで完結したいなという思いがある。