如何可靠捕获EC2实例启停过程中脚本的输出(含错误信息)?
捕获EC2用户数据脚本输出的替代方案
以下几种方法可以不用手动编写S3上传逻辑,就能可靠捕获用户数据脚本的输出(包括错误信息):
CloudWatch Logs自动采集系统日志
EC2用户数据脚本的所有输出(标准输出和错误输出)默认都会写入系统日志文件:- Amazon Linux 2/2023:
/var/log/cloud-init-output.log - Ubuntu/Debian:
/var/log/cloud-init.log - RHEL/CentOS:
/var/log/cloud-init.log
你只需要给EC2实例绑定具备
logs:CreateLogStream、logs:PutLogEvents权限的IAM角色,然后配置CloudWatch Agent(或传统的CloudWatch Logs Agent)自动监控上述日志文件,将内容同步到CloudWatch Logs中。整个过程不需要在用户数据脚本里添加额外的输出处理代码,只要提前做好IAM角色和日志代理的配置即可。- Amazon Linux 2/2023:
通过Systems Manager(SSM)捕获输出
大部分官方EC2镜像默认预装了SSM Agent,只要实例绑定了SSM的IAM权限(AmazonSSMManagedInstanceCore策略即可),你可以:- 在用户数据脚本中,将脚本输出重定向到本地文件,然后调用SSM的
aws ssm send-command或者直接利用SSM Agent的日志采集能力,将文件内容同步到Systems Manager的Run Command执行历史中; - 也可以直接用SSM Run Command来触发脚本执行,而不是通过用户数据,这样执行结果和输出会自动保存在SSM控制台的执行历史里,无需额外操作。
- 在用户数据脚本中,将脚本输出重定向到本地文件,然后调用SSM的
关于EMR无需额外操作的原因
EMR集群在创建时会自动配置日志推送机制(默认是S3或CloudWatch Logs),集群的所有组件日志(包括启动脚本的输出)都会被自动上传,所以你不需要手动处理——本质上是EMR帮你完成了日志采集的配置工作。
内容的提问来源于stack exchange,提问作者vy32
相关产品推荐
相关产品推荐

