如何实现SSM托管实例Ping状态监控及连接丢失告警?
如何监控SSM托管实例的Ping状态并触发告警
我之前帮团队搞定过这个需求,CloudWatch事件规则确实没法直接实现Ping状态的监控——因为它主要是响应AWS原生服务的状态变化,而Ping连通性属于自定义的实例层面指标。不过我们可以结合SSM和CloudWatch的组合来搞定,步骤很清晰:
1. 准备CloudWatch自定义指标的上报脚本
首先要在SSM里创建一个自定义文档,用来让实例定期执行Ping并把结果上报到CloudWatch:
- 打开SSM控制台,进入「文档」→「创建文档」,选择「命令行」类型,把下面的脚本贴进去(记得替换
YOUR_TARGET_HOST为你要Ping的目标,比如网关或特定服务地址):
#!/bin/bash # 执行3次Ping测试,静默输出 ping -c 3 YOUR_TARGET_HOST > /dev/null # 根据Ping结果上报指标:1=连通,0=丢失 if [ $? -eq 0 ]; then aws cloudwatch put-metric-data \ --namespace "SSMInstancePing" \ --metric-name "ConnectivityStatus" \ --value 1 \ --dimensions InstanceId=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) else aws cloudwatch put-metric-data \ --namespace "SSMInstancePing" \ --metric-name "ConnectivityStatus" \ --value 0 \ --dimensions InstanceId=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) fi
- 注意:要确保SSM托管实例的IAM角色拥有
cloudwatch:PutMetricData权限,不然没法上报指标。可以给角色附加CloudWatchFullAccess(或者更精细化的权限)。
2. 用SSM State Manager定期执行脚本
接下来要让实例定期运行这个Ping脚本:
- 进入SSM控制台的「State Manager」→「创建关联」
- 选择刚才创建的自定义文档,设置执行频率(比如每5分钟一次,根据你的监控需求调整)
- 选择需要监控的SSM托管实例,完成关联创建。这样实例就会自动定期执行Ping并上报状态到CloudWatch。
3. 创建CloudWatch告警触发通知
最后配置告警规则,当Ping失败时发送通知:
- 打开CloudWatch控制台,进入「告警」→「创建告警」
- 选择「选择指标」,找到我们自定义的
SSMInstancePing命名空间,选择ConnectivityStatus指标,并按InstanceId维度过滤到目标实例 - 设置告警条件:比如「当指标值等于0,持续1个周期(5分钟)」就触发告警
- 配置通知:选择一个已有的SNS主题(如果没有就新建一个),把需要接收告警的邮箱、Slack机器人或其他端点订阅到这个主题。这样当实例Ping连接丢失时,你就会收到告警通知。
另外补充下:如果你不想在实例上跑脚本,也可以用CloudWatch Synthetics的Canary来远程Ping实例,但这种方式监控的是Canary节点到实例的连通性,而不是实例自身对外的Ping状态——所以前者更适合你的需求。
内容的提问来源于stack exchange,提问作者Madhuri Andhale




