FireLens(Fluent Bit)CloudWatch Logsの新プラグインを使ったログストリーム作成方法
以前Fluent Bitで利用できるCloudWatch Logsの新旧プラグインの注意点を紹介しました。新プラグインではECSメタデータの利用した変数が使えないため、CloudWatch Logsのログストリームをタスクごとに個別作成できないのが課題でした。規定の変数を利用せず新プラグインでタスクごとのログストリーム作成の設定方法を紹介します。
まとめ
- 新プラグイン(
cloudwatch_logs
)ではECSメタデータを利用した変数は使えないため修正必須 - log_stream_prefixを設定することでタスクIDを付与したログストリームが作成可能
[OUTPUT] Name cloudwatch_logs # 新プラグイン指定 Match webapp-firelens* region ap-northeast-1 log_group_name /newplugin-cwlogs # オレンジ文字 log_stream_prefix app- # 赤文字 auto_create_group true
ログストリームの設定
なぜログストリームをタスクごとに作成したいのかは以下のリンクをご確認ください。
旧プラグインの設定おさらい
log_stream_nameにECSメタデータの変数($(ecs_task_id)
)を利用して、タスクごとのログストリームを指定していました。
[SERVICE] Flush 1 Grace 30 [FILTER] Name grep Match webapp-firelens* Exclude log ^(?=.*ELB-HealthChecker\/2\.0).*$ [OUTPUT] Name cloudwatch Match webapp-firelens* region ap-northeast-1 log_group_name /ecs/logs/$(ecs_cluster) log_stream_name webapp-$(ecs_task_id) auto_create_group true
タスクIDを付与されたログストリーム名が作成されます。タスクごとの個別ログストリームへログを保存でき、CloudWatch Logsのログストリームのスロットリングエラー発生を緩和させていました。
新プラグインの設定
ポイント
log_stream_name
をやめてlog_stream_prefix
で指定log_group_name
にECSメタデータの変数を使っていた場合はあきらめて置き換える
Amazon CloudWatch - Fluent Bit: Official Manual
[SERVICE] Flush 1 Grace 30 [FILTER] Name grep Match webapp-firelens* Exclude log ^(?=.*ELB-HealthChecker\/2\.0).*$ [OUTPUT] Name cloudwatch_logs Match webapp-firelens* region ap-northeast-1 log_group_name /newplugin-cwlogs log_stream_prefix app- auto_create_group true
タスクIDの付与されたログストリームが作成されました。log_stream_prefix
はapp-の指定しかしていませんでしたが、以下の様にいい感じに個別の名前付けてログストリームを作成してくれることがわかりました。
スケールアウト・インしてタスク数に増減があってもタスクごとにログストリームが作成されます。
おわりに
既存の設定ファイルからCloudWatch Logsの新プラグインを使った設定にするには修正が必要になるかもしれません。新規に設定ファイルを作成する場合は設定方法さえ知っていれば新プラグインで不都合なさそうです。
新プラグイン(cloudwatch_logs
)を使ってlog_stream_nameのままECSメタデータをタグを指定すると...
[OUTPUT] Name cloudwatch_logs Match webapp-firelens* region ap-northeast-1 log_group_name /newplugin-cwlogs log_stream_name webapp-$(ecs_task_id) auto_create_group true
なんとも言えないログストリーム名が作成されます。「ん?なんだこれ??」となった場合は、新・旧プラグイン(cloudwatch or cloudwatch_logs)の違いと、log_stream_nameとlog_stream_prefixの違いを見直してみてください。