自定义日志路由
您可以使用适用于 Amazon ECS 的 FireLens 来使用任务定义参数将日志路由到 Amazon 服务或 Amazon 合作伙伴网络(APN)目标来进行日志存储和分析。FireLens 与 Fluentd 和 Fluent Bit 结合使用。我们提供 Amazon for Fluent Bit 映像,您也可以使用自己的 Fluentd 或 Fluent Bit 映像。
支持通过 Amazon 开发工具包、Amazon CLI 和 Amazon Web Services Management Console 使用 FireLens 配置创建 Amazon ECS 任务定义。
注意事项
使用 FireLens for Amazon ECS 时考虑以下事项:
-
支持将适用于 Amazon ECS 的 FireLens 用于托管在 Linux 上的 Amazon Fargate 和 Amazon EC2 的任务。Windows 容器不支持 FireLens。
有关如何为 Windows 容器配置集中日志记录的信息,请参阅使用 Fluent Bit 在 Amazon ECS 上对 Windows 容器进行集中日志记录
。 -
Amazon CloudFormation 模板中支持 FireLens for Amazon ECS。有关更多信息,请参阅 Amazon CloudFormation 用户指南中的 AWS::ECS::TaskDefinition FirelensConfiguration
-
FireLens 在端口
24224
上侦听,因此为了确保从任务外部无法访问 FireLens 日志路由器,不得允许任务使用的安全组中端口24224
上的入站流量。对于使用awsvpc
网络模式的任务,这是与任务关联的安全组。对于使用host
网络模式的任务,它是与托管任务的 Amazon EC2 实例关联的安全组。对于使用bridge
网络模式的任务,请勿创建任何使用端口24224
的端口映射。 -
对于使用
bridge
网络模式的任务,具有 FirelLens 配置的容器必须在依赖它的任何应用程序容器启动之前启动。要控制容器的启动顺序,请在任务定义中使用依赖条件。有关更多信息,请参阅容器依赖项。注意
如果您将容器定义中的依赖条件参数与 FirelLens 配置结合使用,请确保每个容器均具有
START
或HEALTHY
条件要求。 -
经 Amazon ECS 优化的 Bottlerocket AMI 不支持 FireLens。
-
默认情况下,FireLens 将集群和任务定义名称以及集群的 Amazon 资源名称(ARN)作为元数据键添加到您的 stdout/stderr 容器日志中。以下为元数据格式的示例。
"ecs_cluster": "
cluster-name
", "ecs_task_arn": "arn:aws:ecs:region
:111122223333
:task/cluster-name
/f2ad7dba413f45ddb4EXAMPLE
", "ecs_task_definition": "task-def-name:revision",如果您不希望日志中出现元数据,请在任务定义的
firelensConfiguration
部分中将enable-ecs-log-metadata
设置为false
。"firelensConfiguration":{ "type":"fluentbit", "options":{ "enable-ecs-log-metadata":"false", "config-file-type":"file", "config-file-value":"/extra.conf" }
所需的 IAM 权限
要使用此功能,您必须为您的任务创建一个 IAM 角色,该角色提供使用任务需要的任何 Amazon 服务所需的权限。例如,如果容器将日志路由到 Kinesis Data Firehose,则任务需要调用 firehose:PutRecordBatch
API 的权限。有关更多信息,请参阅 IAM用户指南中的添加和删除 IAM 标识权限。
以下示例 IAM policy 添加了将日志路由到 Kinesis Data Firehose 所需的权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "
firehose:PutRecordBatch
" ], "Resource": [ "*" ] } ] }
在以下条件下,您的任务也可能需要 Amazon ECS 任务执行角色。有关更多信息,请参阅Amazon ECS 任务执行 IAM 角色。
-
如果在 Fargate 上托管您的任务,并且您正在从 Amazon ECR 提取容器映像或 Amazon Secrets Manager 在日志配置中引用敏感数据,那么您必须包含任务执行 IAM 角色。
-
如果您指定托管于 Amazon S3 中的自定义配置文件,则您的任务执行 IAM 角色必须包括对配置文件的
s3:GetObject
权限以及对该文件所在的 Amazon S3 存储桶的s3:GetBucketLocation
权限。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的在策略中指定权限。以下示例 IAM policy 添加了从 Amazon S3 中检索文件所需的权限。指定 Amazon S3 存储桶的名称和配置文件名称。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "
s3:GetObject
" ], "Resource": [ "arn:aws:s3:::examplebucket
/folder_name
/config_file_name
" ] }, { "Effect": "Allow", "Action": [ "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::examplebucket
" ] } ] }
Fluentd 缓冲区限制
创建任务定义时,您可以通过在 log-driver-buffer-limit
中指定值(以子节为单位)来指定内存中缓冲的事件数量。有关更多信息,请参阅 Docker 文档中的 Fluentd 日志记录驱动程序
当吞吐量高时使用此选项,因为 Docker 可能会耗尽缓冲区内存并丢弃缓冲区消息,以便添加新消息。丢失日志可能会造成故障排除困难。设置缓冲区限制可能有助于防止此问题。
下面说明指定 log-driver-buffer-limit
的语法:
{ "containerDefinitions": [ { "essential": true, "image": "906394416424.dkr.ecr.us-west-2.amazonaws.com/aws-for-fluent-bit:stable", "name": "log_router", "firelensConfiguration": { "type": "fluentbit" }, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "firelens-container", "awslogs-region": "us-west-2", "awslogs-create-group": "true", "awslogs-stream-prefix": "firelens" } }, "memoryReservation": 50 }, { "essential": true, "image": "httpd", "name": "app", "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "firehose", "region": "us-west-2", "delivery_stream": "my-stream", "log-driver-buffer-limit": "2097152" } }, "dependsOn": [ { "containerName": "log_router", "condition": "START" } ], "memoryReservation": 100 } ] }
将 FireLens for Amazon ECS 与缓冲区限制选项结合使用时考虑以下事项:
-
Amazon EC2 启动类型和带平台版本
1.4.0
或更高版本的 Fargate 启动类型支持此选项。 -
该选项仅在
logDriver
设置为awsfirelens
时有效。 -
默认缓冲区限制为
1
MiB。 -
有效值为
0
和536870912
(512 MiB)。 -
除了内存缓冲区限制外,在任务级别分配的内存总量必须大于为所有容器分配的内存量。当您不指定容器
memory
和memoryReservertion
值时,指定的缓冲区内存总量必须少于536870912
(512MiB)。更具体地说,您可以拥有一个带有awsfirelens
日志驱动程序的应用程序容器,并且log-driver-buffer-limit
选项设置为 300MiB。但是,如果您有两个以上log-driver-buffer-limit
被设置为 300MiB(300MiB * 2 > 512MiB)的容器,将不允许运行任务。
通过 TCP 使用 Fluent 记录器库或 Log4j
在任务定义中指定 awsfirelens
日志驱动程序时,Amazon ECS 容器 代理会将以下环境变量注入容器中:
FLUENT_HOST
-
分配给 FirelLens 容器的 IP 地址。
FLUENT_PORT
-
Fluent Forward 协议正在侦听的端口。
您可以使用 FLUENT_HOST
和 FLUENT_PORT
环境变量直接从代码登录到日志路由器,而不是通过 stdout
。有关更多信息,请参阅 GitHub 上的 fluent-logger-golang