AWS CloudFormation - 栈与嵌套栈的区别

6

我原以为这个问题在互联网上已经有了明确的答案,但是我发现没有充分的答案能告诉我们何时使用一种类型的堆栈以及何时使用另一种类型的堆栈。

  • 所以主要问题是“常规堆栈”和“嵌套堆栈”的区别是什么?

我可以使用仅仅常规堆栈完美地建模我的基础架构。同样,我也可以使用仅仅嵌套堆栈和一个根常规堆栈来完美地建模我的基础架构。从项目角度来看,唯一的区别是堆栈类型名称。其他一切都是相同的。

例如,我正在使用 AWS CDK - 这是一个合成器,例如,它可以将 Python 合成为 CloudFormation 模板。我可以使用堆栈来做任何事情,我只需查找并替换堆栈为嵌套堆栈即可。基础架构会重新部署,但实质上没有改变任何东西。

  • 那么,为什么我应该使用嵌套堆栈而不是常规堆栈呢?它们各自有什么优势?

我不确定我理解这个问题。嵌套堆栈允许您将堆栈组合在一起。也就是说,您可以重构常见的基础结构模板,并在许多其他堆栈中使用它。如果您不需要它,请不要使用它。 - dpwr
1
嘿@dpwrussell。感谢您的回答。这就是“如果你不需要它,就不要使用它”的问题所在。我不知道我是否不需要它。所以你说嵌套堆栈允许你将堆栈组合在一起。但是你也可以使用常规堆栈组合堆栈。 - Laimonas Sutkus
不行,如果你在模板中嵌套一个栈,那么你就是在使用嵌套的栈。 - dpwr
3个回答

9

嵌套堆栈的最大“差异”在于它们成为父堆栈的一部分。这意味着,如果任何东西未能部署,则所有堆栈(父堆栈和嵌套堆栈)都将作为一个整体被回滚。相比之下,使用多个堆栈,您可能会有第一个成功部署,第二个失败并回滚,第三个甚至不尝试部署。


这是我读到的唯一相关参数。谢谢! - Thomas PEDOT

0

嵌套堆栈就像您代码中的函数,它们捆绑可重用代码并且可以进行参数化。

就像在Python编程中一样,您可以定义一个方法,该方法提供您在整个应用程序或不同应用程序中使用的功能。当然,您可以在Python代码中不使用任何方法,只需在多个位置上复制和粘贴相同的代码,它也可以正常工作并且很好。

就像Python中的函数一样,嵌套堆栈允许您减少在各种模板中复制和粘贴的数量,因为您可以将常见模式捆绑到嵌套堆栈中。就像函数一样,嵌套堆栈可以进行参数化,因此您可以从单个嵌套堆栈创建按需定制的资源。

为什么要使用嵌套堆栈而不是常规堆栈?

为了避免在多个堆栈之间复制和粘贴相同的功能。答案类似于“为什么我应该在Python中使用函数,如果我可以在需要时随处复制和粘贴相同的代码?”。


1
嗨@Marcin。感谢您的回答。但我想挑战您,说您也可以将常见模式与常规堆栈捆绑在一起。常规堆栈也可以进行参数化。而且您可以使用不同的参数重复使用堆栈。我是正确的还是缺少了一些基础知识? - Laimonas Sutkus
@LaimonasSutkus 一个常见的模式是在公共子网中拥有一个堡垒主机,作为私有子网的跳板主机。对于许多不同堆栈中的VPC,堡垒主机的定义通常是相同的,并伴随着一个安全组。那么,您如何在多个堆栈中定义这个堡垒主机和安全组呢?在这种情况下,许多人选择嵌套堆栈,因为您不必复制和粘贴相同的堡垒主机和安全组定义。您只需将一个定义作为嵌套堆栈引用即可。 - Marcin
参数化和函数完全不是一回事。函数封装逻辑。是的,您可以使用不同的参数多次重用相同的堆栈模板,但当您需要另一个具有部分相同功能但总体目标完全不同的模板时,这并没有帮助您。 - dpwr
@dpwrussell,我从未写过它们是“相同的”,只是说有“类似”的功能,因为CFN不是传统意义上的编程语言。如果您有不同的目标,那么可以创建嵌套堆栈模板的不同版本。但无论如何,请随意提供您的答案,我会点赞的。我很乐意删除我的回答。 - Marcin
1
@marcin 我是在回应楼主的评论。你的答案很棒。 - dpwr
显示剩余3条评论

0
那么,为什么我要使用嵌套堆栈而不是普通堆栈?它们各自有什么优势?
主要原因是如果您在一个堆栈中有超过500个资源,您别无选择,只能将其拆分成嵌套堆栈。这个限制曾经是200个资源,直到2020年10月才提高到了500个。

3
好的,你说得不对。你可以将一个栈分成两个栈,不需要嵌套栈来实现这一点。 - Laimonas Sutkus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接