🔎
ECSのFireLensでカスタムFluentBitイメージを使う
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