HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

使用 AWS FireLens 轻松实现 AWS Fargate 容器日志处理

  • 2020-02-27
  • 本文字数:5194 字

    阅读完需:约 17 分钟

使用 AWS FireLens 轻松实现 AWS Fargate 容器日志处理

概述

AWS 容器服务团队在 2019 年 11 月推出了一款新工具 FireLens,该工具可以让您更轻松的处理容器日志。FireLens 可以与 FluentBit 或 Fluentd 搭配使用,这意味着您可以将日志发送到这些开源项目所支持的任意目标位置,并且您可以继续使用您的团队在这些开源项目上积累的丰富经验。


利用 FireLens,您可以将容器日志发送到所需的存储和分析工具,而无需修改应用部署脚本、手动安装额外软件或编写其他代码。一个常见的客户场景是,运行在容器中的应用会将访问日志和错误日志分别写入到不同的日志文件中,然后将不同日志文件的数据分别发送到不同的目标位置进行后续的分析和存储。在这篇文章中,我将演示如何通过配置 AWS Fargate for ECS 和 AWS FireLens,实现上述场景的日志处理。


整个环境的架构示意图如下,后续的演示均在中国宁夏区域进行。



我们使用 FireLens for Fluent Bit 作为 Sidecar 与应用容器运行在一个 Amazon ECS 任务中,应用容器将访问日志写入 /data/logs/access.log,错误日志写入 /data/logs/error.log,FireLens 分别收集这两个日志文件数据,并发送到不同的目标位置。为了方便演示,这篇文章使用两个 Amazon Kinesis Data Firehose 传输组,并发送到不同的 Amazon S3 存储桶。FireLens for Fluent Bit 支持将日志发送到:


  • Amazon CloudWatch Logs

  • Amazon Kinesis Data Firehose

  • Amazon Kinesis Data Streams

  • Fluent Bit 原生支持的所有目标

配置包括如下几个步骤:

  1. 创建 Fluent Bit 自定义配置文件

  2. 构建应用容器镜像和自定义的 Fluent Bit 容器镜像

  3. 创建 Amazon ECS 任务定义

  4. 创建 Amazon Kinesis Data Firehose 传输流和 S3 存储桶

  5. 运行 Amazon ECS 任务,查看日志发送结果

  6. 创建 Fluent Bit 自定义配置文件



FireLens 可以为您创建自动生成的配置文件,您也可以指定自定义配置文件。为了收集两个不同的日志文件并分别输出到指定位置,我们创建如下的自定义配置文件。


extra.conf


Json


[SERVICE]    Parsers_File /fluent-bit/parsers/parsers.conf    Flush 1    Grace 30
[INPUT] Name tail Path /data/logs/access.log Tag access
[INPUT] Name tail Path /data/logs/error.log Tag error
[FILTER] Name parser Match * Key_Name log Parser json Reserve_Data True
[OUTPUT] Name firehose Match access region cn-northwest-1 delivery_stream fluentbit-access
[OUTPUT] Name firehose Match error region cn-northwest-1 delivery_stream fluentbit-error
复制代码


 
复制代码


  1. 构建应用容器镜像和自定义的 Fluent Bit 容器镜



如果要使用 Fluent Bit 自定义配置文件,可以通过配置任务定义来实现,语法如下


Json


{   "containerDefinitions":[      {         "essential":true,         "image":"906394416424.dkr.ecr.us-west-2.amazonaws.com/aws-for-fluent-bit:latest",         "name":"log_router",         "firelensConfiguration":{            "type":"fluentbit",            "options":{               "config-file-type":"s3 | file",               "config-file-value":"arn:aws:s3:::mybucket/fluent.conf | filepath"            }         }      } ]}
复制代码


对于使用 EC2 启动类型的 Amazon ECS 任务来说,可以使用 AWS 提供的 Fluent Bit 容器镜像,将自定义配置放在 S3 上(上述 options 中配置为 “config-file-type”:”s3″, “config-file-value”:”arn:aws:s3:::mybucket/fluent.conf” 并修改为您实际的 S3 bucket ARN 和 Fluent Bit 自定义配置文件名),这种方式的好处是修改 Fluent Bit 配置时不需要重新构建容器镜像和修改任务定义。


对于使用 Fargate 启动类型的任务,目前仅支持 config-file-type 值为 file。因此我们需要构建自己的 Fluent Bit 容器镜像,并将 Fluent Bit 自定义配置文件打包到容器中(上述 options 中配置为 “config-file-type”:”file”, “config-file-value”:” /extra.conf”)。可以基于 AWS 提供的 AWS for Fluent Bit 镜像加入自定义配置即可。镜像 Dockerfile 如下:


Dockerfile:




复制代码


Json


FROM amazon/aws-for-fluent-bit:latestADD extra.conf /extra.conf
复制代码




复制代码




复制代码


在应用容器中,我们运行一个简单的 shell 脚本,不断的向 /data/logs/access.log 和 /data/logs/error.log 两个日志文件中写入 JSON 格式的日志。应用容器 Dockerfile 如下:


Dockerfile:


Json


FROM alpineRUN mkdir -p /data/logs/COPY testlog.sh /bin/ENTRYPOINT ["/bin/testlog.sh"]
复制代码


其中,testlog.sh 脚本内容为:


testlog.sh:


Json


#!/bin/sh
while :do echo "{\"server_date\":\"2020-01-19\",\"hostname\":\"ip-172-31-43-24.cn-northwest-1.compute.internal\",\"pid\":5404,\"method\":\"POST\",\"clientIP\":\"10.11.12.13\",\"countryCode\":\"ID\",\"url\":\"/v1/mail/list\",\"status\":\"200\",\"latency\":7,\"length\":24,\"userId\":9536605,\"code\":20001}" >> /data/logs/access.log echo "{\"server_date\":\"2020-01-19\",\"hostname\":\"ip-172-31-43-24.cn-northwest-1.compute.internal\",\"pid\":1000,\"method\":\"GET\",\"clientIP\":\"20.21.22.23\",\"countryCode\":\"ID\",\"url\":\"/v1/mail/list\",\"status\":\"500\",\"latency\":10,\"length\":12,\"userId\":1010001,\"code\":10001}" >> /data/logs/error.logsleep 10done
复制代码


__


构建完两个容器镜像后,上传到自己的 ECR 镜像仓库。


  1. 创建 Amazon ECS 任务定义



创建任务定义时,请注意以下几个配置:


  • 任务 IAM 角色


任务中的 FireLens 容器要将日志路由到 Kinesis Data Firehose,任务需要调用 firehose:PutRecordBatch API 的权限;另外,我们还配置了 FireLens 容器将 Fluent Bit 自身的日志发送到 CloudWatch Logs,以方便排错。因此,请为任务 IAM 角色添加以下权限


Json


{    "Version": "2012-10-17",    "Statement": [{            "Effect": "Allow",            "Action": [                "firehose:PutRecordBatch",                "logs:CreateLogGroup",                "logs:CreateLogStream",                "logs:PutLogEvents"            ],            "Resource": "*"        } ]}
复制代码


  • FireLens log_router 容器的 firelensConfiguration 配置


在 option 中指定自定义配置文件,格式如下


Json


"firelensConfiguration": {        "type": "fluentbit",        "options": {          "config-file-type": "file",          "config-file-value": "/extra.conf"        } }
复制代码


  • 应用容器的 logConfiguration 配置


指定 logConfiguration 的 logDriver 为 awsfirelens,由于我们使用自定义配置文件,因此不需要再配置 option


Json


"logConfiguration": {        "logDriver": "awsfirelens"},
复制代码


  • 为任务创建 Volume,并且挂载到应用容器和 FireLens 容器的 /data 位置,以便应用容器写入的日志能被 FireLens 容器以 tail 的方式读取到


完整的任务定义文件如下


taskdef-firelens.json:


Json


{  "family": "firelens-sample",  "executionRoleArn": "arn:aws-cn:iam::211271614989:role/ecsTaskExecutionRole",  "taskRoleArn": "arn:aws-cn:iam::211271614989:role/ecsTaskExecutionRole",  "containerDefinitions": [    {      "essential": true,      "name": "log_router",      "image": "211271614989.dkr.ecr.cn-northwest-1.amazonaws.com.cn/logdemo:fluent-bit-firehose",      "logConfiguration": {        "logDriver": "awslogs",        "options": {          "awslogs-group": "/ecs/firelens-sample",          "awslogs-region": "cn-northwest-1",          "awslogs-stream-prefix": "ecs"        }      },      "mountPoints": [        {          "readOnly": false,          "containerPath": "/data",          "sourceVolume": "data"        }      ],      "firelensConfiguration": {        "type": "fluentbit",        "options": {          "config-file-type": "file",          "config-file-value": "/extra.conf",          "enable-ecs-log-metadata": "false"        }      },      "user": "0"    },    {      "essential": true,      "name": "myapp",      "image": "211271614989.dkr.ecr.cn-northwest-1.amazonaws.com.cn/logdemo:myapp",      "logConfiguration": {        "logDriver": "awsfirelens"      },      "mountPoints": [        {          "readOnly": false,          "containerPath": "/data",          "sourceVolume": "data"        }      ]    }  ],  "cpu": "512",  "memory": "1024",  "volumes": [    {      "name": "data"    }  ],  "requiresCompatibilities": [    "FARGATE"  ],  "networkMode": "awsvpc"}
复制代码


注册任务定义到 Amazon ECS


Json


$ aws ecs register-task-definition --cli-input-json file://taskdef-firelens.json --region cn-northwest-1
复制代码


  1. 创建 Amazon Kinesis Firehose 传输流和 S3 存储桶



创建 Amazon S3 存储桶 firelens-access-log 和 firelens-error-log,以及两个 Amazon Kinesis Data Firehose 传输流 fluentbit-access 和 fluentbit-error(与 extra.conf 里保持一致),目标分别为 s3://firelens-access-log/ 和 s3://firelens-error-log/。



  1. 运行 Amazon ECS 任务,查看日志发送结果



使用步骤 3 中注册的任务定义运行任务


Json


$ aws ecs run-task --cli-input-json file://run-task.json --region cn-northwest-1
复制代码


其中,run-task.json 中包含了集群名称、任务数量、网络配置等参数,完整的文件如下


run-task.json:


Json


{                "cluster": "LogDemo",                "count": 1,                "networkConfiguration": {                 "awsvpcConfiguration": {          "subnets": ["subnet-05dd64715563df3c5", "subnet-0800bc5a26d1ba5a1"],          "securityGroups": ["sg-04d0ffc5e8bd605b1"],          "assignPublicIp": "ENABLED"                                }                },                "launchType": "FARGATE",                "taskDefinition": "firelens-sample:1"}
复制代码


创建任务后,您可以在控制台上看到任务的运行情况,以及 FireLens log_router 输出的日志(在任务定义中,我们配置了将 log_router 的日志输出到 CloudWatch Logs)。




Firehose 会将 access 和 error 日志分别发送到两个 S3 存储桶,通过命令行可以查看到两个存储桶里的日志情况 。默认情况下, Firehose 会将前缀“YYYY/MM/DD/HH”(UTC 时间) 附加到其发送到 Amazon S3 的数据中。您也可以通过指定一个自定义前缀覆盖此默认值。



分别下载两个日志文件,可以看到分别为 access.log 和 error.log 中的 JSON 日志数据。




需要说明的另外一点是,在任务定义中指定 FileLens 配置时,您可以选择性地切换 enable-ecs-log-metadata 的值。默认情况下,Amazon ECS 会在日志条目中添加其他字段来帮助标识日志源。如果不设置 enable-ecs-log-metadata 为 false,则日志条目中会包括以下元数据信息。


  • ecs_cluster – 任务所属的集群的名称。

  • ecs_task_arn – 容器所属的任务的完整 ARN。

  • ecs_task_definition – 任务正在使用的任务定义名称和修订。

  • ec2_instance_id – 容器托管于的 Amazon EC2 实例 ID。此字段仅对使用 EC2 启动类型的任务有效。


我们在步骤 3 创建任务定义的时候,将 enable-ecs-log-metadata 设置为了 false 来禁用元数据添加,因此从 S3 上获取的数据仅包括应用容器中的原始日志信息。


Json


"firelensConfiguration": {        "type": "fluentbit",        "options": {          "config-file-type": "file",          "config-file-value": "/extra.conf",          "enable-ecs-log-metadata": "false"        }      },
复制代码

结论

在这篇文章中,介绍了如何通过使用 AWS FireLens 实现对 Fargate 容器日志的轻松处理,将应用容器中不同路径的日志文件分别发送到不同的目标位置,进行后续的分析和存储。您还可以参考 Github 上的 amazon-ecs-firelens-examples,实现更加灵活多样的日志处理。

参考资料


作者介绍:郭勋,AWS 解决方案架构师,负责基于 AWS 的云计算方案的架构设计,同时致力于 AWS 云服务在移动应用与互联网行业的应用和推广,有十年的云计算和云管理平台解决方案架构经验。


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/easy-aws-fargate-container-log-processing-with-aws-firelens/


2020-02-27 16:22786

评论

发布
暂无评论
发现更多内容

React组件通信

xiaofeng

React

Nodejs:ESModule和commonjs,傻傻分不清

coder2028

node.js

华为云ECS,去除现代化企业服务器的数据安全忧虑

爱尚科技

一站式全覆盖数据 I/O 平台 - Alluxio 与 Aunalytics 的完美结合

Alluxio

分布式 presto Alluxio 大数据 开源 #开源

腾讯T4耗时36天整理出了:多线程+JVM+设计模式+Redis+MySQL

小二,上酒上酒

MySQL redis JVM 多线程

太厉害了!阿里年薪120W架构师整理的学习笔记,看完收获良多

小二,上酒上酒

Java 架构 微服务 高并发

来了!Spring Boot从入门到入土的私藏教程,不收藏你就亏了

小二,上酒上酒

spring springboot

React组件设计模式-纯组件,函数组件,高阶组件

xiaofeng

React

和至少为 K 的最短子数组

掘金安东尼

算法 10月月更

Webpack完整打包流程分析

Geek_02d948

webpack

今天终于知道 Redis 为什么要用跳跃表了

C++后台开发

redis 中间件 后端开发 跳表 C++开发

机器学习服务文本识别能力演进,大幅提升识别准确率

HarmonyOS SDK

机器学习

javascript 高级编程 之 Array 用法总结

hellocoder2029

JavaScript

京东T8连夜肝出的《JVM性能优化知识点》吊打所有提问的面试官

小二,上酒上酒

性能优化 JVM Java虚拟机

前端展示中实现批量标签动态生成

葡萄城技术团队

批量 BI 报表 商业智能 打印

在 Java 代码中来一段 JavaScript?聊聊 Flowable 中的脚本任务

江南一点雨

Java springboot workflow flowable

清华年薪百万大佬,带你深入JVM实战调优,看完还敢说你懂JVM

小二,上酒上酒

Java 马士兵

华为云ECS,弹性云服务器标杆,众多企业的共同选择

爱尚科技

javascript尾递归优化

hellocoder2029

JavaScript

Vue响应式依赖收集原理分析-vue高级必备

yyds2026

Vue

Go语言入门07—指针

良猿

Go golang 后端 10月月更

华为云ECS,弹性伸缩按需选择,让企业以更低成本享受云服务

爱尚科技

Vue中的diff算法深度解析

yyds2026

Vue

员工离职率高如何解决?

优秀

企业管理 员工离职

阿里架构师耗时三个月整理的 Spring实战笔记:入门到实战

小二,上酒上酒

spring

技术分享| 基于 Etcd 的分布式锁实现原理及方案

anyRTC开发者

分布式 etcd 存储系统

融云一站式「云市场」上线,携手生态伙伴,共建价值平台

融云 RongCloud

通讯协议 市场 CND

Nodejs相关ORM框架分析

coder2028

node.js

Webpack中的高级特性

Geek_02d948

webpack

华为云ECS,如何助力数字化企业创新发展

爱尚科技

太厉害了!GitHub上标星80K的微服务实战笔记,看完跪了

小二,上酒上酒

Java 微服务

使用 AWS FireLens 轻松实现 AWS Fargate 容器日志处理_容器_AWS_InfoQ精选文章