CloudFormation嵌套栈部署TemplateURL参数报错应如何正确配置?
CloudFormation嵌套栈主栈配置正确方案
你遇到的报错核心是aws cloudformation package命令对嵌套栈TemplateURL参数的解析规则不符合预期,以下是两种合法的子栈定义方式和适用场景:
方式1:使用本地相对路径(更推荐)
对应你提供的testing A版本写法,不需要手动提前上传子栈到S3,所有资源上传工作交给package命令自动处理:
- 要求主栈
testing-mainstack.yml和子栈testing-substack.yml存放在本地同一目录下 TemplateURL直接填写子栈相对于主栈的路径即可:
Resources: SubstackA: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: testing-substack.yml
- 执行package命令时,工具会自动识别所有嵌套栈的本地模板、子栈内的Lambda代码等资源,批量上传到指定S3桶,同时自动把打包后生成的模板里的
TemplateURL替换为合法的S3访问地址 - 你本次报错的直接原因大概率是拼写错误:报错提示找不到
substack-amp.yml,但你的子栈文件名为testing-substack.yml,检查所有模板里的文件名拼写是否正确;如果是在CI流水线中执行,还要确认打包步骤的工作目录下已经包含了所有子栈模板文件。
方式2:直接填写S3路径
对应你提供的testing B版本写法,适合已经手动把子栈模板上传到S3的场景:
- 直接填写子栈在S3桶的完整路径即可:
Resources: SubstackA: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: s3://gitlab-cicd/testing-substack.yml
- 注意两点:
- 如果子栈内的Lambda
CodeUri是本地路径,依然需要执行package命令自动上传代码包到S3 - 存放模板的S3桶需要配置合理的读取权限,保证CloudFormation服务可以访问桶内的模板文件
- 如果子栈内的Lambda
标准操作流程
- 确保本地工作目录下的文件结构正确:
工作目录/ ├─ testing-mainstack.yml ├─ testing-substack.yml └─ lambda-two.py (你的Lambda入口代码文件)
- 主栈使用方式1的相对路径写法
- 直接执行package命令,不需要提前手动上传子栈:
aws cloudformation package --template-file testing-mainstack.yml --s3-bucket gitlab-cicd --output-template testing-packstack.yaml - 执行完成后,使用生成的
testing-packstack.yaml执行后续的deploy操作即可。
内容的提问来源于stack exchange,提问作者Juan Carlos Alfonso Vergel
相关产品推荐
相关产品推荐

