2014-09-30 3 views
6

Ich versuche, eine Cloud-Vorlage zu erstellen, die entweder eine saubere Instanz oder eine aus Snapshots startet. Ich möchte in der Lage sein, eine if/else Typen Aussage zu verwenden, so dass so etwas wieAWS cloudformation optionale Zeile

pseudo code: 
if InputSnapshotId: 
    "SnapshotId" : {"Ref" : "InputSnapshotId"}, 
else: 
    "Size" : 20, 

In Cloudformation aussehen würde ich eine Reihe von Dingen wie versucht:

"WebserverInstanceDataVolume" : { 
    "Type" : "AWS::EC2::Volume", 
    "Properties" : { 
    "Fn::If" : [ 
     {"Ref" : "FromSnapshot"}, 
     {"SnapshotId" : { "Ref" : "InputSnapshotId" }}, 
     {"Size" : "20"} 
    ], 
    "VolumeType" : "standard", 
    "AvailabilityZone" : { "Fn::GetAtt" : [ "WebserverInstance", "AvailabilityZone" ]}, 
    "Tags" : [ 
     {"Key" : "Role", "Value": "data" }, 
    ] 
    }, 
    "DeletionPolicy" : "Delete" 
}, 

Oder Einwickeln des in Fn :: If in {}:

All dies führt zu unterschiedlichen Arten oder Fehlern. Der erste gibt eine "Gefundene nicht unterstützte Eigenschaft Fn :: If" in der Cloud-Formation, der zweite ist einfach nicht gültig JSON. Ich könnte ein leeres Volumen aufnehmen und einen Größenparameter definieren und dann immer eine SnapshotId und Größe übergeben, aber ich habe das Gefühl, dass es eine Möglichkeit geben muss, eine optionale Linie in der Wolkenbildung zu haben.

Irgendwelche Ideen?

Antwort

3

Sie können wie folgt tun:

"Conditions" : { 
    "NotUseSnapshot" : {"Fn::Equals" : [{"Ref" : "InputSnapshotId"}, ""]} 
    }, 

    "Resources" : { 
    "WebserverInstanceDataVolume" : { 
     "Type" : "AWS::EC2::Volume", 
     "Properties" : { 
     "Size" : { 
      "Fn::If" : [ 
       "NotUseSnapshot", 
       "20", 
       {"Ref" : "AWS::NoValue"} 
      ] 
     }, 
     "SnapshotId" : { 
      "Fn::If" : [ 
       "NotUseSnapshot", 
       {"Ref" : "AWS::NoValue"}, 
       {"Ref" : "InputSnapshotId"} 
      ] 
     }, 
     "VolumeType" : "standard", 
     "AvailabilityZone" : { "Fn::GetAtt" : [ "WebserverInstance", "AvailabilityZone" ]}, 
     "Tags" : [ 
      {"Key" : "Role", "Value": "data" } 
     ] 
     }, 
     "DeletionPolicy" : "Delete" 
    } 
    } 

Hier ist ein Link zu einer Funktionsvorlage: https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template

+0

Perfect, ich wusste nicht, dass ich einen Eingang als AWS :: NoValue definieren könnte, danke. – TristanMatthews