【问题标题】:AWS Cloudformation - Stack vs NestedStackAWS Cloudformation - 堆栈与 NestedStack
【发布时间】:2021-03-31 14:17:11
【问题描述】:

我认为这会在互联网上得到非常清楚的回答。但是对于何时使用一种类型的堆栈以及何时使用另一种类型的堆栈,我发现没有足够的答案。

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

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

例如,我正在使用 AWS CDK - 一种合成器,例如,它可以将 python 合成到 CloudFormation 模板。我可以使用 Stacks 做所有事情,我可以简单地查找 Stack 并将其替换为 NestedStack。基础设施将被重新部署,但本质上没有任何改变。

  • 那么我为什么要在 常规堆栈 上使用嵌套堆栈?各自的优势是什么?

【问题讨论】:

  • 我不确定我是否理解这个问题。嵌套堆栈允许您将堆栈组合在一起。 IE。您可以重构常见的基础架构模板并将其用于许多其他堆栈。如果你不需要它,就不要使用它
  • 嘿@dpwrussell。感谢您的回答。这就是“如果你不需要它,就不要使用它”的问题。我不知道我是否不需要它。因此,您说嵌套堆栈允许您将堆栈组合在一起。但是您也可以使用常规堆栈来组合堆栈。
  • 不,你不能,如果你在模板中嵌套一个堆栈,那么你正在使用嵌套堆栈

标签: amazon-web-services amazon-cloudformation aws-cdk infrastructure-as-code nested-stack


【解决方案1】:

嵌套堆栈的最大“区别”是它们成为父堆栈的一部分。这意味着如果有任何事情未能部署所有堆栈(父堆栈和嵌套堆栈),则将回滚为一个。与多个堆栈相比,您可以让第一个成功部署,第二个失败并回滚,第三个甚至不尝试部署。

【讨论】:

    【解决方案2】:

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

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

    就像 python 中的函数一样,嵌套堆栈允许您减少跨各种模板的复制和粘贴量,因为您可以将常用模式捆绑到嵌套堆栈中。就像函数一样,嵌套堆栈可以参数化,因此您可以根据您的需要从单个嵌套堆栈创建资源。

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

    为了避免跨多个堆栈复制和粘贴相同的功能。答案类似于“为什么我应该在 python 中使用函数,如果我可以在需要时将相同的代码复制并粘贴到任何地方?”。

    【讨论】:

    • 嗨@Marcin。感谢您的回答。但我想挑战你,你也可以将常见模式与常规堆栈捆绑在一起。常规堆栈也可以参数化。您可以重用具有不同参数的堆栈。我是正确的还是缺少一些基本原理?
    • @LaimonasSutkus 一种常见的模式是在公共子网中有一个堡垒主机,作为到私有子网的跳转主机。对于不同堆栈中的许多 VPC,堡垒主机的定义通常与随附的安全组相同。那么如何在多个堆栈中定义这个堡垒主机和安全组呢?对于这种情况下的许多人来说,嵌套堆栈是选择,因为您不必复制和粘贴堡垒主机和安全组的相同定义。您只需将一个定义称为嵌套堆栈。
    • 参数化和函数根本不是一回事。函数封装逻辑。是的,您可以使用不同的参数多次重复使用相同的堆栈模板,但是当您需要另一个具有某些相同功能但总体目标完全不同的模板时,这对您没有帮助。
    • @dpwrussell 我从来没有写过它们是“相同的”,只是有“相似”的功能,因为 CFN 不是传统意义上的编程语言。如果您有不同的目标,那么您可以创建不同版本的嵌套堆栈模板。但无论如何,请随时提供您的答案,我会支持它。我很高兴删除我的。
    • @marcin 我正在回复 OP 的评论。你的回答很棒。
    【解决方案3】:

    那么我为什么要在常规堆栈上使用嵌套堆栈呢?各自的优势是什么?

    主要原因是如果堆栈中有超过 500 个资源,则别无选择,只能将其拆分为嵌套堆栈。在 2020 年 10 月之前,这个 500 的限制曾经是 200 个资源。

    【讨论】:

    • 好吧。你不正确。您可以将一个堆栈分成两个堆栈。你不需要嵌套堆栈。
    猜你喜欢
    • 2018-10-01
    • 2018-08-06
    • 2019-03-08
    • 2017-10-18
    • 1970-01-01
    • 2019-04-06
    • 2023-03-07
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多