gpt4 book ai didi

amazon-web-services - 输出和导出之间的区别

转载 作者:行者123 更新时间:2023-12-03 15:42:21 24 4
gpt4 key购买 nike

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

我们还能够从模板“导出”。以“输出”形式返回值与以“导出”形式返回值有什么区别?

最佳答案

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

链接

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

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

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

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

嵌套

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

例如,让我们再次使用 instance.yamleip.yaml。但这次 eip.yaml 将是父级,instance.yaml 将是子级。此外,eip.yaml 不接受任何输入参数,但 instance.yaml 输出其实例 ID(不导出)

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

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

这样 eip.yaml 将能够使用 GetAtt 从嵌套堆栈的输出中访问实例 ID。

交叉引用

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

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

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

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

虽然交叉引用看起来非常有用,但它有一个主要问题,那就是更新或删除交叉引用stacks非常困难。 :

After another stack imports an output value, you can't delete the stack that is exporting the output value or modify the exported output value. All of the imports must be removed before you can delete the exporting stack or modify the output value.

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

何时使用哪个?

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

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

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

关于amazon-web-services - 输出和导出之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62441152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com