如何在 AWS CloudFormation 模板中引用另一个堆栈中的资源?

上次更新时间:2019 年 7 月 23 日

如何在创建模板时引用另一个 AWS CloudFormation 堆栈中的资源?

简短描述

以下解决方法列举了一个创建跨堆栈引用的方法。有关更多说明,请参阅演练:引用另一个 AWS CloudFormation 堆栈中的资源输出

注意:要引用另一个 AWS CloudFormation 堆栈中的资源,您必须创建跨堆栈引用。要创建跨堆栈引用,请使用导出字段标记要导出的资源输出的值。然后,使用 Fn::ImportValue 内部函数导入同一区域和账户内任一堆栈中的值。导出的值使用模板中指定的名称进行标识。这些名称必须是您的区域和账户中的唯一名称。

解决方法

以下为创建名为 NetworkStack 的 AWS CloudFormation 堆栈的步骤。此堆栈会创建与网络相关的资源,以及名为 ${AWS::StackName}-SecurityGroupID${AWS::StackName}-SubnetID 的导出。堆栈创建之后,${AWS::StackName} 会被替换为 NetworkStack。最终的导出名称为 NetworkStack-SecurityGroupIDNetworkStack-SubnetID

创建堆栈以导出输出值

1.    使用此模板创建 AWS CloudFormation 堆栈

2.    将此堆栈命名为 NetworkStack

注意:NetworkStack 会导出子网和安全组值。

使用导入的子网和安全组创建 EC2 实例

1.    打开 AWS CloudFormation 控制台

2.    选择创建堆栈,然后选择设计模板

3.    在代码编辑器中的参数选项卡中,选择模板

4.    复制以下模板并将其粘贴到代码编辑器,然后,使用 InstanceTypeImageId 的相应值更新模板。

{
  "Parameters": {
    "NetworkStackParameter": {
      "Type": "String"
    }
  },
  "Resources": {
    "WebServerInstance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t2.micro",
        "ImageId": "ami-a1b23456",
        "NetworkInterfaces": [
          {
            "GroupSet": [
              {
                "Fn::ImportValue": {
                  "Fn::Sub": "${NetworkStackParameter}-SecurityGroupID"
                }
              }
            ],
            "AssociatePublicIpAddress": "true",
            "DeviceIndex": "0",
            "DeleteOnTermination": "true",
            "SubnetId": {
              "Fn::ImportValue": {
                "Fn::Sub": "${NetworkStackParameter}-SubnetID"
              }
            }
          }
        ]
      }
    }
  }
}

重要提示:在第 4 步中的模板中,将 NetworkStack 资源堆栈用作 NetworkStackParameter 的值。NetworkStack 值会替换相应 Fn::ImportValue 函数中的相应堆栈名称。

注意:有关导入和导出模板的示例,请参阅 Fn::ImportValue

5.    选择创建堆栈图标,然后选择下一步

6.    在堆栈名称部分输入您的堆栈名称。

7.    在参数部分输入您想交叉引用的网络堆栈名称 (NetworkStack)。

8.    选择下一步,继续选择下一步,然后选择创建

9.    堆栈创建完之后,请打开 Amazon EC2 控制台

10.    在导航窗格中,选择实例,然后选择使用第 4 步中的模板创建的实例。

11.    选择描述视图,然后确认安全组和子网是否已配置。

重要提示:当另一个堆栈导入导出值时,您无法删除源堆栈或源堆栈的导出值。要更新源堆栈的导出值,请手动替换正在导入源堆栈导出值的堆栈中的实际值。然后,您可以更新源堆栈的导出值。

要列出正在导入已导出的输出值的所有堆栈,请运行 list-imports 命令。要列出 AWS 区域中的所有导出,请使用 AWS CloudFormation 控制台或运行 list-exports 命令。每个 AWS 区域的账户的导出名称必须是唯一的。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?