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 を使用します。
解決策
前提条件:
次の情報を確認します。
- 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 イメージを作成する必要があります。
IAM アクセス許可の作成
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。
AWS Identity and Access Management (IAM) アクセス許可を作成して、多スクロールがログをさまざまな送信先にルーティングできるようにします。たとえば、送信先が Data Firehose の場合、firehose:PutRecordBatch API を呼び出すアクセス許可をタスクに付与する必要があります。
**注:**Fluent Bit は、ログの送信先としていくつかのプラグインをサポートしています。CloudWatch や Kinesis ストリームなどの送信先に必要な許可には、logs:CreateLogGroup、logs:CreateLogStream、logs:DescribeLogStreams、logs:PutLogEvents、kinesis:PutRecords などがあります。詳細については、GitHub ウェブサイトの CloudWatch と Kinesis のアクセス許可を参照してください。
カスタム出力設定ファイルを使用して Fluent Bit Docker イメージを作成する
-
希望する [OUTPUT] 定義を作成して、logDestinations.conf というカスタム Fluent Bit 設定ファイルを作成します。たとえば、次の設定ファイルには、CloudWatch、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] 定義で異なるフィールドを指定する必要があります。例については、GitHub ウェブサイトの amazon-ecs-firelens-examples を参照してください。
-
次の Dockerfile 例を使用して、カスタム Fluent Bit 出力設定ファイルで Docker イメージを作成します。
FROM amazon/aws-for-fluent-bit:latestADD logDestinations.conf /logDestinations.conf
**注:**詳細については、Docker ウェブサイトの Dockerfile リファレンス を参照してください。
-
作成した Dockerfile を使用してカスタム fluent-bit Docker イメージを作成するには、次のコマンドを実行します。
docker build -t custom-fluent-bit:latest .
**重要:**Dockerfile と同じ場所で docker build コマンドを実行してください。
-
Docker イメージが Amazon ECS で利用できることを確認するには、Docker イメージを Amazon Elastic Container Registry (Amazon ECR) にプッシュします。または、Docker イメージを独自の Docker レジストリにプッシュします。たとえば、ローカルの Docker イメージを Amazon ECR にプッシュするには、次のコマンドを実行します。
docker push aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest
-
タスク定義で、FireLens configuration のオプションを更新します。
{
"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 設定ファイルに config-file-type オプションと config-file-value オプションを含める必要があります。これらのオプションを含めるには、the AWS CLI または Amazon ECS コンソールを使用してタスク定義を作成します。
-
有効な Amazon ECR イメージの場所を反映するには、設定の containerDefinition セクションの image プロパティを変更します。Amazon ECR リポジトリ内のイメージを指定するには、完全な registry/repository:tag 命名規則を使用します。例:
aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest
他のリポジトリを使用するには、タスク定義の image プロパティを参照してください。