参考:

  • Amazon ECS FireLens Examples
  • 用于 Amazon ECS 任务的 FireLens
  • 自定义日志路由
  • AWS Container Logging Deep Dive: FireLens, Fluentd, and Fluent Bit
  • 使用 AWS FireLens 轻松实现 AWS Fargate 容器日志处理

aws firelens

firelens是ecs平台上容器独有的log driver,firelens可以和 fluentbit 和 fluentd 集成(实际上还是使用fluentbit容器对日志进行处理),将fluentbit托管在firelens下能够更好地和aws service集成,并且更灵活地进行配置。

值得一提的是,firelens官方提供的example比较全面,降低了配置难度

FireLens for Fluent Bit 支持将日志发送到:

  • Amazon CloudWatch Logs
  • Amazon Kinesis Data Firehose
  • Amazon Kinesis Data Streams
  • Fluent Bit 原生支持的所有目标

FireLens 在端口 24224 上侦听,因此为了确保从任务外部无法访问 FireLens 日志路由器,不得允许任务使用的安全组中端口 24224 上的入站流量。对于使用 awsvpc 网络模式的任务,这是与任务关联的安全组。对于使用 host 网络模式的任务,它是与托管任务的 Amazon EC2 实例关联的安全组。对于使用 bridge 网络模式的任务,请勿创建任何使用端口 24224 的端口映射。

注意事项:

  • windows不支持firelens

  • FireLens 在端口 24224 上侦听,需要确保任务外部无法访问此端口(安全组)

  • 默认情况下,FireLens 将 集群、任务定义名称、集群的ARN 作为元数据键添加到 stdout/stderr 容器日志中,可以不配置

    "firelensConfiguration":{"type":"fluentbit","options":{"enable-ecs-log-metadata":"false","config-file-type":"file","config-file-value":"/extra.conf"
    }
    
  • 如果需要获取ecr或者secret manager需要配置taskexecrole

  • 如果配置从s3获取配置文件,需要s3的相关权限

配置ecs任务

使用python的bootle创建简单的web server

from bottle import route, error, get
import loggingdef logger_config(log_path,logging_name):logger = logging.getLogger(logging_name)logger.setLevel(level=logging.DEBUG)handler = logging.FileHandler(log_path, encoding='UTF-8')handler.setLevel(logging.INFO)formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)console = logging.StreamHandler()console.setLevel(logging.DEBUG)logger.addHandler(handler)logger.addHandler(console)return loggerlogger = logger_config("infolog.txt","test-log-info")@route('/log')
def mylog():logger.info("info")logger.error("error")logger.debug("debug")logger.warning("warning")@get('/')
def health():return 'success'@error(404)
def error404(error):return 'Nothing here, sorry'run(host='0.0.0.0', port=8090)

将脚本打包上传到ecr中

FROM python:latest
WORKDIR /opt/web
COPY . .
EXPOSE 80
ENTRYPOINT python ./web.py

创建任务定义引用如下,创建服务启动即可(这里使用ec2平台,便于查看容器)

{"name": "myweb","image": "xxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/xxxxxx","executionRoleArn": "arn:aws-cn:iam::xxxxxxxxxx:role/ecsTaskExecutionRole","containerDefinitions": [{// 指定业务容器地日志驱动为awsfirelens"logConfiguration": {"logDriver": "awsfirelens","options": {"log_group_name": "/aws/ecs/containerinsights/$(ecs_cluster)/application","log_stream_name": "$(ecs_task_id)","auto_create_group": "true","log_key": "log","region": "cn-north-1","Name": "cloudwatch","retry_limit": "2"}},// 容器暴露8090端口"portMappings": [{"hostPort": 0,"protocol": "tcp","containerPort": 80}],// 挂载日志卷"mountPoints": [{"readOnly": null,"containerPath": "/opt/web/","sourceVolume": "var-log"}]},{"name": "log_router","image": "128054284489.dkr.ecr.cn-north-1.amazonaws.com.cn/aws-for-fluent-bit:latest",// 配置firelens类型为fluentbit,配置文件位置为/configs/extra-myweb.conf"firelensConfiguration": {"type": "fluentbit","options": {"config-file-type": "file","config-file-value": "/configs/extra-myweb.conf"}},// 将fluentbit本身的日志发送到/ecs/myweb日志组"logConfiguration": {"logDriver": "awslogs","secretOptions": null,"options": {"awslogs-group": "/ecs/myweb","awslogs-region": "cn-north-1","awslogs-stream-prefix": "ecs"}},"mountPoints": [// 挂载firelens-conf卷到/configs下{"readOnly": null,"containerPath": "/configs","sourceVolume": "firelens-conf"},// 挂载日志卷{"readOnly": null,"containerPath": "/opt/web/","sourceVolume": "var-log"}]}],"volumes": [// 创建efs卷存放配置文件{"fsxWindowsFileServerVolumeConfiguration": null,"efsVolumeConfiguration": {"transitEncryptionPort": null,"fileSystemId": "fs-xxxxxxx","authorizationConfig": {"iam": "ENABLED","accessPointId": null},"transitEncryption": "ENABLED","rootDirectory": "/test-ecs/firelens-config"},"name": "firelens-conf","host": null,"dockerVolumeConfiguration": null},// 创建日志卷{"name": "var-log","host": {"sourcePath": null}}],"memory": "512","cpu": "1024","taskRoleArn": "arn:aws-cn:iam::xxxxxxxxxx:role/ecsTaskRole","family": "myweb","requiresCompatibilities": ["EC2"],"networkMode": "bridge"
}

创建fluentbit配置文件,抓取

[INPUT]Name              tailTag               myweb-firelensPath              /opt/web/infolog.txtDB                /var/log/myweb_service.dbDB.locking        trueSkip_Long_Lines   OnRefresh_Interval  10Rotate_Wait       30[OUTPUT]Name  stdoutMatch myweb-firelens

进入ecs 的ec2实例查看fluentbit容器的配置文件,可以看到在其中引用了@INCLUDE /configs/extra-myweb.conf配置

bash-4.2# cat /fluent-bit/etc/fluent-bit.conf[INPUT]Name forwardunix_path /var/run/fluent.sock[INPUT]Name forwardListen 0.0.0.0Port 24224[INPUT]Name tcpTag firelens-healthcheckListen 127.0.0.1Port 8877[FILTER]Name record_modifierMatch *Record ec2_instance_id i-xxxxxxRecord ecs_cluster worktestRecord ecs_task_arn arn:aws-cn:ecs:cn-north-1:xxxxxxxx:task/worktest/0a5ecaa32f784edab3a723b8c8390a06Record ecs_task_definition myweb:9@INCLUDE /configs/extra-myweb.conf[OUTPUT]Name nullMatch firelens-healthcheck[OUTPUT]Name cloudwatchMatch myweb-firelens*auto_create_group truelog_group_name /aws/ecs/containerinsights/$(ecs_cluster)/applicationlog_key loglog_stream_name $(ecs_task_id)region cn-north-1retry_limit 2

在efs卷中配置的fluentbit extra-config,为input打上tag,抓取/opt/web/infolog.txt路径下日志

[INPUT]Name              tailTag               myweb-firelensPath              /opt/web/infolog.txtDB                /var/log/myweb_service.dbDB.locking        trueSkip_Long_Lines   OnRefresh_Interval  10Rotate_Wait       30[OUTPUT]Name  stdoutMatch myweb-firelens

查看业务容器访问日志

$ cat infolog.txt
2022-09-27 13:23:47,244 - test-log-info - INFO - info
2022-09-27 13:23:47,244 - test-log-info - ERROR - error
2022-09-27 13:23:47,248 - test-log-info - WARNING - warning

我们将容器访问日志打到fluentbit的stdout中

$ docker logs d8963f1052a4
[0] myweb-firelens: [1669883566.583834793, {"log"=>"2022-09-27 13:23:47,244 - test-log-info - INFO - info", "ec2_instance_id"=>"i-xxxxxxxxxxxx", "ecs_cluster"=>"worktest", "ecs_task_arn"=>"arn:aws-cn:ecs:cn-north-1:xxxxxxxx:task/worktest/0a5ecaa32f784edab3a723b8c8390a06", "ecs_task_definition"=>"myweb:9"}]
[1] myweb-firelens: [1669883566.583836988, {"log"=>"2022-09-27 13:23:47,244 - test-log-info - ERROR - error", "ec2_instance_id"=>"i-xxxxxxxxxxxxxx", "ecs_cluster"=>"worktest", "ecs_task_arn"=>"arn:aws-cn:ecs:cn-north-1:xxxxxxxx:task/worktest/0a5ecaa32f784edab3a723b8c8390a06", "ecs_task_definition"=>"myweb:9"}]
[2] myweb-firelens: [1669883566.583837240, {"log"=>"2022-09-27 13:23:47,248 - test-log-info - WARNING - warning", "ec2_instance_id"=>"i-xxxxxxxxxxxxxx", "ecs_cluster"=>"worktest", "ecs_task_arn"=>"arn:aws-cn:ecs:cn-north-1:xxxxxxxx:task/worktest/0a5ecaa32f784edab3a723b8c8390a06", "ecs_task_definition"=>"myweb:9"}]

此时ecs容器已经处于运行状态,我们只需要将efs下的/test-ecs/firelens-config路径挂载到任意ec2上对fluentbit配置进行编辑,此时查看容器中的配置会动态修改,实现动态配置的目的

aws ecs 通过efs挂载实现动态更新firelens日志配置相关推荐

  1. MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置

    上一篇我们用 Go 扩展实现了 Basic Auth,体验了 Go 扩展从 Envoy 接受配置. 之所以这么设计,是想复用 Envoy 原有的 xDS 配置推送通道,今天我们就来体验一番,云原生的配 ...

  2. 使用Fargate在AWS ECS中部署ASP.NET Core 微服务

    目录 介绍 为何选择ECS Fargate? 先决条件 应用架构 AWS基础架构 ASP.NET Core WebAPI的准备情况 在ECS上运行Docker镜像容器 使用Cloudformation ...

  3. layui 数据表格下拉框_layui学习——数据表格嵌套下拉列表,并实现动态更新

    layui学习--数据表格嵌套下拉列表,并实现动态更新 项目中有些字段的数据为固定的几个值,这些字段在数据表格中显示为汉字,但在数据库中以数字形式存储,例如:仓库属性(0:普通仓/1:检验仓/2:报废 ...

  4. 动态更新 AGS Cache

    作者:Flyingis 提升ArcGIS Server访问速度最佳的方式是Cache,将所有图层切片保存在服务器,客户端请求时直接访问cache好的图片,这里分为两种情况,一是所有图层都做cache, ...

  5. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  6. 动态添加跨行表格_学会这2招,轻松搞定数据透视表动态更新,效率猛增一倍...

    私信回复关键词[福利],获取丰富办公资源,助你高效办公早下班! Hello,大家好,我是最近在研究数据透视表的小爽~ 最近,我收到了一个学员的求助: 简单归纳一下,这个问题就是: 如何能让数据透视表的 ...

  7. aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条

    1. 泛型 AysncTask Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. Progress:后台任务执行的进度,若不用显示进度条,则不需要 ...

  8. Centos DNS服务(二)-bind主从配置与基于TSIG加密的动态更新

    DNS的主从配置 DNS从服务器也叫辅服DNS服务器,如果网络上某个节点只有一台DNS服务器的话,首先服务器的抗压能力是有限的,当压力达到一定的程度,服务器就可能会宕机罢工, 其次如果这台服务器出现了 ...

  9. android 实现表格横向混动_Flutter混合开发和Android动态更新实践

    Flutter混合开发和Android动态更新实践 感谢闲鱼和csdn的文章给的思路: 本篇是实践性文章包含两部分 将Flutter工程编译后的文件集成到Android项目 将Flutter代码热更新 ...

  10. Android零基础入门第44节:ListView数据动态更新

    2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...

最新文章

  1. 2021年大数据Flink(四十二):​​​​​​​BroadcastState
  2. Scrapy-Splash的介绍、安装以及实例
  3. 常用ARM指令总结(未完待续)
  4. 简单论述市场营销管理的基本过程
  5. 吐血推荐 | 那些提升开发人员工作效率的在线工具
  6. php session string,教你如何使用php session
  7. 一个winform中多线程的例子
  8. matlab画动态简单轨迹,利用MATLAB绘制相轨迹
  9. java模板引擎 jade_jade模板引擎
  10. html match函数,match函数的使用方法 match函数的实例
  11. 【OD矩阵】《城市公交IC卡·数据分析方法及应用》利用公交运营时间和乘客刷卡时间特征识别上车点
  12. 如何查看电脑CPU温度,笔记本温度显示怎么开启
  13. TP6------图片上传/多图上传
  14. 高防服务器如何防御?
  15. 企业对接Walmart平台常见报错
  16. python设置背景颜色为豆绿色_eclipse 设置豆沙绿保护色,保护眼睛
  17. 人机博弈 围棋程序GNU GO 所有版本源码及使用方法
  18. Python爬虫 金融股票数据
  19. INA219与INA216测试总结
  20. Apache Camel SFTP 参数说明及介绍

热门文章

  1. Infor与云的不解之缘
  2. ubuntu不支持安装搜狗_Ubuntu下安装搜狗输入法已经fcitx升级后搜狗输入法不能使用的解决办法...
  3. linux 教程 习题,Linux练习题分享,linux练习题
  4. 魔窗--H5网页唤醒APP
  5. 长沙县:红红火火过大年 文化惠民暖人心
  6. win10怎么录制电脑屏幕 电脑录制视频
  7. Spring Security小例子
  8. php实现支付宝对账单打通
  9. @UPC 6605 @福建OI2018 [FJOI2018] @ 洛谷 P4578 所罗门王的宝藏 (矩阵行列规律)
  10. GIS应用技巧之景观格局分析(二)