2014-09-30 79 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

相关问题