Ссылки на ресурсы между стеками CloudFormation

Если у меня два стека облачной информации, как мне ссылаться на ресурс в одном стеке из другого стека?

В приведенном ниже примере у меня есть стек, который создает том EBS, и я хочу сослаться на него с помощью клавиши Ref: во втором стеке для моего экземпляра EC2, но я продолжаю получать откат, поскольку он не видит этот ресурс из первого стека:

«Ошибка формата шаблона: неразрешенные зависимости ресурсов»

Я уже пробовал предложение 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"
      }
    }
  }
}

person klall    schedule 15.04.2015    source источник


Ответы (1)


В каждом из ваших вложенных стеков у вас должен быть раздел вывода. Затем вы можете получить эти значения в своем стеке вызовов (тот, который вы указали выше) с синтаксисом, например:

      { "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
person chris    schedule 16.04.2015
comment
Чтобы уточнить, на каком уровне я могу использовать Fn :: GetAtt. Это внутри шаблона cf_instances.json? То есть можно что-то подобное сделать? instancei4867d39f: {Тип: AWS :: EC2 :: Instance, Свойства: {... Тома: [{Устройство: / dev / xvdh, VolumeId: {Ref: {Fn :: GetAtt: [CubesNetworking, Outputs.VolumeID]}} }, Или мне нужно передать Output.VolumeID в качестве параметра на один уровень выше в основном шаблоне? - person klall; 16.04.2015
comment
Замечательно. Это просто звучит довольно болезненно - делать большую настройку. - person klall; 16.04.2015
comment
Это. Мы переходим от больших вложенных стеков к отдельным скриптам для каждой части приложения. - person chris; 16.04.2015