如何将现有 CloudFormation 堆栈分解为单独的嵌套堆栈,将现有资源移动到嵌套堆栈下

Dar*_*kar 6 amazon-ec2 amazon-web-services aws-cloudformation aws-sdk aws-lambda

问题:

最近,我们遇到了关于您可以在单个 CloudFormation 模板中声明的最大资源数量的问题。一个模板最多可以支持 200 个资源,我们非常接近这个限制。

为了指定更多资源,我们需要使用Nested Stacks将我们的模板分成多个模板,我们正在评估分解模板的最佳方法。

我们的方法:

我们从主堆栈创建了一个嵌套堆栈,并从主堆栈中删除了一些资源并将它们添加到新的嵌套堆栈中。

错误:

我们在嵌套堆栈中遇到错误,例如

资源已存在于根堆栈中

1.是否可以将我们的主模板分解为现有资源的嵌套堆栈?即移动我们现有的资源嵌套堆栈下?或者我们只需要将新资源添加到嵌套堆栈中并保持我们的主堆栈与现有资源一样?

2.我们已经达到了 200 个资源限制,因此也很难添加更多嵌套堆栈。

模板中的资源,

我们大约有 100 个 CloudWatch 警报、DynamoDB 表、Lambda、ES、KMS、S3 和其他资源,我们不想将它们分成特定于资源类型的嵌套堆栈。

小智 3

您无法将现有资源“合并”到新的 CloudFormation 堆栈中。如果将资源移动到嵌套堆栈中并将嵌套堆栈添加到根模板,它将首先尝试在嵌套堆栈中创建新资源,然后作为清理过程的一部分删除根堆栈中的旧资源。因此,如果新资源具有相同的名称(并且不允许重复的名称),则更新将失败。

解决方案是分两个阶段部署堆栈,首先从根堆栈中删除资源,然后将它们添加到嵌套堆栈中。这将导致您的环境中会在短时间内丢失这些资源,但如果您将迁移保持在较小范围内,那么这种情况应该只会持续几分钟。

包含状态的资源(如 DynamoDB、KMS、S3 等)更难以这种方式迁移,因为删除它们时数据显然会丢失。您要么需要执行完整的迁移过程,在嵌套堆栈中创建具有不同名称的新资源,迁移数据,更新应用程序以使用新资源,最后删除旧资源,要么接受这可能太过分了内部重构需要做很多工作,并将这些资源留在根模板中。