🔎

ECSのFireLensでカスタムFluentBitイメージを使う

2023/08/29に公開

FireLensを実運用するにおいてメモリー制限が必要だったのですが、デフォルトのFireLensだとMem_Buf_Limitの設定ができないため、カスタムFluentBitイメージを自分で用意してみました。

FireLensでは通常必要ありませんが、 fluent-bit.conf[SERVICE][INPUT] の設定を記載します。
[INPUT] は下記のような設定にすることで、デフォルトのFireLensと同じようにコンテナからログが取得できるようになります。

fluent-bit.conf
[SERVICE]
    Flush          1
    Grace          30
    Mem_Buf_Limit  30MB
[INPUT]
    Name           forward
    Unix_Path      /var/run/fluent.sock
[FILTER]
    Name record_modifier
    Match *
    Record ecs_cluster ${ECS_CLUSTER}
    Record ecs_task_arn ${ECS_TASK_ARN}
    Record ecs_task_definition ${ECS_TASK_DEFINITION}
[OUTPUT]
    Name           forward
    Match          *
    Host           ${FLUENTD_HOST}
    Port           24224

ECSのクラスター名やタスク定義をラベル化したかったので、 entrypoint.sh で情報を取得します。

entrypoint.sh
#!/bin/bash

### Collect EC2 and ECS metadata
export EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
export ECS_METADATA=$(curl -s ${ECS_CONTAINER_METADATA_URI_V4})
export ECS_CLUSTER=$(echo ${ECS_METADATA} | python -c "import json, sys; print(json.load(sys.stdin)['Labels']['com.amazonaws.ecs.cluster'])")
export ECS_TASK_ARN=$(echo ${ECS_METADATA} | python -c "import json, sys; print(json.load(sys.stdin)['Labels']['com.amazonaws.ecs.task-arn'])")
export ECS_TASK_DEFINITION_FAMILY=$(echo ${ECS_METADATA} | python -c "import json, sys; print(json.load(sys.stdin)['Labels']['com.amazonaws.ecs.task-definition-family'])")
export ECS_TASK_DEFINITION_VERSION=$(echo ${ECS_METADATA} | python -c "import json, sys; print(json.load(sys.stdin)['Labels']['com.amazonaws.ecs.task-definition-version'])")
export ECS_IMAGE_VERSION=$(echo ${ECS_METADATA} | python -c "import json, sys; print(json.load(sys.stdin)['Image'].split(':')[-1])")
export ECS_TASK_DEFINITION="${ECS_TASK_DEFINITION_FAMILY}:${ECS_TASK_DEFINITION_VERSION}"

echo "AWS for Fluent Bit Container Image Version ${ECS_IMAGE_VERSION}"
exec /fluent-bit/bin/fluent-bit -e /fluent-bit/firehose.so -e /fluent-bit/cloudwatch.so -e /fluent-bit/kinesis.so -c /fluent-bit/alt/fluent-bit.conf

Dockerイメージ作成時に entrypoint.sh を実行するようにします。

Dockerfile
FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:2.21.1
COPY entrypoint.sh /
COPY fluent-bit.conf /fluent-bit/alt/fluent-bit.conf

CMD ["/bin/bash", "-c", "/entrypoint.sh"]

これで完了です。

Discussion