如何将容器日志发送到 AWS Fargate 上 Amazon ECS 中的多个目的地?
上次更新时间:2020 年 8 月 27 日
我希望将 AWS Fargate 上运行的应用程序容器的日志转发到多个目的地。这些目的地可能是 Amazon CloudWatch、Amazon Kinesis Data Firehose 或 Splunk。
简短描述
Amazon Elastic Container Service (Amazon ECS) 任务定义允许您仅为给定容器指定单个日志配置对象,这意味着您只能将日志转发到单个目的地。要将日志转发到 Fargate 上 Amazon ECS 中的多个目的地,您可以使用 FirelLens。
注意:FirelLens 可与 Fluent Bit 和 Fluentd 日志转发器一起使用。以下解决方案考虑使用 Fluent Bit,因为 Fluent Bit 比 Fluentd 更具资源效率。
请考虑以下事项:
- FirelLens 使用 ECS 任务定义的 logConfiguration 对象中指定为选项的键值对生成 Fluent Bit 输出定义。将日志路由到的目的地在 Fluent Bit 配置文件的 [输出] 定义部分指定。有关详细信息,请参阅 Fluent Bit 网站上的输出。
- FirelLens 代表您创建配置文件,但您也可以指定自定义配置文件。您可以在 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 支持将多个插件作为日志目的地。CloudWatch 和 Kinesis 等目的地所需的权限包括 logs:CreateLogGroup、logs:CreateLogStream、logs:DescribeLogStreams、logs:PutLogEvents 和 kinesis:PutRecords。
使用自定义输出配置文件创建 Fluent Bit Docker 映像。
1. 创建一个名为 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
注意:不同的目的地需要在 [输出] 定义中指定不同的字段。有关示例,请参阅 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) 中,更新 FirelLens 配置 (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"
}
}
}
]
}
更新 FirelLens 配置的选项时,请考虑以下事项:
要指定自定义配置文件,您必须在 FirelLens 配置文件中包含 config-file-type 和 config-file-value 选项。您只能在使用 AWS 命令行界面 (AWS CLI) 创建任务定义时设置这些选项。
注意:如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI。
您必须修改配置的 containerDefinition 部分中的映像属性,才能反映有效的 Amazon ECR 映像位置。您可以使用完整的 registry/repository:tag 命名约定在 Amazon ECR 存储库中指定映像。例如:
aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest
要使用其他存储库,请参阅任务定义的映像属性。