2014-09-30 84 views
6

我在嘗試設置一個cloudformation模板,它將啓動一個乾淨的實例或一個來自快照。我希望能夠使用的if/else類型語句,以便看起來像AWS cloudformation可選行

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

東西cloudformation我試圖像許多事情:

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

或包裹中Fn ::如果在{}中:

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

所有這些引發不同類型或錯誤。第一個在雲計算中給出了「遇到不支持的屬性Fn :: If」,第二個只是無效的JSON。我可以快照一個空卷並定義一個大小參數,然後總是傳遞一個SnapshotId和大小,但是我覺得必須有一種方法在雲形成中有一個可選行。

任何想法?

回答

3

你可以這樣做:

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

這裏是一個功能模板的鏈接:https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template

+0

完美的,我不知道我可以定義一個輸入作爲AWS :: NOVALUE,謝謝。 – TristanMatthews 2014-10-02 18:48:17

相關問題