Kir*_*rst 9 amazon-web-services aws-cloudformation
在 CloudFormation 中,我们能够从模板中输出一些值,以便其他进程、堆栈等可以检索它们。这通常是某物的名称,可能是 URL 或在堆栈创建(部署)期间生成的某物等。
我们还可以从模板“导出”。将值作为“输出”返回与作为“导出”返回有什么区别?
Mar*_*cin 16
常规输出值不能是来自其他堆栈的引用。当您链接或嵌套堆栈并且它们的范围/可见性是本地的时,它们会很有用。导出的输出在帐户和区域内全局可见,并且可供您将来要部署的任何堆栈使用。
链接
当您链接堆栈时,您部署一个堆栈,将其输出,并将其用作要部署的第二个堆栈的输入参数。
例如,假设您有两个名为instance.yaml
和 的模板eip.yaml
。所述instance.yaml
输出其实例的编号(无出口),而eip.yaml
采用实例ID作为输入参数。
要同时部署它们,您必须将它们链接起来:
instance.yaml
并等待其完成。eip.yaml
并传递 instance-id 作为其输入参数。嵌套
当您嵌套堆栈时,您将拥有一个父模板和一个子模板。将从父堆栈内部创建子堆栈。在这种情况下,子堆栈将产生一些输出(不是导出)供父堆栈使用。
例如,让我们再次使用instance.yaml
和eip.yaml
。但这次eip.yaml
将是父母,instance.yaml
将是孩子。也eip.yaml
没有采取任何输入参数,但instance.yaml
输出它的实例ID(而非出口)
在这种情况下,要部署它们,请执行以下操作:
eip.yaml
)上传到 s3eip.yaml
创建使用子实例堆栈AWS :: CloudFormation ::堆栈步骤1中的S3网址和。这种方式eip.yaml
将能够使用GetAtt
.
交叉引用
当您交叉引用堆栈时,您有一个堆栈可以导出它的输出,以便它们可以被同一区域和帐户中的任何其他堆栈使用。
例如,让我们再次使用instance.yaml
和eip.yaml
。instance.yaml
将导出其输出 (instance-id)。要使用 instance-ideip.yaml
必须在其模板中使用ImportValue,而无需任何输入参数或嵌套堆栈。
在这种情况下,要部署它们,请执行以下操作:
instance.yaml
并等待它完成。eip.yaml
将导入实例 ID。尽管交叉引用看起来很有用,但它有一个主要问题,那就是更新或删除交叉引用堆栈非常困难:
另一个堆栈导入输出值后,您不能删除正在导出输出值的堆栈或修改导出的输出值。必须先删除所有导入,然后才能删除导出堆栈或修改输出值。
如果您正在开始设计并且您的模板可能经常更改,这将是非常有问题的。
什么时候用哪个?
当您有一些全局资源将在给定区域和帐户中的许多堆栈之间共享时,请使用交叉引用(导出值)。此外,它们不应该经常更改,因为它们很难修改。常见示例有:用于集中日志记录位置的全局存储桶、VPC。
当您有一些经常部署的通用组件时,请使用嵌套堆栈(而不是导出的输出),但每次它们都可能有所不同。例如:ALB、堡垒主机实例、vpc 接口端点。
最后,链式堆栈(不是导出的输出)对于设计松散耦合的模板很有用,您可以在其中根据新需求混合和匹配模板。
归档时间: |
|
查看次数: |
2465 次 |
最近记录: |