AWS FireLens 入門
AWS FireLens とは
AWS のサービスではなく、ECS のログルーティング機能
AWS FireLens は ECS (Elastic Container Service) で使えるログを操作することができる機能の名称です。ECS を使う中でログの出力先を標準の CloudWatch Logs 以外にしたり、加工してから転送したりする際に、FireLens を使うと便利です。
AWS FireLens は Fluentd または Fluent Bit を利用している
ログルータの機能として Fluentd または Fluent Bit を利用可能です。AWS 公式ドキュメントではそのリソース使用効率の観点から Fluent Bit を推奨しています。それゆえ、Fluent Bit の設定や Lua スクリプトを活用することで複雑なログの処理を行えます。
使い方
[MUST] ログの出力先を標準出力・標準エラー出力にする
例として、メインのコンテナとして Rails アプリを稼働させて確認します。
以下のようにログの出力先を、ファイルではなく、標準出力 (STDOUT
) または標準エラー出力 (STDERR
) を指定しておきます。
# config/environments/production.rb
Rails.Application.configure do
config.logger = ActiveSupport::Logger.new(STDOUT)
.tap { |logger| logger.formatter = ::Logger::Formatter.new }
.then { |logger| ActiveSupport::TaggedLogging.new(logger) }
end
# app/controllers/books_controller.rb
class BooksController < ApplicationController
def index
logger.info("This is info log.")
end
end
[MUST] タスク定義にて log_router コンテナを作成する
メインのコンテナの「ログ収集」にて「AWS FireLens 経由で xxx にログをエクスポートする」を選ぶことで自動的に必要な設定が表示されます。
たとえば、Amazon Data Firehose に送信する場合はそのままリージョンとストリーム名を指定するだけで OK です。
メインのコンテナとは別にログルーティング用のコンテナが追加されています。
タスク定義 JSON
メインのコンテナのタスク定義 JSON としては以下のようになっています。
...
"logConfiguration": {
"logDriver": "awsfirelens",
"options": {
"Name": "firehose",
"region": "ap-northeast-1",
"delivery_stream": "my-stream",
"log-driver-buffer-limit": "1048576"
}
},
...
AWS が用意してくれている転送先
- Amazon Data Firehose (旧 Amazon Kinesis Data Firehose)
- Amazon Kinesis
- Amazon OpenSearch Service (旧 Amazon Elasticsearch Service)
- Amazon S3
これらの送信先を転送先とする場合は、特に苦労することなく、タスク定義のみの記述でログを転送することができます。タスクロールに指定する IAM ロールに、対応する転送先の権限を与えておく必要があるので注意です。
[SHOULD] ログの中身を知る
awsfirelens
ログドライバのパワーで、メインのコンテナの標準出力と標準エラー出力に出力されるログ内容は、同一タスク内に同居する log_router コンテナへと送信されていきます。
このとき、JSON フォーマットへと変換されつついくつかのメタデータが付与されるので、最終的に以下のようなログの内容となっています。
{"ecs_cluster":"mycluster","ecs_task_arn":"arn:aws:ecs:ap-northeast-1:123456789012:task/mycluster/f527b16598e02c23b244ed6bc605e895","ecs_task_definition":"mycluster-web:34","container_id":"413d8ae37d5b68e244ee7773f5c3229a-543406c14c","container_name":"web","log":"I, [2025-02-28T01:37:44.918199 #28] INFO -- : This is info log.","source":"stdout"}
整形して、↓
{
"ecs_cluster": "mycluster",
"ecs_task_arn": "arn:aws:ecs:ap-northeast-1:123456789012:task/mycluster/f527b16598e02c23b244ed6bc605e895",
"ecs_task_definition": "mycluster-web:34",
"container_id": "413d8ae37d5b68e244ee7773f5c3229a-543406c14c",
"container_name": "web",
"log": "I, [2025-02-28T01:37:44.918199 #28] INFO -- : This is info log.",
"source": "stdout"
}
log
というキーの値に本来のログ内容が収められていて、更に後続の処理でいろいろなことをする際にはこの log
キーと値に対して操作を仕掛けていくことになります。
Discussion