我怎样才能从 AWS CloudFormation 模板中引用其他堆栈中的资源?

2 分钟阅读
0

我想要在创建模板时引用其他 AWS CloudFormation 堆栈中的资源。

简短描述

以下解决方法提供了一种创建跨堆栈引用的方法的示例。有关其他说明,请参阅演练: 引用其他 AWS CloudFormation 堆栈中的资源输出

**注意:**要引用其他 AWS CloudFormation 堆栈中的资源,必须先创建跨堆栈引用。要创建跨堆栈引用,请使用 export 字段标记要导出的资源输出的值。然后,使用 Fn::ImportValue 内部函数将值导入同一 AWS 区域和账户内的任何堆栈中。AWS CloudFormation 通过模板中指定的名称来标识导出的值。这些名称对于您的 AWS 区域和账户必须是唯一的。

解决方法

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

创建用于导出输出值的堆栈

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

2.    将堆栈命名为 NetworkStack

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

使用导入的子网和安全组创建 Amazon Elastic Compute Cloud(Amazon EC2)实例

1.    打开 AWS CloudFormation 控制台

2.    依次选择 Create Stack(创建堆栈)和 Design template(设计模板)。

3.    在代码编辑器的 Parameters(参数)选项卡中,选择 Template(模板)。

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.    选择 Create stack(创建堆栈)图标,然后选择 Next(下一步)。

6.    在 Stack name(堆栈名称)中,输入堆栈的名称。

7.    在 Parameters(参数)中,输入要交叉引用的网络堆栈名称(NetworkStack)。

8.    选择 Next(下一步),再次选择 Next(下一步),然后选择 Create(创建)。

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

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

11.    选择 Description(描述)视图,然后验证是否已配置安全组和子网。

**重要事项:**当其他堆栈正在导入源堆栈或源堆栈的导出值时,您无法删除它们。要更新源堆栈的导出值,请先手动替换要导入源堆栈导出值的堆栈中的实际值。然后,您可以更新源堆栈的导出值。

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

相关信息

如何在 AWS Systems Manager Parameter Store 中使用参数在 CloudFormation 堆栈之间共享值?

AWS CloudFormation 模板

AWS::EC2::Instance

AWS 官方
AWS 官方已更新 1 年前