在CloudFormation中,我们能够从模板中输出某些值,以便可以由其他进程,堆栈等检索它们。这通常是名称的名称,可能是URL或在堆栈创建(部署)过程中生成的内容等
我们还可以从模板“导出”。返回值作为“输出”与“导出”有什么区别?
答案 0 :(得分:5)
常规输出值不能是其他堆栈的引用。当您链接或嵌套并且其范围/可见性是本地的时,它们会很有用。导出的输出在帐户和区域内全局可见,并且可供将来部署的任何堆栈使用。
连锁
在链接堆栈时,将部署一个堆栈,将其作为输出,并用作要部署的第二个堆栈的输入参数。
例如,假设您有两个名为instance.yaml
和eip.yaml
的模板。 instance.yaml
输出其实例ID(不导出),而eip.yaml
将实例ID作为输入参数。
要同时部署它们,必须将它们链接起来:
instance.yaml
并等待其完成。eip.yaml
并传递instance-id作为其输入参数。嵌套
嵌套堆栈时,将有一个父模板和一个子模板。子堆栈将从父堆栈内部创建。在这种情况下,子堆栈将产生一些输出(而不是导出)供父堆栈使用。
例如,让我们再次使用instance.yaml
和eip.yaml
。但是这次eip.yaml
将是父级,instance.yaml
将是子级。此外,eip.yaml
不接受任何输入参数,但是instance.yaml
输出其实例ID(不导出)
在这种情况下,要部署它们,请执行以下操作:
eip.yaml
)上载到s3 eip.yaml
中,使用AWS::CloudFormation::Stack和步骤1中的s3 url创建子实例堆栈。通过这种方式,eip.yaml
将能够使用GetAtt
从嵌套堆栈的输出中访问实例ID。
交叉引用
交叉引用堆栈时,只有一个堆栈可以导出其输出,以便同一区域和帐户中的任何其他堆栈可以使用它们。
例如,让我们再次使用instance.yaml
和eip.yaml
。 instance.yaml
将导出其输出(实例ID)。要使用实例ID eip.yaml
,必须在其模板中使用ImportValue,而无需任何输入参数或嵌套堆栈。
在这种情况下,要部署它们,请执行以下操作:
instance.yaml
并等待其完成。eip.yaml
,它将导入实例ID。 交叉引用似乎非常有用,它有一个主要问题,那就是更新或删除交叉引用的stacks非常困难:
另一个堆栈导入输出值之后,您不能删除正在导出输出值的堆栈或修改导出的输出值。必须先删除所有导入,然后才能删除导出堆栈或修改输出值。
如果您开始设计并且模板可以经常更改,这将是一个很大的问题。
何时使用哪个?
当您拥有一些全局资源时,请使用交叉引用(导出的值),这些资源将在给定区域和帐户中的许多堆栈之间共享。另外,由于难以修改,因此不应经常更改。常见的示例有:用于集中式日志记录位置的全局存储桶,VPC。
当您有一些经常部署的常见组件时,请使用嵌套堆栈(而不是导出的输出),但是每次它们可能都有些不同。例如:ALB,堡垒主机实例,vpc接口端点。
最后,链式堆栈(不导出输出)对于设计松耦合模板很有用,您可以在其中根据新要求混合和匹配模板。