输出和输出之间的区别

Kir*_*rst 9 amazon-web-services aws-cloudformation

在 CloudFormation 中,我们能够从模板中输出一些值,以便其他进程、堆栈等可以检索它们。这通常是某物的名称,可能是 URL 或在堆栈创建(部署)期间生成的某物等。

我们还可以从模板“导出”。将值作为“输出”返回与作为“导出”返回有什么区别?

Mar*_*cin 16

常规输出值不能是来自其他堆栈的引用。当您链接嵌套堆栈并且它们的范围/可见性是本地的时,它们会很有用。导出的输出在帐户和区域内全局可见,并且可供您将来要部署的任何堆栈使用。

链接

当您链接堆栈时,您部署一个堆栈,将其输出,并将其用作要部署的第二个堆栈的输入参数。

例如,假设您有两个名为instance.yaml和 的模板eip.yaml。所述instance.yaml输出其实例的编号(无出口),而eip.yaml采用实例ID作为输入参数。

要同时部署它们,您必须将它们链接起来:

  1. 部署instance.yaml并等待其完成。
  2. 请注意,它输出值(即实例 ID)——通常以编程方式完成,而不是手动完成。
  3. 部署eip.yaml并传递 instance-id 作为其输入参数。

嵌套

当您嵌套堆栈时,您将拥有一个父模板和一个子模板。将从父堆栈内部创建子堆栈。在这种情况下,子堆栈将产生一些输出(不是导出)供父堆栈使用。

例如,让我们再次使用instance.yamleip.yaml。但这次eip.yaml将是父母,instance.yaml将是孩子。也eip.yaml没有采取任何输入参数,但instance.yaml 输出它的实例ID(而非出口)

在这种情况下,要部署它们,请执行以下操作:

  1. 将父模板 ( eip.yaml)上传到 s3
  2. eip.yaml创建使用子实例堆栈AWS :: CloudFormation ::堆栈步骤1中的S3网址和。

这种方式eip.yaml将能够使用GetAtt.

交叉引用

当您交叉引用堆栈时,您有一个堆栈可以导出它的输出,以便它们可以被同一区域和帐户中的任何其他堆栈使用。

例如,让我们再次使用instance.yamleip.yamlinstance.yaml将导出其输出 (instance-id)。要使用 instance-ideip.yaml必须在其模板中使用ImportValue,而无需任何输入参数或嵌套堆栈。

在这种情况下,要部署它们,请执行以下操作:

  1. 部署instance.yaml并等待它完成。
  2. Deployeip.yaml将导入实例 ID。

尽管交叉引用看起来很有用,但它有一个主要问题,那就是更新或删除交叉引用堆栈非常困难:

另一个堆栈导入输出值后,您不能删除正在导出输出值的堆栈或修改导出的输出值。必须先删除所有导入,然后才能删除导出堆栈或修改输出值。

如果您正在开始设计并且您的模板可能经常更改,这将是非常有问题的。

什么时候用哪个?

当您有一些全局资源将在给定区域和帐户中的许多堆栈之间共享时,请使用交叉引用(导出值)。此外,它们不应该经常更改,因为它们很难修改。常见示例有:用于集中日志记录位置的全局存储桶、VPC。

当您有一些经常部署的通用组件时,请使用嵌套堆栈(而不是导出的输出),但每次它们都可能有所不同。例如:ALB、堡垒主机实例、vpc 接口端点。

最后,链式堆栈(不是导出的输出)对于设计松散耦合的模板很有用,您可以在其中根据新需求混合和匹配模板。

  • 在上面的嵌套下,您将 child 指定为 eip.yml。这是一个错字吗?在上面的段落中,您指定 child 是instance.yml。那么哪个是哪个?请澄清 (2认同)

jum*_*key 6

这里的简短回答是,export 在堆栈之间使用,并output嵌套堆栈一起使用。

出口

要在堆栈之间共享信息,请导出堆栈的输出值。同一 AWS 账户和区域中的其他堆栈可以导入导出的值。

输出

通过嵌套堆栈,您可以从单个堆栈部署和管理所有资源。您可以使用嵌套堆栈组中一个堆栈的输出作为该组中另一堆栈的输入。这与导出值不同。