演练:引用另一个 Amazon CloudFormation 堆栈中的资源输出 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

演练:引用另一个 Amazon CloudFormation 堆栈中的资源输出

要将资源从一个 Amazon CloudFormation 堆栈导出到另一个堆栈,可创建跨堆栈引用。利用跨堆栈引用,您可以使用分层架构或面向服务的架构。您可以在单独的堆栈中创建相关的 Amazon 资源,而不是在单个堆栈中包含所有资源;然后您可以引用其他堆栈中的必需资源输出。通过限制对输出的跨堆栈引用,您可以控制由其他堆栈引用的堆栈部分。

例如,您可以将一个带 VPC、安全组和子网的网络堆栈用于公有 Web 应用程序,并且有一个单独的公有 Web 应用程序堆栈。为确保 Web 应用程序能使用网络堆栈中的安全组和子网,可以创建一个使 Web 应用程序堆栈能够引用网络堆栈中的资源输出的跨堆栈引用。借助跨堆栈引用,Web 应用程序堆栈的所有者无需创建或维护联网规则或资产。

要创建跨堆栈引用,可使用 Export 输出字段标记要导出的资源输出的值。然后,使用 Fn::ImportValue 内部函数导入该值。有关更多信息,请参阅 输出Fn::ImportValue

先决条件

在开始此演练之前,请检查您是否具有使用以下所有服务的 Amazon Identity and Access Management(IAM)权限:Amazon VPC、Amazon EC2 和 Amazon CloudFormation。

注意

Amazon CloudFormation 是一项免费服务。但是,对于堆栈中包含的 Amazon 资源,您需要按各自的现有费率付费。有关 Amazon 定价的更多信息,请参阅每种产品的详细信息页

以下限制适用于跨堆栈引用:

  • 对于每个 Amazon Web Services 账户,Export 名称在区域内必须是唯一的。

  • 不能跨区域创建跨堆栈引用。您可以使用内置函数 Fn::ImportValue 仅导入已在同一区域内导出的值。

  • 对于输出,ExportName 属性值无法使用依赖于资源的 RefGetAtt 函数。

    同样,ImportValue 函数无法包含依赖于资源的 RefGetAtt 函数。

  • 如果其他堆栈引用了堆栈的输出之一,则无法删除该堆栈。

  • 您无法修改或移除其他堆栈引用的输出值。

步骤 1:使用示例模板创建网络堆栈

网络堆栈包含您将在 Web 应用程序堆栈中使用的 VPC、安全组和子网。除了这些资源之外,网络堆栈还将创建 Internet 网关和路由表来实现公共访问。

注意

您必须先创建此堆栈,然后才能创建 Web 应用程序堆栈。如果先创建 Web 应用程序堆栈,则它没有安全组或子网。

创建网络堆栈
  1. 打开 Amazon CloudFormation 控制台,然后选择 Create stack (创建堆栈)

  2. 选择 Template is ready (模板已准备就绪),然后在 Specify template (指定模板) 部分选择 Amazon S3 URL。将以下 URL 复制并粘贴到文本框中:https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template

    该链接提供网络堆栈模板的位置。要查看堆栈将创建的资源,请选择该链接,这将打开模板。在输出部分中,您可看到示例模板导出的联网资源。如果您从其他堆栈导出联网资源,则已导出资源的名称将以堆栈的名称为前缀。当用户导入联网资源时,他们可指定从中导入资源的堆栈。

  3. 在查看模板后,选择 Next

  4. 对于 Stack name (堆栈名称),键入 SampleNetworkCrossStack,然后选择 Next (下一步)

    注意

    记录此堆栈的名称。您在启动 Web 应用程序堆栈时需要此堆栈名称。

  5. 选择下一步。在本演练中,您无需添加标记或指定高级设置。

  6. 确保堆栈名称和模板 URL 正确,然后选择 Create stack (创建堆栈)

    Amazon CloudFormation 可能需要几分钟的时间以创建堆栈。请耐心等待,直到成功创建所有资源,然后再继续创建 Web 应用程序堆栈。

  7. 要监控进度,可查看堆栈事件。有关更多信息,请参阅在 Amazon Web Services Management Console上查看 Amazon CloudFormation 堆栈数据和资源

步骤 2:使用示例模板创建 Web 应用程序堆栈

Web 应用程序堆栈将创建一个使用网络堆栈中的安全组和子网的 EC2 实例。

注意

您必须在网络堆栈所在的区域中创建该堆栈。

创建 Web 应用程序堆栈
  1. 打开 Amazon CloudFormation 控制台,然后选择 Create stack (创建堆栈)

  2. 选择 Template is ready (模板已准备就绪),然后在 Specify template (指定模板) 部分选择 Amazon S3 URL。将以下 URL 复制并粘贴到文本框中:https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template

    该链接提供了 Web 应用程序模板的位置。要查看堆栈将创建的资源,请选择该链接,这样会打开模板。在资源部分中,查看 EC2 实例的属性。您可查看如何使用 Fn::ImportValue 函数从其他堆栈导入联网资源。

  3. 在查看模板后,选择 Next

  4. 对于 Stack name,键入 SampleWebAppCrossStack。在 Parameters 部分中,让 NetworkStackName 参数使用默认值,然后选择 Next

    示例模板使用参数值指定要从中导入值的堆栈。

  5. 选择下一步。在本演练中,您无需添加标记或指定高级设置。

  6. 确保堆栈名称和模板 URL 正确,然后选择 Create stack (创建堆栈)

    Amazon CloudFormation 可能需要几分钟的时间以创建堆栈。

  7. 创建该堆栈后,查看其资源并记下实例 ID。有关查看堆栈资源的更多信息,请参阅在 Amazon Web Services Management Console上查看 Amazon CloudFormation 堆栈数据和资源

    要验证实例的安全组和子网,请在 Amazon EC2 控制台中查看实例的属性。如果实例使用 SampleNetworkCrossStack 堆栈中的安全组和子网,则表示您已成功创建跨堆栈引用。

    使用控制台可查看堆栈输出和示例网站 URL 以验证 Web 应用程序是否正在运行。有关更多信息,请参阅在 Amazon Web Services Management Console上查看 Amazon CloudFormation 堆栈数据和资源

步骤 3:清理资源

为了确保不因任何不必要的服务而产生费用,请删除堆栈。

删除堆栈
  1. 在 Amazon CloudFormation 控制台中,选择 SampleWebAppCrossStack 堆栈。

  2. 选择 Actions)(操作),然后选择 Delete Stack(删除堆栈)。

  3. 在确认消息中,选择 Delete (删除)

  4. 在删除堆栈后,对 SampleNetworkCrossStack 堆栈重复相同的步骤。

    注意

    等到 Amazon CloudFormation 完全删除 SampleWebAppCrossStack 堆栈。如果 EC2 实例仍在 VPC 中运行,则 Amazon CloudFormation 不会删除 SampleNetworkCrossStack 堆栈中的 VPC。

    将删除您之前创建的所有资源。

使用本演练中的示例模板可构建您自己的跨引用堆栈。