【问题标题】:How to remove a resource without deleting it during a cloudformation stack update如何在 cloudformation 堆栈更新期间删除资源而不删除它
【发布时间】:2017-08-30 01:02:06
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

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

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

    我还在上面测试了 Houser 的响应,并确认存储桶包含文件时不会被删除。虽然这可行,但它确实会在完成之前尝试删除存储桶 3 次(并且每次都报告错误)。迁移到新堆栈不会引发任何错误。

    【讨论】:

      【解决方案2】:

      将详细说明user3470009的答案。

      DeletionPolicymain, advertised purpose 是在删除堆栈时保留资源。在DeletionPolicyAWS docs 中几乎事后提到它在从堆栈中删除资源期间也起作用:

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

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

      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

      【讨论】:

      【解决方案3】:

      将 DeletionPolicy 设置为“Retain”将导致存储桶本身在删除资源的堆栈更新后保留。

      【讨论】:

      【解决方案4】:

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

      由于您的现有用户将继续使用 S3 存储桶,我建议您在模板中保留该存储桶。将桶从您的产品中完全移除后将其移除。

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

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

      【讨论】:

      • 这不准确;您可以在资源上使用 DeletionPolicy 属性来防止 cloudformation 删除资源。
      猜你喜欢
      • 2020-05-16
      • 2021-12-18
      • 2021-04-22
      • 2021-05-15
      • 2019-09-01
      • 2019-02-15
      • 2021-03-15
      • 2018-10-25
      • 2015-12-12
      相关资源
      最近更新 更多