ECSのFireLensでFluent Bitの「CloudWatch」「Kinesis Firehose」「Kinesis Streams」プラグインを使う時の注意点
みなさん、こんにちは!
福岡オフィスの青柳です。
Amazon ECSのカスタムログルーティング機能である「FireLens」では、Fluent Bitをプラグインと共に使うことで、様々なサービスに対してログを転送することができます。
その中でも、AWSの下記サービスはログ転送先としてよく使われるのではないでしょうか。
- CloudWatch Logs
- Kinesis Data Firehose
- Kinesis Data Streams
実は、Fluent Bitで上記サービスと連係するプラグインを利用する場合、ちょっとした注意点があります。
知っている人にとっては何ということはない話ですが、知らないと気付かずに「損」をしてしまいます。
タスク定義の書き方、どうしてますか?
上に挙げた3つのプラグインは、AWSドキュメントに設定例として掲載されていますし、ググると設定サンプルも見つかります。
設定例を参考にすると、タスク定義 (ログ送信元コンテナの部分) は以下のような書き方になります。
{ "name": "app", "image": "nginx:latest", "logConfiguration": { "logDriver":"awsfirelens", "options": { "Name": "cloudwatch", "region": "ap-northeast-1", "log_group_name": "firelens-logs", "log_stream_prefix": "app-log" "auto_create_group": "true", } } }
特におかしなところは無いように思えますし、実際この書き方で問題なくログ転送が行われます。
しかし、この書き方は現在では古いものとなっているのです。
その書き方、古いプラグインを使ってしまっています!
前述のタスク定義の書き方で、以下の部分に着目してください。
"options": { "Name": "cloudwatch", "region": "ap-northeast-1", "log_group_name": "firelens-logs", "log_stream_prefix": "app-log" "auto_create_group": "true", }
この箇所で「使用するプラグイン」を指定しています。
AWSドキュメント等に書かれている「プラグインを指定する際の名前」は以下のようになっています。
cloudwatch
: CloudWatch Logsプラグインfirehose
: Kinesis Data Firehoseプラグインkinesis
: Kinesis Data Streamsプラグイン
これらは、AWSから提供されているFireLens向けFluent Bitコンテナイメージ「aws-for-fluent-bit」に添付されているプラグインであり、以前はこれらのプラグインを使うことがスタンダードでした。
しかし、去年「CloudWatch Logs」「Kinesis Data Firehose」「Kinesis Data Streams」それぞれの新しいプラグインが提供され、現在では新しいプラグインを使うことが推奨されています。
新しいプラグインを使用するためには、「Options」の「Name」で以下の名前を指定する必要があります。
cloudwatch_logs
: 新しいCloudWatch Logsプラグインkinesis_firehose
: 新しいKinesis Data Firehoseプラグインkinesis_streams
: 新しいKinesis Data Streamsプラグイン
これらのプラグインはFluent Bit本体に内包されています。
各プラグインの使用方法はFluent Bitの公式ドキュメントページに掲載されています。
https://docs.fluentbit.io/manual/pipeline/outputs/cloudwatch
https://docs.fluentbit.io/manual/pipeline/outputs/firehose
https://docs.fluentbit.io/manual/pipeline/outputs/kinesis
新旧プラグインの違い
古いプラグインよりは新しいプラグインの方が良いだろう、というのは何となく分かりますが、具体的に何が違うのでしょうか?
実は、Fluent Bitの「プラグイン」には大きく2種類があります。
- C言語で書かれたプラグイン
- GO言語で書かれたプラグイン
(正確には、GO言語で書くことができるのはFluent Bitのプラグインのうち「出力プラグイン」のみです)
C言語よりもGO言語の方がプラグイン作成の敷居は低いのですが、プラグインの動作パフォーマンスの面ではC言語の方が優れています。 よって、Fluent Bit公式ドキュメントページでは新しいプラグインを使うことを推奨しています。
補足
GO言語で書かれたプラグインが「ダメ」という訳ではありません。
作成のし易さから、いろいろなサービスに対応したGO言語製プラグインが開発・提供されています。 同じ機能を持ったC言語製プラグインが提供されていない場合は、当然ながら、GO言語製プラグインを使って全然問題ありません。
今回ご紹介した「CloudWatch Logs」「Kinesis Data Firehose」「Kinesis Data Streams」のプラグインのように、「かつてGO言語製プラグインが提供されていたが、その後、C言語製プラグインが新たに提供された」というパターンは他にもあると思います。(過去にも、今後も)
Fluent Bitに内包されているC言語製プラグインの一覧は、Fluent BitのGitHubリポジトリを見ると分かったりします。
https://github.com/fluent/fluent-bit/tree/master/plugins
ここを時々チェックして「気付かないうちに古いプラグインを使ってしまっていた」という事態を避けると良いのではないかと思います。