ECSのFireLensでFluent Bitの「CloudWatch」「Kinesis Firehose」「Kinesis Streams」プラグインを使う時の注意点

タイトルは長いですが、内容はシンプルです
2021.07.07

みなさん、こんにちは!
福岡オフィスの青柳です。

Amazon ECSのカスタムログルーティング機能である「FireLens」では、Fluent Bitをプラグインと共に使うことで、様々なサービスに対してログを転送することができます。

その中でも、AWSの下記サービスはログ転送先としてよく使われるのではないでしょうか。

  • CloudWatch Logs
  • Kinesis Data Firehose
  • Kinesis Data Streams

実は、Fluent Bitで上記サービスと連係するプラグインを利用する場合、ちょっとした注意点があります。

知っている人にとっては何ということはない話ですが、知らないと気付かずに「損」をしてしまいます。

タスク定義の書き方、どうしてますか?

上に挙げた3つのプラグインは、AWSドキュメントに設定例として掲載されていますし、ググると設定サンプルも見つかります。

(例えば https://github.com/aws-samples/amazon-ecs-firelens-examples/tree/mainline/examples/fluent-bit/cloudwatchlogs など)

設定例を参考にすると、タスク定義 (ログ送信元コンテナの部分) は以下のような書き方になります。

{
  "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種類があります。

  1. C言語で書かれたプラグイン
  2. 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

ここを時々チェックして「気付かないうちに古いプラグインを使ってしまっていた」という事態を避けると良いのではないかと思います。