如何在 cloudformation 堆栈更新期间删除资源而不删除它
How to remove a resource without deleting it during a cloudformation stack update
我有一个 cloudformation 模板,它创建一个 S3 存储桶作为 cloudformation 堆栈的一部分。在我的新版本模板上,我计划将我的应用程序从 S3 迁移到 EFS。
有没有办法从模板中删除 S3 存储桶资源而不删除它?理想情况下,我希望我的老用户在升级后可以使用 s3 存储桶,但新用户根本没有。看起来 DeletionPolicies 在这里可以提供帮助,但它的文档说它只适用于堆栈删除,而不适用于升级。
当您从模板中删除资源并从该模板更新堆栈时,资源将被删除。没有办法避免这种情况。
由于您的现有用户将继续使用 S3 存储桶,我建议您在模板中保留该存储桶。当桶从您的产品中完全移除后将其移除。
如果需要,您可以对模板进行版本控制(旧版与新版)。
如果您确实需要从模板中删除存储桶,您可以利用漏洞。当 CloudFormation 删除一个桶时,桶必须是空的。如果它不是空的,那么桶应该被保留并从你的堆栈中移除。你可以试验一下,看看它是否适合你。如果它在测试中有效,那么您可以尝试在生产中使用它。
将 DeletionPolicy 设置为 "Retain" 将导致存储桶本身在删除资源的堆栈更新后保留。
将详细说明 user3470009 的回答。
main, advertised purpose of the DeletionPolicy
is to keep a resource when a stack is deleted. It's mentioned almost as an afterthought in the AWS docs for DeletionPolicy
它在从堆栈中移除资源期间也起作用:
Note that this capability also applies to stack update operations that
lead to resources being deleted from stacks. For example, if you
remove the resource from the stack template, and then update the stack
with the template.
因此从堆栈中删除资源而不删除实际资源的工作流是:
- 将
"DeletionPolicy" : "Retain"
添加到 CF 模板中的资源声明中
- 通过在 CLI 或您使用的任何其他工具上的 UI 或 运行
aws cloudformation
中保存来应用更改
- 检查 UI 您的资源是否有正确的更改。关于 CF 何时不更新元数据存在一些陷阱。请参阅上面的文档 link
- 从模板中删除资源
- 应用更改。查看事件日志,看到它显示
DELETE_SKIPPED
:
2018-10-15T15:32:32.956Z HostedZone DELETE_SKIPPED
我发现这个问题需要稍作改动。我需要将我的桶提取到另一个堆栈并且不能在移动中删除它。这个方法效果不错:
- 使用相关存储桶创建一个新堆栈。 (注意:您现在有 2 个堆栈引用同一个存储桶)
- 从原始堆栈中删除桶。该资源已从原始堆栈中删除,但未从 S3 中删除,因为它仍在您的新堆栈中引用。
我还测试了 Houser 上面的响应并确认如果存储桶包含文件则不会被删除。虽然这有效,但它确实在完成之前尝试删除存储桶 3 次(并且每次都报告错误)。迁移到新堆栈不会引发任何错误。
我有一个 cloudformation 模板,它创建一个 S3 存储桶作为 cloudformation 堆栈的一部分。在我的新版本模板上,我计划将我的应用程序从 S3 迁移到 EFS。
有没有办法从模板中删除 S3 存储桶资源而不删除它?理想情况下,我希望我的老用户在升级后可以使用 s3 存储桶,但新用户根本没有。看起来 DeletionPolicies 在这里可以提供帮助,但它的文档说它只适用于堆栈删除,而不适用于升级。
当您从模板中删除资源并从该模板更新堆栈时,资源将被删除。没有办法避免这种情况。
由于您的现有用户将继续使用 S3 存储桶,我建议您在模板中保留该存储桶。当桶从您的产品中完全移除后将其移除。
如果需要,您可以对模板进行版本控制(旧版与新版)。
如果您确实需要从模板中删除存储桶,您可以利用漏洞。当 CloudFormation 删除一个桶时,桶必须是空的。如果它不是空的,那么桶应该被保留并从你的堆栈中移除。你可以试验一下,看看它是否适合你。如果它在测试中有效,那么您可以尝试在生产中使用它。
将 DeletionPolicy 设置为 "Retain" 将导致存储桶本身在删除资源的堆栈更新后保留。
将详细说明 user3470009 的回答。
main, advertised purpose of the DeletionPolicy
is to keep a resource when a stack is deleted. It's mentioned almost as an afterthought in the AWS docs for DeletionPolicy
它在从堆栈中移除资源期间也起作用:
Note that this capability also applies to stack update operations that lead to resources being deleted from stacks. For example, if you remove the resource from the stack template, and then update the stack with the template.
因此从堆栈中删除资源而不删除实际资源的工作流是:
- 将
"DeletionPolicy" : "Retain"
添加到 CF 模板中的资源声明中 - 通过在 CLI 或您使用的任何其他工具上的 UI 或 运行
aws cloudformation
中保存来应用更改 - 检查 UI 您的资源是否有正确的更改。关于 CF 何时不更新元数据存在一些陷阱。请参阅上面的文档 link
- 从模板中删除资源
- 应用更改。查看事件日志,看到它显示
DELETE_SKIPPED
:
2018-10-15T15:32:32.956Z HostedZone DELETE_SKIPPED
我发现这个问题需要稍作改动。我需要将我的桶提取到另一个堆栈并且不能在移动中删除它。这个方法效果不错:
- 使用相关存储桶创建一个新堆栈。 (注意:您现在有 2 个堆栈引用同一个存储桶)
- 从原始堆栈中删除桶。该资源已从原始堆栈中删除,但未从 S3 中删除,因为它仍在您的新堆栈中引用。
我还测试了 Houser 上面的响应并确认如果存储桶包含文件则不会被删除。虽然这有效,但它确实在完成之前尝试删除存储桶 3 次(并且每次都报告错误)。迁移到新堆栈不会引发任何错误。