aws ecs 通过efs挂载实现动态更新firelens日志配置
参考:
- 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日志配置相关推荐
- MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置
上一篇我们用 Go 扩展实现了 Basic Auth,体验了 Go 扩展从 Envoy 接受配置. 之所以这么设计,是想复用 Envoy 原有的 xDS 配置推送通道,今天我们就来体验一番,云原生的配 ...
- 使用Fargate在AWS ECS中部署ASP.NET Core 微服务
目录 介绍 为何选择ECS Fargate? 先决条件 应用架构 AWS基础架构 ASP.NET Core WebAPI的准备情况 在ECS上运行Docker镜像容器 使用Cloudformation ...
- layui 数据表格下拉框_layui学习——数据表格嵌套下拉列表,并实现动态更新
layui学习--数据表格嵌套下拉列表,并实现动态更新 项目中有些字段的数据为固定的几个值,这些字段在数据表格中显示为汉字,但在数据库中以数字形式存储,例如:仓库属性(0:普通仓/1:检验仓/2:报废 ...
- 动态更新 AGS Cache
作者:Flyingis 提升ArcGIS Server访问速度最佳的方式是Cache,将所有图层切片保存在服务器,客户端请求时直接访问cache好的图片,这里分为两种情况,一是所有图层都做cache, ...
- android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...
本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...
- 动态添加跨行表格_学会这2招,轻松搞定数据透视表动态更新,效率猛增一倍...
私信回复关键词[福利],获取丰富办公资源,助你高效办公早下班! Hello,大家好,我是最近在研究数据透视表的小爽~ 最近,我收到了一个学员的求助: 简单归纳一下,这个问题就是: 如何能让数据透视表的 ...
- aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条
1. 泛型 AysncTask Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. Progress:后台任务执行的进度,若不用显示进度条,则不需要 ...
- Centos DNS服务(二)-bind主从配置与基于TSIG加密的动态更新
DNS的主从配置 DNS从服务器也叫辅服DNS服务器,如果网络上某个节点只有一台DNS服务器的话,首先服务器的抗压能力是有限的,当压力达到一定的程度,服务器就可能会宕机罢工, 其次如果这台服务器出现了 ...
- android 实现表格横向混动_Flutter混合开发和Android动态更新实践
Flutter混合开发和Android动态更新实践 感谢闲鱼和csdn的文章给的思路: 本篇是实践性文章包含两部分 将Flutter工程编译后的文件集成到Android项目 将Flutter代码热更新 ...
- Android零基础入门第44节:ListView数据动态更新
2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...
最新文章
- 2021年大数据Flink(四十二):​​​​​​​BroadcastState
- Scrapy-Splash的介绍、安装以及实例
- 常用ARM指令总结(未完待续)
- 简单论述市场营销管理的基本过程
- 吐血推荐 | 那些提升开发人员工作效率的在线工具
- php session string,教你如何使用php session
- 一个winform中多线程的例子
- matlab画动态简单轨迹,利用MATLAB绘制相轨迹
- java模板引擎 jade_jade模板引擎
- html match函数,match函数的使用方法 match函数的实例
- 【OD矩阵】《城市公交IC卡·数据分析方法及应用》利用公交运营时间和乘客刷卡时间特征识别上车点
- 如何查看电脑CPU温度,笔记本温度显示怎么开启
- TP6------图片上传/多图上传
- 高防服务器如何防御?
- 企业对接Walmart平台常见报错
- python设置背景颜色为豆绿色_eclipse 设置豆沙绿保护色,保护眼睛
- 人机博弈 围棋程序GNU GO 所有版本源码及使用方法
- Python爬虫 金融股票数据
- INA219与INA216测试总结
- Apache Camel SFTP 参数说明及介绍
热门文章
- Infor与云的不解之缘
- ubuntu不支持安装搜狗_Ubuntu下安装搜狗输入法已经fcitx升级后搜狗输入法不能使用的解决办法...
- linux 教程 习题,Linux练习题分享,linux练习题
- 魔窗--H5网页唤醒APP
- 长沙县:红红火火过大年 文化惠民暖人心
- win10怎么录制电脑屏幕 电脑录制视频
- Spring Security小例子
- php实现支付宝对账单打通
- @UPC 6605 @福建OI2018 [FJOI2018] @ 洛谷 P4578 所罗门王的宝藏 (矩阵行列规律)
- GIS应用技巧之景观格局分析(二)