Firelensで起動するコンテナの環境変数を利用して起動したリージョンのCloudWatch Logsにログ出力する

2023.04.28

こんにちは、岩城です。

最近、Firelensに向き合っています。

複数の海外リージョンに展開するECSサービスがあり、ECSサービスを起動したリージョンのCloudWatch Logsに標準出力/標準エラー出力を出力させる必要がありました。

以下のように、Firelens(Fluent Bit)のconfigで出力先のリージョンをハードコーディングする方法もありますが、起動リージョンごとにFirelensのイメージを持つことを避けたかったのです。

[OUTPUT]
    Name cloudwatch_logs
    Match nginx**
    region ap-northeast-1
    log_group_name /ecs/logs/test-ecs-service
    log_stream_prefix from-
    log_retention_days 30
    auto_create_group true

やってみた

タイトルにあるとおり、Firelensコンテナの環境変数を利用することで対応可能です。

起動したFirelensコンテナで展開されている環境変数は以下のような感じです。

bash-4.2# env
HOSTNAME=ip-10-0-19-65.ap-northeast-1.compute.internal
TERM=xterm-256color
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AWS_EXECUTION_ENV=AWS_ECS_FARGATE
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
AWS_DEFAULT_REGION=ap-northeast-1
PWD=/
ECS_AGENT_URI=http://169.254.170.2/api/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
LANG=C.UTF-8
AWS_REGION=ap-northeast-1
HOME=/root
SHLVL=2
ECS_CONTAINER_METADATA_URI=http://169.254.170.2/v3/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ECS_CONTAINER_METADATA_URI_V4=http://169.254.170.2/v4/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

AWS_REGIONを使えば、Firelensコンテナが起動しているリージョンを特定できるので、これを利用してCloudWatch Logsの出力先を設定します。

[OUTPUT]
    Name cloudwatch_logs
    Match nginx**
    region ${AWS_REGION}
    log_group_name /ecs/logs/test-ecs-${AWS_REGION}
    log_stream_prefix from-
    log_retention_days 30
    auto_create_group true

東京リージョンと大阪リージョンで同じFirelensのイメージを使ってECSサービスでタスクを起動しました。実際に出力されたログは以下のような感じです。

東京リージョンであればap-northeast-1

大阪リージョンであればap-northeast-3が指定されていることが分かります。

おわりに

本エントリがどなかたのお役に立てれば幸いです。