首页 文章

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

提问于
浏览
0

Problem:

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

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

Our approach:

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

Error:

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

Root堆栈中已存在资源

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

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

Resources in template,

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

1 回答

  • 0

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

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

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

相关问题