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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用自定义日志路由

您可以使用 FireLens Amazon ECS 使用任务定义参数将日志路由到Amazon服务或 Amazon Partner Network (APN) 目标以进行日志存储和分析。Amazon Partner Network 是一个由合作伙伴组成的全球社区,它利用计划、专业知识和资源来构建、营销和销售客户产品。有关更多信息,请参阅 Amazon Partner。FireLens 与 Fluentd 和 Fluent Bit 结合使用。我们提供 Amazon for Fluent Bit 映像,您也可以使用自己的 Fluentd 或 Fluent Bit 映像。

注意事项

在 Amazon ECS 上使用时 FireLens ,请考虑以下几点:

  • 我们建议您在日志容器名称中添加my_service_内容,以便在控制台中轻松区分容器名称。

  • 默认情况下,Amazon ECS 在应用程序容器和容器之间添加了启动FireLens容器顺序依赖关系。当您在应用程序容器和容器之间指定容器顺序时,默认的启动容器顺序将被覆盖。FireLens

  • 支持将适用于 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网络模式的任务,具有该 FireLens 配置的容器必须在依赖它的应用程序容器启动之前启动。要控制容器的启动顺序,请在任务定义中使用依赖条件。有关更多信息,请参见 容器依赖项

    注意

    如果您在容器定义中使用依赖条件参数和 FireLens 配置,请确保每个容器都有STARTHEALTHY条件要求。

  • 默认情况下,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": [ "*" ] } ] }

以下示例 IAM 策略添加了将日志路由到 Amazon CloudWatch 日志所需的权限。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents" ], "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-limitmy_service_用您的服务名称替换。 :

{ "containerDefinitions": [ { "essential": true, "image": "906394416424.dkr.ecr.us-west-2.amazonaws.com/aws-for-fluent-bit:stable", "name": "my_service_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 的 Amazon ECS 时,请考虑以下几点:

  • Amazon EC2 启动类型和带平台版本 1.4.0 或更高版本的 Fargate 启动类型支持此选项。

  • 该选项仅在 logDriver 设置为 awsfirelens 时有效。

  • 默认缓冲区限制为 1 MiB。

  • 有效值为 0536870912(512 MiB)。

  • 除了内存缓冲区限制外,在任务级别分配的内存总量必须大于为所有容器分配的内存量。当您不指定容器 memorymemoryReservation 值时,指定的缓冲区内存总量必须少于 536870912(512MiB)。更具体地说,您可以拥有一个带有 awsfirelens 日志驱动程序的应用程序容器,并且 log-driver-buffer-limit 选项设置为 300MiB。但是,如果您有两个以上 log-driver-buffer-limit 被设置为 300MiB(300MiB * 2 > 512MiB)的容器,将不允许运行任务。

通过 TCP 使用 Fluent 记录器库或 Log4j

在任务定义中指定 awsfirelens 日志驱动程序时,Amazon ECS 容器 代理会将以下环境变量注入容器中:

FLUENT_HOST

分配给 FireLens 容器的 IP 地址。

FLUENT_PORT

Fluent Forward 协议正在侦听的端口。

您可以使用 FLUENT_HOSTFLUENT_PORT 环境变量直接从代码登录到日志路由器,而不是通过 stdout。有关更多信息,请参阅fluent-logger-golang上的 GitHub。

主题