カスタムログルーティング - Amazon ECS

カスタムログルーティング

FireLens for Amazon ECS では、タスク定義パラメータを使用してログを AWS のサービスや AWS パートナーネットワーク (APN) の宛先にルーティングし、ログを保存および分析できます。FireLens は Fluentd とFluent Bit と連携します。Fluent Bit イメージ用に AWS を提供していますが、Fluentd や Fluent Bit のイメージはご用意いただいたものを使用することもできます。

FireLens 設定を使用した Amazon ECS タスク定義の作成は、AWS SDK、AWS CLI、および AWS Management Console でサポートされています。

考慮事項

FireLens for Amazon ECS を使用する際は、以下の点を考慮してください。

  • FireLens for Amazon ECS は、Linux の AWS Fargate と Linux の Amazon EC2 の両方でホストされたタスクでサポートされます。Windows コンテナは FireLens をサポートしていません。

    Windows コンテナの集中ロギングを設定する方法については、「Centralized logging for Windows containers on Amazon ECS using Fluent Bit」(Fluent Bit を使用した Amazon ECS での Windows コンテナの集中ロギング) を参照してください。

  • Amazon ECS の FireLens は、AWS CloudFormation テンプレートでサポートされています。詳細については、AWS CloudFormation ユーザーガイドの「AWS::ECS::TaskDefinition FirelensConfiguration」を参照してください。

  • FireLens はポート 24224 でリッスンするため、FireLens ログルーターがタスク外に到達できないようにするには、タスクが使用するセキュリティグループでポート 24224 でのインバウンドトラフィックを許可してはなりません。awsvpc ネットワークモードを使用するタスクの場合、これは、そのタスクに関連付けられたセキュリティグループです。host ネットワークモードを使用するタスクでは、そのタスクをホストする Amazon EC2 インスタンスに関連付けられているセキュリティグループです。bridge ネットワークモードを使用するタスクの場合、ポート 24224 を使用するポートマッピングを作成しないでください。

  • bridge ネットワークモードを使用するタスクの場合、FireLens 設定のコンテナは、それに依存するアプリケーションコンテナが開始する前に開始する必要があります。コンテナの開始順序を制御するには、タスク定義の依存関係条件を使用します。詳細については、「コンテナの依存関係」を参照してください。

    注記

    FireLens 設定のコンテナ定義で依存関係条件パラメータを使用する場合は、各コンテナに START または HEALTHY 条件要件があることを確認してください。

  • デフォルトでは、FireLens はクラスターとタスクの定義名、およびクラスターの Amazon リソースネーム (ARN) をメタデータキーとして stdout/stderr コンテナログに追加します。メタデータ形式の例を次に示します。

    "ecs_cluster": "cluster-name", "ecs_task_arn": "arn:aws:ecs:region:111122223333:task/cluster-name/f2ad7dba413f45ddb4EXAMPLE", "ecs_task_definition": "task-def-name:revision",

    ログにメタデータを含めたくない場合は、タスク定義の「firelensConfiguration」セクションで enable-ecs-log-metadatafalse に設定します。

    "firelensConfiguration":{ "type":"fluentbit", "options":{ "enable-ecs-log-metadata":"false", "config-file-type":"file", "config-file-value":"/extra.conf" }

必要な IAM 許可

この機能を使用するには、タスク用の IAM ロールを作成し、AWS のサービスを使用するために必要なアクセス許可をタスクに付与する必要があります。例えば、コンテナから Kinesis Data Firehose にログをルーティングする場合、タスクには firehose:PutRecordBatch API を呼び出すためのアクセス許可が必要です。詳細については、IAM ユーザーガイドの「IAM ID アクセス許可の追加と削除」を参照してください。

次の IAM ポリシー例では、ログを Kinesis Data Firehose にルーティングするために必要なアクセス許可を追加します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecordBatch" ], "Resource": [ "*" ] } ] }

以下の場合は、タスクに Amazon ECS タスク実行ロールが必要になることもあります。詳細については、「Amazon ECS タスク実行IAM ロール」を参照してください。

  • タスクが Fargate でホストされていて、Amazon ECR からコンテナイメージをプルしたり、ログ設定で AWS Secrets Manager の機密データを参照したりする場合は、タスク実行 IAM ロールを含める必要があります。

  • Amazon S3 でホストされるカスタム設定ファイルを指定する場合、タスクの実行 IAM ロールには、設定ファイル用の s3:GetObject アクセス許可と、ファイルが格納されている Amazon S3 バケットに対する s3:GetBucketLocation アクセス許可を含める必要があります。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「ポリシーでのアクセス許可の指定」を参照してください。

    次の IAM ポリシー例では、Amazon S3 からファイルを取得するために必要なアクセス許可を追加します。Amazon S3 バケットの名前と設定ファイル名を指定します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::examplebucket/folder_name/config_file_name" ] }, { "Effect": "Allow", "Action": [ "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::examplebucket" ] } ] }

Fluentd バッファ制限

タスク定義を作成するときに、log-driver-buffer-limit で値 (バイト単位) を指定することにより、メモリにバッファリングされるイベント数を指定できます。詳細については、Docker ドキュメントの「Fluentd ロギングドライバー」を参照してください。

このオプションは、スループットが高いために Docker がバッファメモリを使い果たし、新しいメッセージを追加するためにバッファメッセージを破棄する可能性がある場合に使用します。ログが失われた場合、トラブルシューティングが困難になる可能性があります。バッファ制限を設定することで、この問題を防ぐのに役立つかもしれません。

以下に、log-driver-buffer-limit を指定するための構文を示します。

{ "containerDefinitions": [ { "essential": true, "image": "906394416424.dkr.ecr.us-west-2.amazonaws.com/aws-for-fluent-bit:stable", "name": "log_router", "firelensConfiguration": { "type": "fluentbit" }, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "firelens-container", "awslogs-region": "us-west-2", "awslogs-create-group": "true", "awslogs-stream-prefix": "firelens" } }, "memoryReservation": 50 }, { "essential": true, "image": "httpd", "name": "app", "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "firehose", "region": "us-west-2", "delivery_stream": "my-stream", "log-driver-buffer-limit": "2097152" } }, "dependsOn": [ { "containerName": "log_router", "condition": "START" } ], "memoryReservation": 100 } ] }

バッファ制限オプションを指定して FireLens for Amazon ECS を使用する場合は、以下の点を考慮してください。

  • このオプションは、Amazon EC2 起動タイプおよび プラットフォームバージョン 1.4.0 以降の Fargate 起動タイプでサポートされています。

  • このオプションは、logDriverawsfirelens に設定されている場合にのみ有効です。

  • デフォルトのバッファ制限は 1 MiB です。

  • 有効な値は 0 および 536870912 (512 MiB) です。

  • タスクレベルで割り当てられたメモリの合計量は、メモリバッファ制限に加えて、すべてのコンテナに割り当てられたメモリ量よりも大きくなければなりません。コンテナの memory 値と memoryReservertion 値を指定しない場合、指定するバッファメモリの合計量は 536870912 (512MiB) 未満である必要があります。具体的には、アプリケーションコンテナを awsfirelens ログドライバーと log-driver-buffer-limit オプションを 300 MiB に設定します。ただし、 log-driver-buffer-limit が 300 MiB (300 MiB × 2> 512 MiB) に設定されたコンテナが 2 つ以上ある場合、タスクを実行することはできません。

TCP 経由で Fluent ロガーライブラリまたは Log4j を使用する

awsfirelens ログドライバーがタスク定義で指定されている場合、Amazon ECS コンテナエージェントは次の環境変数をコンテナに挿入します。

FLUENT_HOST

FireLens コンテナに割り当てられた IP アドレス。

FLUENT_PORT

Fluent Forward プロトコルがリッスンしているポート。

FLUENT_HOST 環境変数および FLUENT_PORT 環境変数を使用すると、stdout を介することなく、コードからログルーターに直接ログを記録できます。詳細については、GitHub の「flluent-logger-golang」 を参照してください。

トピック