AWS cloudformation可选行

时间:2014-09-30 23:02:24

标签: amazon-web-services amazon-cloudformation

我正在尝试设置一个云形式模板,该模板将启动一个干净的实例或一个来自快照的实例。我希望能够使用if / else类型语句,使其看起来像

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 :: If in {}:

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

所有这些都会导致不同的类型或错误。第一个在cloudformation中给出了“遇到不支持的属性Fn :: If”,第二个只是无效的JSON。我可以快照一个空卷并定义一个大小参数,然后总是传递一个SnapshotId和大小,但我觉得必须有一种方法可以在cloudformation中有一个可选的行。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

你可以这样做:

 "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