演练:引用另一个 Amazon CloudFormation 堆栈中的资源输出
要将资源从一个 Amazon CloudFormation 堆栈导出到另一个堆栈,可创建跨堆栈引用。利用跨堆栈引用,您可以使用分层架构或面向服务的架构。您可以在单独的堆栈中创建相关的 Amazon 资源,而不是在单个堆栈中包含所有资源;然后您可以引用其他堆栈中的必需资源输出。通过限制对输出的跨堆栈引用,您可以控制由其他堆栈引用的堆栈部分。
例如,您可以将一个带 VPC、安全组和子网的网络堆栈用于公有 Web 应用程序,并且有一个单独的公有 Web 应用程序堆栈。为确保 Web 应用程序能使用网络堆栈中的安全组和子网,可以创建一个使 Web 应用程序堆栈能够引用网络堆栈中的资源输出的跨堆栈引用。借助跨堆栈引用,Web 应用程序堆栈的所有者无需创建或维护联网规则或资产。
要创建跨堆栈引用,可使用 Export
输出字段标记要导出的资源输出的值。然后,使用 Fn::ImportValue
内部函数导入该值。有关更多信息,请参阅 输出 和 Fn::ImportValue:
先决条件
在开始此演练之前,请检查您是否具有使用以下所有服务的 Amazon Identity and Access Management(IAM)权限
注意
Amazon CloudFormation 是一项免费服务。但是,对于堆栈中包含的 Amazon 资源,您需要按各自的现有费率付费。有关 Amazon 定价的更多信息,请参阅每种产品的详细信息页
以下限制适用于跨堆栈引用:
-
对于每个 Amazon 账户,
Export
名称在区域内必须是唯一的。 -
您无法跨区域创建跨堆栈引用。您可以使用内部函数
Fn::ImportValue
仅导入已在同一区域内导出的值。 -
对于输出,
Export
的Name
属性值无法使用依赖于资源的Ref
或GetAtt
函数。同样,
ImportValue
函数无法包含依赖于资源的Ref
或GetAtt
函数。 -
如果其他堆栈引用了堆栈的输出之一,则无法删除该堆栈。
-
您无法修改或移除其他堆栈引用的输出值。
步骤 1:使用示例模板创建网络堆栈
网络堆栈包含您将在 Web 应用程序堆栈中使用的 VPC、安全组和子网。除了这些资源之外,网络堆栈还将创建 Internet 网关和路由表来实现公共访问。
注意
您必须先创建此堆栈,然后才能创建 Web 应用程序堆栈。如果先创建 Web 应用程序堆栈,则它没有安全组或子网。
创建网络堆栈
-
打开 Amazon CloudFormation 控制台
,然后选择 Create stack (创建堆栈)。 -
选择 Template is ready (模板已准备就绪),然后在 Specify template (指定模板) 部分选择 Amazon S3 URL。将以下 URL 复制并粘贴到文本框中:
https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template
该链接提供网络堆栈模板的位置。要查看堆栈将创建的资源,请选择该链接,这将打开模板。在输出部分中,您可看到示例模板导出的联网资源。如果您从其他堆栈导出联网资源,则已导出资源的名称将以堆栈的名称为前缀。当用户导入联网资源时,他们可指定从中导入资源的堆栈。
-
在查看模板后,选择 Next。
-
对于 Stack name (堆栈名称),键入
SampleNetworkCrossStack
,然后选择 Next (下一步)。注意
记录此堆栈的名称。您在启动 Web 应用程序堆栈时需要此堆栈名称。
-
选择 Next(下一步)。在本演练中,您无需添加标记或指定高级设置。
-
确保堆栈名称和模板 URL 正确,然后选择 Create stack (创建堆栈)。
Amazon CloudFormation 创建堆栈可能需要花费几分钟时间。请耐心等待,直到成功创建所有资源,然后再继续创建 Web 应用程序堆栈。
-
要监控进度,可查看堆栈事件。有关更多信息,请参阅在 Amazon Web Services Management Console上查看 Amazon CloudFormation 堆栈数据和资源。
步骤 2:使用示例模板创建 Web 应用程序堆栈
Web 应用程序堆栈将创建一个使用网络堆栈中的安全组和子网的 EC2 实例。
注意
您必须在网络堆栈所在的区域中创建该堆栈。
创建 Web 应用程序堆栈
-
打开 Amazon CloudFormation 控制台
,然后选择 Create stack (创建堆栈)。 -
选择 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
函数从其他堆栈导入联网资源。 -
在查看模板后,选择 Next。
-
对于 Stack name,键入
SampleWebAppCrossStack
。在 Parameters 部分中,让 NetworkStackName 参数使用默认值,然后选择 Next。示例模板使用参数值指定要从中导入值的堆栈。
-
选择 Next(下一步)。在本演练中,您无需添加标记或指定高级设置。
-
确保堆栈名称和模板 URL 正确,然后选择 Create stack (创建堆栈)。
Amazon CloudFormation 创建堆栈可能需要花费几分钟时间。
-
创建该堆栈后,查看其资源并记下实例 ID。有关查看堆栈资源的更多信息,请参阅在 Amazon Web Services Management Console上查看 Amazon CloudFormation 堆栈数据和资源。
要验证实例的安全组和子网,请在 Amazon EC2 控制台
中查看实例的属性。如果实例使用 SampleNetworkCrossStack
堆栈中的安全组和子网,则表示您已成功创建跨堆栈引用。使用控制台可查看堆栈输出和示例网站 URL 以验证 Web 应用程序是否正在运行。有关更多信息,请参阅在 Amazon Web Services Management Console上查看 Amazon CloudFormation 堆栈数据和资源。
步骤 3:清理资源
为了确保不因任何不必要的服务而产生费用,请删除堆栈。
删除堆栈
-
在 Amazon CloudFormation 控制台中,选择 SampleWebAppCrossStack 堆栈。
-
选择 Actions)(操作),然后选择 Delete Stack(删除堆栈)。
-
在确认消息中,选择 Delete (删除)。
-
在删除堆栈后,对 SampleNetworkCrossStack 堆栈重复相同的步骤。
注意
等到 Amazon CloudFormation 完全删除 SampleWebAppCrossStack 堆栈。如果 EC2 实例仍在 VPC 中运行,则 Amazon CloudFormation 不会删除 SampleNetworkCrossStack 堆栈中的 VPC。
将删除您之前创建的所有资源。
使用本演练中的示例模板可构建您自己的跨引用堆栈。