自定义日志路由 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

自定义日志路由

您可以使用适用于 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 的任务。Amazon Fargate 上的 Windows 容器不支持 FireLens。

  • 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 配置结合使用,请确保每个容器均具有 STARTHEALTHY 条件要求。

  • 经 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。

  • 有效值为 0536870912(512 MiB)。

  • 除了内存缓冲区限制外,在任务级别分配的内存总量必须大于为所有容器分配的内存量。当您不指定容器 memorymemoryReservertion 值时,指定的缓冲区内存总量必须少于 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_HOSTFLUENT_PORT 环境变量直接从代码登录到日志路由器,而不是通过 stdout。有关更多信息,请参阅 GitHub 上的 fluent-logger-golang

主题