输出与输出之间的差异

时间:2020-06-18 02:01:12

标签: amazon-web-services amazon-cloudformation

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

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

1 个答案:

答案 0 :(得分:5)

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

连锁

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

例如,假设您有两个名为instance.yamleip.yaml的模板。 instance.yaml输出其实例ID(不导出),而eip.yaml将实例ID作为输入参数。

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

  1. 部署instance.yaml并等待其完成。
  2. 请注意,它会输出值(即instance-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::Stack和步骤1中的s3 url创建子实例堆栈。

通过这种方式,eip.yaml将能够使用GetAtt从嵌套堆栈的输出中访问实例ID。

交叉引用

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

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

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

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

交叉引用似乎非常有用,它有一个主要问题,那就是更新或删除交叉引用的stacks非常困难:

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

如果您开始设计并且模板可以经常更改,这将是一个很大的问题。

何时使用哪个?

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

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

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

相关问题