无需S3,如何使用本地CloudFormation模板及嵌套栈部署?
问题原因
AWS CloudFormation的嵌套栈TemplateURL要求必须是云端可访问的URL(如S3对象地址、公网HTTP/HTTPS地址),本地文件路径common/ec2/lifecyclemanager.yaml无法被CloudFormation服务识别,因此报错template url must be supported url。
无需S3的解决方案
方案1:使用aws cloudformation package内嵌本地模板
aws cloudformation package命令可自动将本地引用的嵌套模板转换为内嵌的TemplateBody内容,完全无需依赖外部存储。具体改造步骤如下:
调整部署脚本
在创建变更集前先执行打包操作,将本地模板整合为单份内嵌模板:
#!/bin/bash TEMPLATE_FILE="root.yaml" PACKAGED_TEMPLATE="packaged-root.yaml" CAPABILITIES="CAPABILITY_NAMED_IAM" PROFILE="nit-iam" STACK_NAME='PROD-INFRA' CHANGE_SET_NAME='PROD-CHANGE' # 打包本地模板,自动将嵌套的本地模板转换为内嵌内容 echo "Packaging local CloudFormation templates..." AWS_PROFILE=$PROFILE aws cloudformation package \ --template-file $TEMPLATE_FILE \ --output-template-file $PACKAGED_TEMPLATE \ --use-yaml # 保持YAML格式,也可选择--use-json # 创建变更集,使用打包后的内嵌模板 AWS_PROFILE=$PROFILE aws cloudformation create-change-set \ --stack-name $STACK_NAME \ --change-set-name $CHANGE_SET_NAME \ --template-body file://$PACKAGED_TEMPLATE \ --capabilities $CAPABILITIES \ --change-set-type CREATE echo "Waiting for change set to be created..." AWS_PROFILE=$PROFILE aws cloudformation wait change-set-create-complete \ --stack-name $STACK_NAME \ --change-set-name $CHANGE_SET_NAME # 执行变更集 echo "Executing change set..." AWS_PROFILE=$PROFILE aws cloudformation execute-change-set \ --stack-name $STACK_NAME \ --change-set-name $CHANGE_SET_NAME # 可选:清理临时打包文件 rm $PACKAGED_TEMPLATE
原理说明
package命令会遍历主模板中的TemplateURL字段,读取本地模板内容并将其转换为YAML/JSON字符串,替换原TemplateURL为TemplateBody属性,让嵌套栈定义完全内嵌在主模板中,绕开对外部URL的依赖。
方案2:手动内嵌模板内容
如果不想使用package命令,可直接将子模板内容复制到主模板的TemplateBody中:
AWSTemplateFormatVersion: '2010-09-09' Description: AWS EC2 Backup Policy for Production Environment Resources: EC2LifecycleManagerStack: Type: AWS::CloudFormation::Stack Properties: # 替换TemplateURL为TemplateBody,直接嵌入子模板完整内容 TemplateBody: | AWSTemplateFormatVersion: '2010-09-09' Description: EC2 Lifecycle Manager Backup Policy Parameters: RetentionPeriodDay: Type: Number RetentionPeriodWeek: Type: Number # 粘贴子模板所有参数和资源定义 Resources: # 粘贴子模板的资源逻辑 Parameters: RetentionPeriodDay: 5 RetentionPeriodWeek: 2 # 保留原参数配置
这种方法适合子模板内容较少的场景,缺点是主模板会变得冗长,不利于后续维护。
内容的提问来源于stack exchange,提问作者Neetesshhr
相关产品推荐
相关产品推荐

