如何修复template.yaml无对应资源时AWS CloudFormation报Unrecognized resource types错误
问题触发原因
- 即使当前编写的模板已经移除
AWS::CertificateManager::Certificate资源,CloudFormation仍可能因为栈侧缓存的历史模板、未清理的残留变更集、嵌套模板/宏转换的隐式引用触发该校验错误 - 也可能是部署命令指定的模板路径错误,实际提交的模板并不是你编辑的最新版本
无需删除整个栈的解决方案
- 步骤1:校验实际提交的模板内容
执行命令校验待部署模板,确认是否真的不存在目标资源引用:
aws cloudformation validate-template --template-body file://<你的模板文件路径.yaml>
如果校验返回的资源列表中仍包含AWS::CertificateManager::Certificate,需要排查部署命令的路径参数、嵌套模板、CloudFormation宏转换逻辑是否残留对应资源。
- 步骤2:清理栈残留的未执行变更集
未执行的历史变更集会保留旧版本模板的内容,触发校验错误,执行以下命令清理:
# 查询栈下所有变更集 aws cloudformation list-change-sets --stack-name <你的栈名> # 删除所有状态为CREATE_PENDING、UPDATE_PENDING的变更集 aws cloudformation delete-change-set --change-set-name <变更集名称> --stack-name <你的栈名>
- 步骤3:同步栈实际资源状态
执行栈漂移检测让CloudFormation对齐当前栈的真实资源状态,覆盖异常的缓存记录:
# 触发漂移检测 aws cloudformation detect-stack-drift --stack-name <你的栈名> # 等待检测完成,检测状态变为DETECTION_COMPLETE即可 aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id <上一步返回的检测ID>
完成后重新执行aws cloudformation deploy命令即可。
- 步骤4:过渡更新刷新栈模板缓存
如果以上操作仍无效,可以先从CloudFormation控制台下载上一次部署成功的模板(已移除证书资源的版本),用该模板执行一次无变更的栈更新操作,刷新栈侧的模板缓存后再部署你的新模板。
内容的提问来源于stack exchange,提问作者WhyAyala
相关产品推荐
相关产品推荐

