AWS cloudformation optional line

I'm trying to setup a cloudformation template that will either launch a clean instance or one from snapshots. I'd like to be able to use an if / else type statement so that would look something like

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

In cloudformation I have tried a number of things like:

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

Or wrapping the in Fn::If in {}:

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

All of which kicks different types or errors. The first one gives a "Encountered unsupported property Fn::If" in cloudformation, the second, just isn't valid JSON. I could snapshot an empty volume and define a size parameter then always pass a SnapshotId and size but I feel like there must be a way to have an optional line in cloudformation.

Any ideas?


You can do like this:

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

Here is a link to a functional template: https://github.com/caussourd/public-cloudformation-templates/blob/master/conditional_volume_creation.template

链接地址: http://www.djcxy.com/p/81720.html

上一篇: 功能分支仍然(或曾经)被认为是不好的做法?

下一篇: AWS云形成可选行