在CloudFormation堆栈之间引用资源

时间:2015-04-15 23:20:23

标签: amazon-web-services amazon-cloudformation

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

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

“模板格式错误:未解决的资源依赖性”

我已经尝试过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"
      }
    }
  }
}

1 个答案:

答案 0 :(得分:6)

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

      { "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