Sometimes you want a CloudFormation Parameter to be optional. Unfortunately a blank Parameter contains an empty string. If you pass this empty string to e.g. the KeyName Property of an EC2 Instance or Launch Configuration you end up with a validation error.
Imagine the following CloudFormation template:
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Optional Parameters in CloudFormation: Problem", "Parameters": { "KeyName": { "Description": "Provides the name of the EC2 key pair", "Type": "String" } }, "Resources": { "LaunchConfiguration": { "Type": "AWS::AutoScaling::LaunchConfiguration", "Properties": { "KeyName": {"Ref": "KeyName"} [...] } } } }
If you leave the KeyName blank you will get the following error:
Parameter validation failed: parameter value for parameter name KeyName does not exist. Rollback requested by user.
The solution is the make use of CloudFormation Conditions, the Condition Function Fn::If and the Pseudo Parameter AWS::NoValue.