Amazon ECSでFluentdを動かすときの設定をSystems Managerパラメータストアに込める

2022.05.12

ども、ゲストのNTT東日本の大瀧です。

OSSのログコレクタFluentdを動かすときに、外部から設定を取得したいときはありませんか。Amazon ECSのコンテナ環境で外部から設定を取得する方法はいくつかありますが、今回は設定をSystems Managerパラメータストアから読み込む構成をご紹介します。ちなみに、別のブログ記事でADOT Collectorの設定をSystems Managerパラメータストアから読み込む様子を見てFluentdでもやりたいなぁと思った次第でした。

構成のポイント

Fluentdの設定はfluentd.confファイルに書き、それを読み込むのが一般的です。一方でDockerコンテナでのファイル読み込みは、ホストのボリュームをマウントするかdocker buildでカスタムイメージをビルドする際にコピーすることになり、コンテナイメージのポータビリティに課題があります。そこで今回は設定ファイルは使用せずに、実行時の -i オプションでコンテナ実行のコマンドラインにインラインで設定を入れ込む形にします。Amazon ECSでは、Dockerコンテナの実行時にパラメータストアの値を環境変数として読み込む機能があるので、上記の -i オプションに続くインライン文字列でその環境変数を参照すれば良いわけです。

構成例

例えば、以下のようにパラメータストアを定義し、Fluentdの設定(今回は{"hello":"world"}を標準出力(コンテナログ)に出力する設定)を入れておきます。

<source>
  @type sample
  sample {"hello":"world"}
  tag sample
</source>
<match **>
  @type stdout
</match>

ECSタスク定義のうちのコンテナ定義を以下のようにしてみました。

設定名
詳細 - コマンド sh, -c, /usr/bin/fluentd -i "${FLUENTD_CONFIG}" -c /dev/null
環境変数 - FLUENTD_CONFIG ValueFrom /<YOUR_PREFIX>/fluentd-config

コマンドで試行錯誤しました。以下そのポイントです。

  • 実行するバイナリ(/usr/bin/fluentd)を直接指定するのではなく、シェルの引数に渡す形にします。これはDockerのCMDの仕様でシェル変数を展開させるためです。詳細はDockerドキュメントUnlike~ 以下を参照してください。
  • -c オプションで /dev/null を指定し、設定ファイルの設定を無効にしています。このオプションを省くとDockerイメージのデフォルトの設定ファイル(/fluentd/etc/fluent.conf)が読み込まれます。
  • CloudFormationなどでコマンドを記述するときは、シェル変数の参照の前後にあるダブルクォーテーションの扱いに注意してください。バックスラッシュなどでのエスケープが必要になるケースがありそうです。

これできちんと設定を読み込んで、実行されました!

まとめ

Amazon ECSでFluentdを動かすときの設定を、Systems Managerパラメータストアから読み込む例をご紹介しました。コンテナログであればFireLens(Fluent-bit)を利用することが多いと思いますが、プラグインなどの都合でFluentdを使うときにこの記事がお役に立てば幸いです。