如何生成EC2服务器正常运行时间月度报告及相关方案咨询
一、触发实例状态变更时自动生成报告
你已经配置了CloudWatch实例检查告警,要在实例重启、停止、启动时自动生成报告,可以通过EventBridge(原CloudWatch Events)+ Lambda的组合实现:
- 配置EventBridge规则:匹配
ec2:InstanceStateChange事件,筛选状态从running到stopped、stopped到running等关键变更场景,覆盖重启(本质是停止+启动)、停止、启动动作。 - 触发Lambda函数:编写Lambda逻辑完成以下操作:
- 调用CloudWatch Metrics API(
get_metric_statistics),拉取目标实例的Uptime指标,或通过实例启动时间计算运行时长;同时可关联你已配置的实例检查失败告警数据。 - 将数据整理为CSV、JSON或HTML格式的月度报告(可按实例ID、名称分组汇总)。
- 直接将报告文件上传至指定S3桶。
- 调用CloudWatch Metrics API(
二、是否需要创建日志组才能推送报告至S3?
不需要。日志组是用于存储CloudWatch Logs(比如Lambda执行日志、EC2系统日志)的服务,和报告生成、推送至S3没有强制关联。Lambda可以直接通过AWS SDK将生成的报告文件上传到S3,无需依赖日志组。当然,如果你需要排查报告生成过程中的错误,创建日志组记录Lambda的执行日志是个推荐的最佳实践,但不是必要条件。
三、其他下载EC2正常运行时间报告的方式
AWS CLI手动导出:通过命令行拉取CloudWatch指标数据,本地生成报告:
aws cloudwatch get-metric-statistics \ --namespace AWS/EC2 \ --metric-name Uptime \ --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \ --start-time $(date -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ) \ --end-time $(date +%Y-%m-%dT%H:%M:%SZ) \ --period 86400 \ --statistics Average \ --output csv > ec2_uptime_monthly.csv批量处理所有实例时,可结合
aws ec2 describe-instances获取实例ID列表,循环执行上述命令。CloudWatch仪表盘导出:在CloudWatch中创建Metric Insights查询,筛选所有EC2实例的运行时间数据(示例查询如下),保存为仪表盘后,可手动导出CSV/PDF到本地,或通过API/Lambda定期自动导出到S3:
SELECT AVG(Uptime) BY INSTANCE_ID, INSTANCE_NAME WHERE NAMESPACE = 'AWS/EC2' PERIOD 2592000 -- 30天对应的秒数Systems Manager自动化文档:创建自动化文档,定义收集EC2运行时间数据、生成报告、存储到S3的流程,可设置按计划执行(比如每月末),或手动触发。
实例内部脚本汇总:在EC2实例上部署定时脚本(比如用
cron),通过uptime或last reboot命令记录本地运行时间,将日志上传到S3后,用Athena查询汇总生成月度报告。这种方式适合需要实例内部更细粒度运行数据的场景。
内容的提问来源于stack exchange,提问作者Prasad

