本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用自定义日志路由
您可以使用 FireLens Amazon ECS 使用任务定义参数将日志路由到 Amazon
服务或 Amazon Partner Network (APN) 目标以进行日志存储和分析。 Amazon Partner Network 是一个由合作伙伴组成的全球社区,它利用计划、专业知识和资源来构建、营销和销售客户产品。有关更多信息,请参阅 Amazon Partner
注意事项
在 Amazon ECS 上使用时 FireLens ,请考虑以下几点:
-
我们建议您在日志容器名称中添加
my_service_
内容,以便在控制台中轻松区分容器名称。 -
默认情况下,Amazon ECS 在应用程序容器和容器之间添加了启动FireLens容器顺序依赖关系。当您在应用程序容器和容器之间指定容器顺序时,默认的启动容器顺序将被覆盖。FireLens
-
FireLensfor Amazon ECS 支持同时托管在 Linux 上和 Linux Amazon Fargate 上的 Amazon EC2 上的任务。Windows 容器不支持 FireLens。
有关如何为 Windows 容器配置集中日志记录的信息,请参阅使用 Fluent Bit 在 Amazon ECS 上对 Windows 容器进行集中日志记录
。 -
FireLens适用于 Amazon ECS 的 Amazon CloudFormation 模板支持。有关更多信息,请参阅《Amazon CloudFormation 用户指南》AWS::ECS::TaskDefinition FirelensConfiguration中的
-
FireLens监听端口
24224
,因此为了确保任务之外无法访问 FireLens 日志路由器,您不得允许任务使用的安全组24224
中的端口上的入站流量。对于使用awsvpc
网络模式的任务,这是与任务关联的安全组。对于使用host
网络模式的任务,它是与托管任务的 Amazon EC2 实例关联的安全组。对于使用bridge
网络模式的任务,请勿创建任何使用端口24224
的端口映射。 -
对于使用
bridge
网络模式的任务,具有该 FireLens 配置的容器必须在依赖它的应用程序容器启动之前启动。要控制容器的启动顺序,请在任务定义中使用依赖条件。有关更多信息,请参阅 容器依赖项。注意
如果您在容器定义中使用依赖条件参数和 FireLens 配置,请确保每个容器都有
START
或HEALTHY
条件要求。 -
默认情况下,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 服务所需的权限。例如,如果容器正在将日志路由到 Firehose,则该任务需要获得调用 API 的firehose:PutRecordBatch
权限。有关更多信息,请参阅 IAM用户指南中的添加和删除 IAM 标识权限。
以下示例 IAM 策略添加了将日志路由到 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-limit
。my_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。 -
有效值为
0
和536870912
(512 MiB)。 -
除了内存缓冲区限制外,在任务级别分配的内存总量必须大于为所有容器分配的内存量。当您不指定容器
memory
和memoryReservation
值时,指定的缓冲区内存总量必须少于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_HOST
和 FLUENT_PORT
环境变量直接从代码登录到日志路由器,而不是通过 stdout
。有关更多信息,请参阅fluent-logger-golang