这些可能是在提出此问题后添加的,但对于现在遇到此问题的任何人,都可以使用 CloudFormation 中的条件来完成。
因此,如果我们从您的参数声明开始
"Parameters" : {
"SecurityGroup" : {
"Description" : "Name of an existing EC2 Security Group ",
"Type" : "String",
"Default" : "default",
"MinLength": "1",
"MaxLength": "64",
"AllowedPattern" : "[-_ a-zA-Z0-9]*",
"ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores."
},
},
我们可以添加一个Conditions
带有条件的声明ShouldCreateSecurityGroup
"Conditions" : {
"ShouldCreateSecurityGroup" : {"Fn::Equals" : [{"Ref" : "SecurityGroup"}, "default"]}
},
此条件现在可用于告诉 CloudFormation 是否创建安全组:
"Resources": {
"NewSecurityGroup": {
"Type" : "AWS::EC2::SecurityGroup",
"Condition" : "ShouldCreateSecurityGroup"
"Properties" : {
"SecurityGroupEgress" : [ Security Group Rule, ... ],
"SecurityGroupIngress" : [ Security Group Rule, ... ],
}
}
}
那么当你去引用this里面的值的时候,你可以使用Fn::If Conditional函数来说明你是想使用SecurityGroup
参数中的值还是NewSecurityGroup
Resource中的值。例如,要将值传递给SecurityGroups
EC2 实例的参数,我们可以使用{"Fn::If}
如下:
"Server": {
{
"Type" : "AWS::EC2::Instance",
"Properties" : {
...
"SecurityGroups" : [ {"Fn::If": ["ShouldCreateSecurityGroup", {"Ref": "NewSecurityGroup"}, {"Ref": "SecurityGroup"}]} ],
}
}
}