スキップしてコンテンツを表示

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

所要時間3分
0

AWS Fargate で実行されているアプリケーションコンテナで、Amazon CloudWatch、Amazon Data Firehose、Splunk などの複数の送信先にログを転送したいと考えています。

簡単な説明

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

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

解決策

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

始める前に、次のことを理解しておいてください。

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

Fluent Bit カスタム出力設定ファイルを作成して Amazon S3 にアップロードする

希望する [OUTPUT] 定義を作成して、logDestinations.conf というカスタム Fluent Bit 設定ファイルを作成します。例えば、設定ファイルには、CloudWatch、Amazon Data Firehose、Splunk 用に定義された設定が含まれています。Match ディレクティブはデータをルーティングします。Amazon ECS は Fluent Bit 設定を読み込むと、コンテナ名のプレフィックスが付いた自動生成された名前を入力ストリームにタグ付けします。この例では、service というプレフィックスが使用されています。

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

注: 複数の送信先には、[OUTPUT] 定義で別々のフィールドを指定する必要があります。例については、GitHub ウェブサイトの amazon-ecs-firelens-examples を参照してください。

このファイルを、お客様が管理している Amazon S3 バケットにアップロードするには、AWS CLI cp コマンドを実行します。

aws s3 cp logDestinations.conf s3://example-bucket/logDestinations.conf

IAM アクセス許可の作成

AWS Identity and Access Management (IAM) アクセス許可を作成して、タスクロールが S3 設定ファイルを取得できるようにします。タスクロールがログをさまざまな送信先にルーティングできるようにします。たとえば、送信先が Amazon Data Firehose の場合、firehose:PutRecordBatch API を呼び出すアクセス許可をタスクに付与する必要があります。

注: Fluent Bit は、ログの送信先としてプラグインをサポートしています。CloudWatch や Kinesis などの送信先に必要な許可には、logs:CreateLogGrouplogs:CreateLogStreamlogs:DescribeLogStreamslogs:PutLogEventskinesis:PutRecords などがあります。詳細については、GitHub のウェブサイトで CloudWatchKinesis に対するアクセス許可を参照してください。

IAM ポリシーの例では、タスクロールは s3:GetObject に設定ファイルへのアクセス権を付与します。タスク自身の出力を別の CloudWatch ロググループに記録するために必要なアクセス許可をタスクに付与するのがベストプラクティスです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ConfigurationFileAccess",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::example-bucket/logDestinations.conf"
    },
    {
      "Sid": "CloudWatchLogGroupPermissions",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-log-router"
    },
    {
      "Sid": "CloudWatchLogStreamPermissions",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-log-router:log-stream:*"
    }
  ]
}

注: タスクの IAM ロールと必要なアクセス許可の作成方法の詳細については、「Amazon ECS タスク実行 IAM ロール」を参照してください。

この IAM タスクロールの例では、送信先で使用されている CloudWatch および Amazon Data Firehose ドライバーに必要なアクセス許可を付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DataFirehosePermissions",
      "Action": [
        "firehose:PutRecordBatch"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:firehose:us-west-2:555555555555:deliverystream/nginx-stream"
    },
    {
      "Sid": "CloudWatchLogGroupPermissions",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-nginx-container"
    },
    {
      "Sid": "CloudWatchLogStreamPermissions",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-nginx-container:log-stream:*"
    }
  ]
}

タスク定義を作成する

タスク定義に AWS for Fluent Bit イメージを使用して、重要なコンテナを追加してください。この例では公式の nginx コンテナを実行します。AWS CLI または Amazon ECS コンソールを使用して、完全なタスク定義を作成します。

{
    "family": "firelens-example-task",
    "taskRoleArn": "arn:aws:iam::012345678901:role/exampleTaskRole",
    "taskExecutionRoleArn": "arn:aws:iam::444455556666:role/exampleTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "256",
    "memory": "512",
    "containerDefinitions": [
        {
            "essential": true,
            "image": "public.ecr.aws/docker/library/nginx:latest",
            "name": "service_web_app",
            "logConfiguration": {
                "logDriver": "awsfirelens"
            }
        },
        {
            "essential": true,
            "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable",
            "name": "log_router",
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "firelens-log-router",
                    "awslogs-region": "us-east-1",
                    "awslogs-create-group": "true",
                    "awslogs-stream-prefix": "firelens-router-logs"
                }
            },
            "firelensConfiguration": {
                "type": "fluentbit",
                "options": {
                    "config-file-type": "s3",
                    "config-file-value": "arn:aws:s3:::example-bucket/logDestinations.conf"
                }
            }
        }
    ]
}

注: 問題のトラブルシューティングを行うために、この設定例では、Fluent Bit コンテナの出力を別のプレフィックスのある CloudWatch ロググループに転送します。

AWS公式更新しました 9ヶ月前