こんにちは、岩城です。
最近、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
が指定されていることが分かります。
おわりに
本エントリがどなかたのお役に立てれば幸いです。