CloudFormation嵌套栈控制台修改的自定义参数部署后恢复默认值如何解决
问题根因
你当前使用的aws cloudformation deploy命令仅显式传入了DeploymentBucketName和NodeModulesZipFileName两个强制覆盖参数,其余未显式声明的参数(包括透传给嵌套栈的关联参数)会默认使用CloudFormation模板中定义的默认值,因此控制台手动修改的参数会在每次代码部署时被覆盖。单栈场景下逻辑可正常运行是因为参数作用域仅在单个栈内,而嵌套栈的参数需要通过父栈透传,没有继承原有部署值就会被重置为模板默认值。
可用解决方案
方案1:部署时自动继承栈现有参数(无需修改现有模板)
修改publish.sh脚本,在执行部署命令前先拉取当前栈已有的参数配置,和你需要强制覆盖的两个参数合并后再传入部署命令,即可保留所有控制台修改的参数值,修改后的脚本代码如下:
mkdir -p build # SAM Package aws cloudformation package --template template-build.yml --s3-bucket ${DEPLOYMENT_BUCKET} --output-template build/template.yml --debug # 拼接默认需要强制覆盖的参数 OVERRIDE_PARAMS="DeploymentBucketName=${DEPLOYMENT_BUCKET} NodeModulesZipFileName=${packageJsonHash}.zip" # 兼容首次部署场景:检查目标栈是否已经存在 STACK_CHECK=$(aws cloudformation describe-stacks --stack-name ${STACK_NAME} 2>&1 || true) if [[ ! $STACK_CHECK =~ "Stack with id" ]]; then # 栈已存在:拉取现有参数,排除两个需要强制覆盖的参数后拼入覆盖列表 EXISTING_PARAMS=$(aws cloudformation describe-stacks --stack-name ${STACK_NAME} \ --query "Stacks[0].Parameters[?ParameterKey!='DeploymentBucketName' && ParameterKey!='NodeModulesZipFileName'].join('=', [ParameterKey, ParameterValue])" \ --output text | tr '\n' ' ') OVERRIDE_PARAMS="${OVERRIDE_PARAMS} ${EXISTING_PARAMS}" fi # SAM Deploy aws cloudformation deploy --template-file build/template.yml --stack-name ${STACK_NAME} \ --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND --role-arn ${ROLE_ARN} \ --s3-bucket $DEPLOYMENT_BUCKET \ --parameter-overrides ${OVERRIDE_PARAMS}
该方案不需要调整现有CloudFormation模板,所有控制台修改的参数(包括透传给嵌套栈的参数)都会被自动继承,后续部署不会重置。
方案2:使用SSM参数存储持久化可修改参数(更适合多环境、参数较多的场景)
如果需要频繁手动调整参数,推荐将可修改参数存储到AWS Systems Manager Parameter Store中,从模板层面避免部署覆盖的问题:
- 在AWS控制台的Systems Manager参数存储中创建对应参数,类型选择String
- 修改CloudFormation模板中的参数定义,默认值用
{{resolve:ssm:你的参数路径:1}}格式引用SSM参数(末尾数字为参数版本号,也可以省略版本号默认取最新值) - 后续需要调整参数时直接修改SSM参数的值即可,不需要修改模板,也不用担心代码部署会覆盖配置。
注意事项
- 嵌套栈的自定义参数必须通过父栈的参数透传,不要直接在嵌套栈模板中写死默认值,否则父栈未传递对应参数时会自动使用嵌套栈的默认值覆盖手动配置
- 若使用方案1,新增模板参数时第一次部署需要手动将参数加入覆盖列表,后续部署就会自动继承修改后的值
内容的提问来源于stack exchange,提问作者rdvnkrtl
相关产品推荐
相关产品推荐

