如何在cloudformation堆栈更新期间删除资源而不删除它

时间:2017-04-04 17:24:13

标签: amazon-web-services amazon-cloudformation

我有一个cloudformation模板,可以创建一个S3存储桶作为cloudformation堆栈的一部分。在我的模板的新版本上,我计划将我的应用程序从S3迁移到EFS。

有没有办法从模板中删除S3存储桶资源,而不删除它?理想情况下,我希望我的老用户在升级后可以使用s3存储桶,但是对于新用户来说根本没有它。看起来DeletionPolicies在这里可能有所帮助,但是它上面的文档说它只适用于堆栈删除,而不适用于升级。

4 个答案:

答案 0 :(得分:5)

将详细说明user3470009的答案。

DeletionPolicy中的main, advertised purpose用于在删除堆栈时保留资源。在DeletionPolicy的{​​{3}}中,几乎有人提到它在从堆栈中删除资源时也起作用:

  

请注意,此功能还适用于以下堆栈更新操作:   导致资源从堆栈中删除。例如,如果您   从堆栈模板中删除资源,然后更新堆栈   模板。

因此从堆栈中删除资源而不删除实际资源的工作流程是:

  1. 在您的CF模板的资源声明中添加"DeletionPolicy" : "Retain"
  2. 通过保存在UI中或在CLI上运行aws cloudformation或使用其他任何工具来应用更改
  3. 在UI中检查您的资源具有正确的更改。关于CF何时不更新元数据有一些陷阱。请参阅上方的文档链接
  4. 从模板中删除资源
  5. 应用更改。观看事件日志以查看其显示DELETE_SKIPPED

2018-10-15T15:32:32.956Z HostedZone DELETE_SKIPPED

答案 1 :(得分:2)

从模板中删除资源并从此模板更新堆栈时,资源将被删除。没有办法避免这种情况。

由于您现有的用户将继续使用S3存储桶,因此我建议您在模板中保留存储桶。从产品中取出铲斗后将其取下。

如果需要,您可以对模板进行版本控制(旧版与新版)。

如果您绝对需要从模板中删除存储桶,则可能会使用漏洞。当CloudFormation删除存储桶时,存储桶必须为空。如果它不为空,则应保留存储桶并将其从堆栈中移除。你可以试验一下,看看它是否适合你。如果它在测试中有效,那么您可以尝试在生产中使用它。

答案 2 :(得分:1)

我遇到了这个问题,需要稍作改动。我需要将存储桶提取到另一个堆栈,并且不能在移动中将其删除。这种方法效果很好:

  1. 使用相关的存储桶创建一个新堆栈。 (注意:您现在有2个堆栈引用相同的存储桶)
  2. 从原始堆栈中删除存储桶。资源会从原始堆栈中删除,但不会从S3中删除,因为它仍在新堆栈中被引用。

我还在上面测试了Houser的响应,并确认如果存储桶中包含文件,则不会将其删除。在执行此操作时,它会尝试删除存储桶3次,直到它完成(并每次报告错误)。迁移到新堆栈不会引发任何错误。

答案 3 :(得分:0)

设置"删除"的删除策略在删除资源的堆栈更新之后,将导致存储桶本身保留。