我们通过Cloudformation创建了Stack之后,如果发生需求改变,那么需要进行修改。Update Stack的操作其实很容易,不过有几点需要注意。

  1. 进行Update操作之前,请执行stack drift的操作,以确保一致性。
  2. 进行Update操作的时候,请查阅相关的resource的属性,判断是否会导致某些服务中断
  3. 有些属性,例如EC2 的Public IP,如果没有绑定EIP,那么重启之后会变化,这些因素需要考虑
  4. 我们可以通过Stack Policy来限制对某些Resource进行修改
  5. 我们可以通过Change set来预览我们的改变。

下面通过一个例子说明

首先我们创建一个演示的LAMP 的 Cloudformation stack,他会创建一个EC2 实例和一个SG

AWS Cloudformation Update Stack注意事项_第1张图片

输入 Parameters 的值

AWS Cloudformation Update Stack注意事项_第2张图片

值得一提的是,他的Instance的Resource的名字叫做WebServerInstance,这个下一步会用到

AWS Cloudformation Update Stack注意事项_第3张图片

在Stack policy的设定里面,我们输入下面的Policy 。 这个Policy的目的是允许修改所有的资源,除了WebServerInstance。

AWS Cloudformation Update Stack注意事项_第4张图片

提交之后,我们的Stack就创建好了

AWS Cloudformation Update Stack注意事项_第5张图片

接下来,我们试试修改,点击 Update

AWS Cloudformation Update Stack注意事项_第6张图片

我们有三个选项, Use Current template 只能修改Parameters的值,后面两个可以修改整个Template

AWS Cloudformation Update Stack注意事项_第7张图片

作为测试,我修改了我的InstanceType 从 t2.micro 到 t2.small ( 如果我的stack policy工作的话,这里是禁止修改的,因此会导致更新失败,而回滚到原先状态)

AWS Cloudformation Update Stack注意事项_第8张图片

下一步,注意看他的Replacement 显示为 Conditonal

AWS Cloudformation Update Stack注意事项_第9张图片

这个代表的是他的Update Behavior。具体有三种

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement
AWS Cloudformation Update Stack注意事项_第10张图片

我们如何判断一个resource的修改是否会造成服务中断呢?一个是常识,另外我们还可以查看对应的CF的帮助文档,每一个属性都会告知 Update requires的类型是什么

AWS Cloudformation Update Stack注意事项_第11张图片

最后我们提交Update,等待1分钟后,发现他更新失败(意料之中)。错误提示为我的stack policy 否决了对EC2的修改
AWS Cloudformation Update Stack注意事项_第12张图片

最后,我们再来看看Change set。这个功能允许我们提交一个update的请求,然后可以查看对应的变化,然后才真正的提交执行。上面的例子我并没有手动的创建change set,而是直接进行的Update,即便如此,他也自动创建了一个Change Set。如果我们的改动成功了,那么这里会自动清空。因为change set是把我们的改动和初始文件进行对比,所以如果我们有多个change set,只要其中一个成功执行了,其他的change set所执向的初始文件就会自动作废了,也就是所有的change set都会清空。当然上面我们的update因为 stack policy被拒绝了,因此他默认产生的change set依然在这里

AWS Cloudformation Update Stack注意事项_第13张图片

点进去看看

Changes 会显示哪些resource 做了改动

AWS Cloudformation Update Stack注意事项_第14张图片

Input是 显示我输入的Parameter 参数

AWS Cloudformation Update Stack注意事项_第15张图片

Template就是当前的模板

AWS Cloudformation Update Stack注意事项_第16张图片

JSON change 显示具体哪些东西做了改变,以及他们可能会造成中断,他很智能的把相关的Ref 调用的资源以及影响都显示出来

AWS Cloudformation Update Stack注意事项_第17张图片

然后确认无误之后,就可以选择执行或者删除

AWS Cloudformation Update Stack注意事项_第18张图片

我再进行一次Update的操作,这次我修改了EC2 的实例,同时也修改了我的stack policy。注意 AWS不允许删除stack policy,因此如果需要移除保护,我们只能在配置文件里面设置允许所有操作。

AWS Cloudformation Update Stack注意事项_第19张图片

提交之后,成功执行了Update

AWS Cloudformation Update Stack注意事项_第20张图片

查看EC2 可以看见类型变成了t2.small, instance id,avaiable zone等等都没变化,但是public IP自动变化了,因为他没有绑定EIP,所以当实例关机,再开机之后public ip也自动变了,尽管这个并没有在我们的update的设置之中。

AWS Cloudformation Update Stack注意事项_第21张图片