CloudFormation无法接收user-data脚本SUCCESS信号致堆栈回滚
EC2实例自动发送CloudFormation SUCCESS信号失败排查步骤
1. 排查脚本执行环境与依赖就绪状态
- 自动执行时,user-data在实例启动初期运行,部分系统服务(如网络、cloud-init)可能未完全就绪,而手动执行是在实例完全启动后,环境差异导致信号发送失败。
- 检查脚本中是否存在异步执行的命令(如加
&后台运行),若前面的任务未完成就执行信号发送,可能因依赖未满足导致失败。确保信号发送命令在所有配置任务完全结束后执行,必要时添加等待逻辑(如wait命令等待后台进程结束)。
2. 检查cloud-init日志定位执行错误
- 登录实例查看关键日志:
- 查看cloud-init执行日志:
cat /var/log/cloud-init.log,搜索cfn-signal或signal关键字,确认命令是否被执行、是否有报错(如命令找不到、参数错误)。 - 查看脚本输出日志:
cat /var/log/cloud-init-output.log,直接看信号发送命令的执行结果,是否有返回错误信息。
- 查看cloud-init执行日志:
- 注意:自动执行时的
PATH环境变量可能与手动登录不同,建议在脚本中使用cfn-signal的绝对路径(如/opt/aws/bin/cfn-signal),避免因路径问题导致命令无法找到。
3. 验证IAM权限与网络连通性
- 确认实例关联的IAM角色包含
cloudformation:SignalResource权限,若权限缺失,信号发送会被CloudFormation拒绝,日志中会出现403错误。 - 检查实例网络是否能访问CloudFormation服务:
- 若实例在公有子网,确认安全组允许出站HTTPS(443)流量到互联网;
- 若实例在私有子网,确认NAT网关/互联网网关配置正常,能访问CloudFormation的区域端点;
- 可在脚本中添加测试命令:
curl -v https://cloudformation.${AWS_REGION}.amazonaws.com,验证连通性。
4. 检查CloudFormation模板的信号等待配置
- 查看AutoScalingGroup的
CreationPolicy配置:- 确认
Timeout值足够覆盖脚本执行时间,若默认5分钟不够,可调整为"Timeout": "PT15M"(15分钟),避免实例还未完成配置就触发超时回滚。 - 确认
MinSuccessfulInstancesPercent设置合理,若为100%,只要有一个实例未发送信号就会失败,可暂时调低(如90%)辅助排查,但最终需确保所有实例能正常发信号。
- 确认
5. 排查元数据获取与变量配置问题
- 若脚本中通过实例元数据获取StackName、Region等参数(如
curl http://169.254.169.254/latest/meta-data/...),需确认自动执行时元数据服务已就绪。可添加重试逻辑:# 等待元数据服务就绪 until curl -s http://169.254.169.254/latest/meta-data/instance-id; do sleep 5 done - 检查脚本中使用的CloudFormation参数(如
Ref: AutoScalingGroup)是否正确传递,避免因参数错误导致信号发送到错误资源。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

