使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

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

2 分钟阅读
0

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

解决方法

要引用其他 CloudFormation 堆栈中的资源,必须先创建跨堆栈引用。以下解决方法通过示例介绍了一种创建跨堆栈引用的方法。示例 NetworkStack 堆栈创建了 ${AWS::StackName}-SecurityGroupID${AWS::StackName}-SubnetID 网络相关资源并导出。创建堆栈后,CloudFormation 将 ${AWS::StackName} 替换为 NetworkStack。最终的导出名称为 NetworkStack-SecurityGroupIDNetworkStack-SubnetID

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

完成以下步骤:

  1. 创建 CloudFormation 堆栈,然后使用 SampleNetworkCrossStack 模板。
    注意:必须在模板的输出部分声明导出字段。
  2. 将堆栈命名为 NetworkStack
    **注意:**NetworkStack 导出子网和安全组值。

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

Amazon Elastic Compute Cloud(Amazon EC2)实例属性(例如 SubnetIdSecurityGroupId)使用导出堆栈中的值。要导入这些值,请使用 Fn::ImportValue 内置函数。

**注意:**导入和导出堆栈必须位于同一 AWS 区域和 AWS 账户中。此外,导出的值名称对于您的区域和账户必须是唯一的。

要创建 EC2 实例,请完成以下步骤:

  1. 打开 CloudFormation 控制台
  2. 依次选择创建堆栈设计模板
  3. 选择代码编辑器的参数选项卡,然后选择模板
  4. 要使用导出堆栈中的值来创建实例,请在代码编辑器中输入以下模板:
    **重要事项:**将 NetworkStack 资源栈设置为 NetworkStackParameter 的值。NetworkStack 值取代了对应 Fn::ImportValue 函数中的正确堆栈名称。
    {  "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"
                  }
                }
              }
            ]
          }
        }
      }
    }
    **注意:**将 t2.micro 替换为相应实例类型,将 ami-a1b23456 替换为相应亚马逊机器映像(AMI)ID。
  5. 选择创建堆栈(带有向上箭头的云图标),然后选择下一步
  6. 对于堆栈名称,输入堆栈的名称。
  7. 参数中,输入要交叉引用的网络堆栈名称(例如NetworkStack)。
  8. 选择下一步,然后再次选择下一步
  9. 选择创建
  10. 堆栈状态更改为 CREATE_COMPLETE 后,打开 Amazon EC2 控制台
  11. 在导航窗格中,选择实例,然后选择创建的实例。
  12. 选择描述选项卡,然后验证是否已配置安全组和子网。

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

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

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保使用的是最新版本的 AWS CLI

相关信息

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

AWS CloudFormation 模板

AWS::EC2::Instance

引用其他 CloudFormation 堆栈中的资源输出

AWS 官方
AWS 官方已更新 2 个月前