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

时间:2018-09-24 10:45:48

标签: amazon-web-services amazon-ec2 aws-lambda aws-sdk amazon-cloudformation

问题:

最近,我们在单个CloudFormation模板中可以声明的最大资源数量方面遇到了问题。 一个模板最多可支持200个资源,我们已经很接近达到这个极限。

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

我们的方法:

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

错误:

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

  

根堆栈中已经存在资源

1。。是否可以将我们的主模板分解为具有现有资源的嵌套堆栈?即将我们现有的资源移到嵌套堆栈下? 还是只需要向嵌套堆栈中添加新资源,并使我们的主堆栈与现有资源保持原样?

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

模板中的资源

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

2 个答案:

答案 0 :(得分:0)

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

解决方案是分两个阶段部署堆栈,首先从根堆栈中删除资源,然后将它们添加到嵌套堆栈中。当您的环境中缺少这些资源时,这将导致较短的时间,但是如果您保持较小的迁移,则只需几分钟。

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

答案 1 :(得分:0)

AWS CloudFormation 现在支持增加对五个服务配额的限制。现在是 500,而不是 200。看看是否对您有帮助。

Playground