问题:
最近,我们在单个CloudFormation模板中可以声明的最大资源数量方面遇到了问题。 一个模板最多可支持200个资源,我们已经很接近达到这个极限。
要指定更多资源,我们需要使用Nested Stacks将模板分成多个模板, 我们正在评估破坏模板的最佳方法。
我们的方法:
我们从主堆栈中创建了一个嵌套堆栈,并从主堆栈中删除了一些资源,并将它们添加到新的嵌套堆栈中。
错误:
我们在嵌套堆栈中遇到了一个错误,例如
根堆栈中已经存在资源
1。。是否可以将我们的主模板分解为具有现有资源的嵌套堆栈?即将我们现有的资源移到嵌套堆栈下? 还是只需要向嵌套堆栈中添加新资源,并使我们的主堆栈与现有资源保持原样?
2。。我们已经达到200个资源限制,因此也很难添加更多的嵌套堆栈。
模板中的资源
我们大约有100个CloudWatch警报,DynamoDB表,Lambda,ES,KMS,S3和其他资源,我们不会将它们分为特定于资源类型的嵌套堆栈。
答案 0 :(得分:0)
您不能将现有资源“合并”到新的CloudFormation堆栈中。如果将资源移到嵌套堆栈中并将嵌套堆栈添加到根模板中,它将首先尝试在嵌套堆栈中创建新资源,然后在清理过程中删除根堆栈中的旧资源。这样,如果新资源具有相同的名称(并且不允许重复的名称),则更新将失败。
解决方案是分两个阶段部署堆栈,首先从根堆栈中删除资源,然后将它们添加到嵌套堆栈中。当您的环境中缺少这些资源时,这将导致较短的时间,但是如果您保持较小的迁移,则只需几分钟。
包含状态的资源(例如DynamoDB,KMS,S3等)很难以这种方式进行迁移,因为删除数据时显然会丢失数据。您要么需要执行一个完整的迁移过程,要么在嵌套堆栈中创建一个具有不同名称的新资源,然后迁移数据,更新您的应用程序以使用新资源,最后删除旧资源,或者接受那可能也太过分了。内部重构需要做很多工作,并将这些资源保留在根模板中。
答案 1 :(得分:0)
AWS CloudFormation 现在支持增加对五个服务配额的限制。现在是 500,而不是 200。看看是否对您有帮助。