2016-06-02 15 views
1

Ich habe eine AWS Cloudformationsvorlage erstellt, und ich habe Probleme, eine zyklische Abhängigkeit zu umgehen. Ich erstelle eine EC2-Instanz und einen Load Balancer, der Load Balancer hängt von der EC2-Instanz ab, da sie in den Instances-Eigenschaften darauf verweist. Alles funktionierte einwandfrei, bis ich auf die DNSName-Eigenschaft des Load Balancers im Init-Abschnitt der EC2-Instanz verweisen musste.So lösen Sie eine zirkuläre Abhängigkeit in AWS Cloudformation

"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" ] }, "\"" ] ] } 
      }, 
     } 

So, hier ist das Problem, dass die EC2-Instanz nicht den Load-Balancer verweisen kann, weil es nicht erst geschaffen werden kann und der Load Balancer nicht erstellt wurde, weil es die EC2-Instanz-ID, so braucht es kann damit verbunden sein.

Ich schaute auf WaitConditions sowie CreationPolicy, aber wenn ich nicht falsch verstehe, wie sie arbeiten, glaube ich nicht, dass sie mir helfen werden. Im Wesentlichen benötige ich a) Erstellen Sie die EC2-Instanz, aber führen Sie UserData erst aus, wenn der LoadBalancer erstellt wurde oder b) Erstellen Sie zuerst den LoadBalancer und verknüpfen Sie ihn nicht mit der EC2-Instanz, nachdem die EC2-Instanz erstellt wurde und aktualisieren Sie den LoadBalancer, um ihn der EC2-Instanz zuzuordnen. Weiß jemand, ob sowas möglich ist? Außerhalb des Erstellens des vollen Stapels, dann zurückgehen und es manuell aktualisieren? Idealerweise möchte ich, dass dies bei der einmaligen Erstellung des Stapels geschieht.

+0

Sie können AutoscalingGroup mit Launch-Konfiguration verwenden, um die ELB-Abhängigkeit von der EC2-Instanz zu trennen. – kavin

+0

ELBs 'Instanzen' sind kein Pflichtfeld. Warum nicht entfernen Sie es und lassen Sie Ihr Skript sich zum ELB hinzufügen? – tedder42

+0

@ Tedder42 das ist einer meiner ersten Gedanken, aber wie würde ich das tun? Ist es möglich, zurückzugehen und den ELB in der gleichen Vorlage zu ändern, nachdem er erstellt wurde? Ich versuche, die Vorlage nicht zu ändern, nachdem der Stapel erstellt wurde. –

Antwort

0

Sie müssen möglicherweise Ref mit jeder Ressource logischen Namen hinzuzufügen.

Ich habe den gleichen Fehler (zirkuläre Abhängigkeit), wenn ich hatte:

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

Hinzufügen Ref löst es wie folgt:

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

Anmerkung: Ich YAML seit JSON bin mit ist schrecklich mit Wolkenbildung.

Verwandte Themen