AWS Fargate 上の Amazon ECS の複数の送信先にコンテナログを送信するにはどうすればよいですか?
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:CreateLogGroup、logs:CreateLogStream、logs:DescribeLogStreams、logs:PutLogEvents、kinesis:PutRecords などがあります。詳細については、GitHub のウェブサイトで CloudWatch と Kinesis に対するアクセス許可を参照してください。
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 ロググループに転送します。
- トピック
- Containers
- 言語
- 日本語

関連するコンテンツ
質問済み 2年前