如何将容器日志发送到 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 支持将多个插件作为日志目的地。CloudWatchKinesis 等目的地所需的权限包括 logs:CreateLogGrouplogs:CreateLogStreamlogs:DescribeLogStreamslogs:PutLogEventskinesis: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-typeconfig-file-value 选项。您只能在使用 AWS 命令行界面 (AWS CLI) 创建任务定义时设置这些选项

您必须修改配置的 containerDefinition 部分中的映像属性,才能反映有效的 Amazon ECR 映像位置。您可以使用完整的 registry/repository:tag 命名约定在 Amazon ECR 存储库中指定映像。例如:

aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest

要使用其他存储库,请参阅任务定义的映像属性。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?