PAYATHON 2026

CloudFormation 取消参数覆盖后为何不恢复默认值?

数据小陈

这是 aws cloudformation deploy 的预期行为。更新已有 stack 时,省略 AdminCIDR 会沿用 stack 当前保存的参数值,不会自动恢复为模板中的 Default。要恢复为 127.0.0.1/32,需要显式传入一次该值;更新成功后,后续部署可以继续省略这个参数。

为什么没有检测到变更?

创建和更新 stack 时,未指定参数的处理方式不同:

  • 创建新 stack 时,如果没有提供参数值,CloudFormation 可以使用模板中声明的默认值。
  • 使用 aws cloudformation deploy 更新已有 stack 时,未指定的参数会保留 stack 中已有的值。

AWS 的 create-stack 文档和 deploy 文档分别说明了这两条规则。

首次部署时传入的公网 IP 会成为 stack 的当前参数值。下一次部署省略 --parameter-overrides,AdminCIDR 仍会沿用该值。如果模板和其他输入也没有变化,就可能得到没有变更的结果。

如何恢复为默认值?

显式将参数设置为模板中的默认值:

aws cloudformation deploy \
  --stack-name ex1 \
  --template-file ex1.yaml \
  --parameter-overrides AdminCIDR=127.0.0.1/32

这里使用文档中的完整选项名 --template-file。

如果当前参数值不同,且模板中的安全组规则确实通过 !Ref AdminCIDR 引用该参数,更新后该规则会采用新的 CIDR。如果当前值已经是 127.0.0.1/32,再次传入相同的值不会产生新的资源变更。

更新成功后,后续部署可以省略参数覆盖:

aws cloudformation deploy \
  --stack-name ex1 \
  --template-file ex1.yaml

此时保留的是 stack 已保存的 127.0.0.1/32。虽然它与模板默认值相同,但不会自动跟随 Default 变化。以后修改模板中的默认值,也不能通过省略参数来重置这个已有参数。

如何确认当前值?

可以查询 stack 保存的 AdminCIDR:

aws cloudformation describe-stacks \
  --stack-name ex1 \
  --query "Stacks[0].Parameters[?ParameterKey=='AdminCIDR'].ParameterValue" \
  --output text

在首次覆盖之后、恢复之前,以及恢复成功之后分别查询,就能确认参数值如何变化。

模板还有哪些地方需要注意?

题目中的 YAML 片段没有显示层级缩进。如果实际文件也没有缩进,需要先修正:AdminCIDR 应位于 Parameters 下,SSHSecurityGroup 应位于 Resources 下,入站规则应位于 Properties.SecurityGroupIngress 下。如果只是粘贴时丢失了缩进,可以忽略这一点。

另外,127.0.0.1/32 是回环地址范围。将 SSH 入站规则恢复为这个值后,当前公网 IP 就不再由这条规则放行;实际能否通过 SSH 连接,还取决于其他安全组规则及网络配置。

备注:内容仅供参考。