📄

AWS FireLens 入門

2025/02/28に公開

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 キーと値に対して操作を仕掛けていくことになります。

参考 URL

Progate Tech Blog

Discussion