AWS Fargate 上の Amazon ECS の複数の送信先にコンテナログを送信するにはどうすればよいですか?

最終更新日: 2020 年 8 月 27 日

AWS Fargate で実行されているアプリケーションコンテナのログを複数の送信先に転送しようと考えています。これらの送信先には、Amazon CloudWatch、Amazon Kinesis Data Firehose や Splunk である可能性があります。

簡単な説明

Amazon Elastic Container Service (Amazon ECS) タスク定義では、特定のコンテナに対して単一の log configuration オブジェクトのみを指定できます。つまり、ログを 1 つの送信先にのみ転送できます。Fargate の Amazon ECS で複数の送信先にログを転送するには、FireLens を利用できます。

注: FireLens は、Fluent Bit と Fluentd の両方のログフォワーダーで動作します。Fluent Bit は Fluentd よりもリソース効率が高いため、次の解決方法では Fluent Bit を考慮しています。

以下の点を考慮してください。

  • FireLens は、ECS タスク定義の logConfiguration オブジェクトでオプションとして指定されたキーと値のペアを使用して、Fluent Bit 出力定義を生成します。ログがルーティングされる送信先は、Fluent Bit 設定ファイルの [OUTPUT] 定義セクションで指定されます。詳細については、Fluent Bit ウェブサイトの出力を参照してください。
  • FireLens はユーザーに代わって設定ファイルを作成しますが、カスタム設定ファイルを指定することもできます。この設定ファイルは、Amazon Simple Storage Service (Amazon S3) でホストするか、カスタム出力設定ファイルを追加してカスタム Fluent Bit Docker イメージを作成できます。
  • Fargate の Amazon ECS を使用している場合、Amazon S3 から設定ファイルをプルすることはできません。プルするのではなく、設定ファイルを使用してカスタム Docker イメージを作成する必要があります。

解決方法

AWS Identity and Access Management (IAM) アクセス許可の作成

IAM アクセス許可を作成して、タスクロールがログをさまざまな送信先にルーティングできるようにします。例えば、送信先が Kinesis Data Firehose の場合、firehose:PutRecordBatch API を呼び出すアクセス許可をタスクに付与する必要があります。

注: Fluent Bit は、ログの送信先としていくつかのプラグインをサポートしています。CloudWatchKinesis ストリームなどの送信先に必要なアクセス許可には、logs:CreateLogGrouplogs:CreateLogStreamlogs:DescribeLogStreamslogs:PutLogEvents、および kinesis:PutRecords などがあります。

カスタム出力設定ファイルを使用して Fluent Bit Docker イメージを作成します。

1.    希望する [OUTPUT] 定義を作成して、logDestinations.conf というカスタム Fluent Bit 設定ファイルを作成します。例えば、次の設定ファイルには、CloudWatch、Kinesis Data Firehose、および Splunk 用に定義された設定が含まれています。

[OUTPUT]
    Name                firehose
    Match               YourContainerName*
    region              us-west-2
    delivery_stream     nginx-stream  
[OUTPUT]
    Name                cloudwatch
    Match               YourContainerName*
    region              us-east-1
    log_group_name      firelens-nginx-container
    log_stream_prefix   from-fluent-bit
    auto_create_group   true   
[OUTPUT]
    Name                splunk
    Match               <ContainerName>*
    Host                127.0.0.1
    Splunk_Token        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
    Splunk_Send_Raw     On

注: 異なる送信先には、[OUTPUT] 定義で異なるフィールドを指定する必要があります。例については、Amazon ECS FireLens の例を参照してください。

2.    次の Dockerfile の例を使用して、カスタム Fluent Bit 出力設定ファイルで Docker イメージを作成します。

FROM amazon/aws-for-fluent-bit:latest
ADD logDestinations.conf /logDestinations.conf

注: 詳細については、Docker ウェブサイトの Dockerfile リファレンスを参照してください。

3.    手順 2 で作成した Dockerfile を使用してカスタム fluent-bit Docker イメージを作成するには、次のコマンドを実行します。

docker build -t custom-fluent-bit:latest .

重要: 必ず、Dockerfile と同じ場所で docker build コマンドを実行してください。

4.    Docker イメージが Amazon ECS で利用できることを確認するには、Docker イメージを Amazon Elastic Container Registry (Amazon ECR) または独自の Docker レジストリにプッシュします。例えば、ローカルの Docker イメージを Amazon ECR にプッシュするには、次のコマンドを実行します。

docker push aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest

5.    タスク定義 (TaskDefinition) で、FireLens 設定 (firelensConfiguration) のオプションを更新します。例:

{
   "containerDefinitions":[
      {
         "essential":true,
         "image":"aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest",
         "name":"log_router",
         "firelensConfiguration":{
            "type":"fluentbit",
            "options":{
               "config-file-type":"file",
               "config-file-value":"/logDestinations.conf"
            }
         }
      }
   ]
}

FireLens 設定のオプションを更新する際は、以下の点を考慮してください。

カスタム設定ファイルを指定するには、FireLens 設定ファイルに config-file-type および config-file-value options を含める必要があります。これらのオプションを設定できるのは、AWS コマンドラインインターフェイス (AWS CLI) を使用してタスク定義を作成する場合のみです。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

有効な Amazon ECR イメージの場所を反映するには、設定の containerDefinition セクションの image プロパティを変更する必要があります。完全な registry/repository:tag 命名規則を使用して、Amazon ECR リポジトリでイメージを指定できます。例:

aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest

他のリポジトリを使用するには、タスク定義の image プロパティを参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?