Как устранить циклическую зависимость в AWS Cloudformation

Я создал шаблон AWS Cloudformation, и мне не удается преодолеть циклическую зависимость. Я создаю экземпляр EC2 и балансировщик нагрузки, балансировщик нагрузки зависит от экземпляра EC2, потому что он ссылается на него в своих свойствах экземпляров. Все работало нормально, пока мне не пришлось ссылаться на свойство DNSName балансировщика нагрузки в разделе инициализации экземпляра EC2.

"AppServer": {
  "Type": "AWS::EC2::Instance",
  "Metadata": {
    "AWS::CloudFormation::Init" : {
      "configSets" : {
        "Install" : [ "Install" ]
      },
       ...
       ...
       ...
      "Install" : {
        "commands" : {
           "update hostname rmi" : {
            "command" : { "Fn::Join" : [ "", [ "runuser -lm rlt -c \"/home/ec2-user/awscf/update-rmi.sh ", { "Fn::GetAtt" : [ "WebLoadBalancer", "DNSName" ] }, "\"" ] ] }
          },
         }

Итак, проблема здесь в том, что экземпляр EC2 не может ссылаться на балансировщик нагрузки, потому что он не был создан, и балансировщик нагрузки не может быть создан первым, потому что ему нужен идентификатор экземпляра EC2, чтобы его можно было связать с ним.

Я посмотрел на WaitConditions, а также на CreationPolicy, но, если я не понимаю, как они работают, я не думаю, что они мне помогут. По сути, мне нужно: а) создать экземпляр EC2, но не выполнять UserData, пока не будет создан LoadBalancer, или б) сначала создать LoadBalancer и не связывать его с экземпляром EC2, после создания экземпляра EC2 вернуться и обновите LoadBalancer, чтобы связать его с экземпляром EC2. Кто-нибудь знает, возможно ли что-то подобное? Помимо создания полного стека, а затем возврата и обновления его вручную? В идеале я бы хотел, чтобы это произошло при единственном создании стека.


person so cal cheesehead    schedule 02.06.2016    source источник
comment
Вы можете использовать AutoscalingGroup с конфигурацией запуска, чтобы отделить зависимость ELB от экземпляра EC2.   -  person kavin    schedule 03.06.2016
comment
ELB instances не является обязательным полем. Почему бы не удалить его, а ваш скрипт добавить себя в ELB?   -  person tedder42    schedule 04.06.2016
comment
@ tedder42 это одна из моих первых мыслей, но как мне это сделать? Можно ли вернуться и изменить ELB в том же шаблоне после его создания? Я стараюсь избегать изменения шаблона после создания стека.   -  person so cal cheesehead    schedule 04.06.2016


Ответы (2)


Вы можете изучить использование вспомогательного сценария cfn-get-metadata из экземпляра EC2 для получения информации Stack :: Resource.

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-get-metadata.html

person dotariel    schedule 21.06.2016

Возможно, вам потребуется добавить Ref с каждым логическим именем ресурса.

У меня такая же ошибка (круговая зависимость), когда у меня было:

  UserData:
    Fn::Base64:
      !Sub  |
      #!/bin/bash -xe
      # ...
      echo "<h1>I amrunning on ASG ${MyAutoScalingGroup}</h1>

Добавление Ref разрешает это следующим образом:

  UserData:
    Fn::Base64:
      !Sub  |
      #!/bin/bash -xe
      # ...
      echo "<h1>I amrunning on ASG ${!Ref MyAutoScalingGroup}</h1>

Примечание. Я использую YAML, поскольку JSON ужасно плохо работает с Cloudformation.

person Abdennour TOUMI    schedule 16.12.2017