2014-09-30 5 views
6

Sto provando a configurare un modello di cloudformation che avvierà un'istanza pulita o uno da istantanee. Mi piacerebbe essere in grado di utilizzare un tipo di istruzione if/else in modo che sarebbe simile aAWS cloudformation opzionale line

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

In cloudformation ho provato un certo numero di cose come:

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

O avvolgendo la a Fn :: Se in {}:

{"Fn::If" : [ 
     {"Ref" : "FromSnapshot"}, 
     {"SnapshotId" : { "Ref" : "InputSnapshotId" }}, 
     {"Size" : "20"} 
    ]} 

Tutto che prende il tipo o errori diversi. Il primo dà una "FN :: If" nella proprietà cloud non verificata incontrata, mentre la seconda non è JSON valida. Potrei creare uno snapshot di un volume vuoto e definire un parametro di dimensione, quindi passare sempre uno SnapshotId e la dimensione, ma mi sembra che ci debba essere un modo per avere una linea opzionale in cloudformation.

Qualche idea?

risposta

3

Si può fare in questo modo:

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

Ecco un link a un modello funzionale: https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template

+0

Perfetto, non mi rendo conto che potrei definire un ingresso come AWS :: NoValue, grazie. – TristanMatthews