在 CloudFormation 堆栈之间引用资源

Referencing Resources between CloudFormation stacks

如果我有两个 cloudformation 堆栈,我如何从另一个堆栈引用一个堆栈中的资源?

在下面的示例中,我有一个创建 EBS 卷的堆栈,我想通过 Ref: 键在我的 EC2 实例的第二个堆栈中引用它,但我不断收到回滚,因为它看不到该资源从第一个堆栈开始:

"Template format error: Unresolved resource dependencies"

我已经尝试过 DependsOn 子句,但没有用。我需要通过参数传递信息吗?

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "CubesNetworking": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL":     "https://s3.amazonaws.com/mybucket/cf_network.json"
      }
   },
   "CubesInstances": {
     "DependsOn": ["CubesNetworking"],
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3.amazonaws.com/mybucket/cf_instances.json"
      }
    }
  }
}

在每个嵌套堆栈中,您都应该有一个输出部分。然后,您可以使用如下语法在调用堆栈(上面列出的堆栈)中获取这些值:

      { "Fn::GetAtt" : [ "CubesNetworking", "Outputs.VolumeID" ] }

然后您通过参数将这些值传递到您的其他嵌套堆栈中:

  "Parameters" : {
      "VolumeId" : { "Fn::GetAtt" : [ "CubesNetworking", "Outputs.VolumeID" ] }

您仍然需要 DependsOn,因为您需要在实例之前创建的卷。

编辑,2017 年年中:

CloudFormation 引入了从一个堆栈导出值并在不必嵌套的其他堆栈中引用它们的功能。

所以你的输出可以指定一个导出:

Outputs:
  Desc:
    Value: !Ref CubesNetworking.VolumeID
    Export:
      Name: some-unique-name

然后在另一个堆栈中:

Fn::ImportValue: some-unique-name