我们有一个用于创建一些 EC2 实例的 AWS CloudFormation 模板。但其中一些需要特定的PrivateIpAddress
,而我正在努力弄清楚如何将其合并到模板中。
现在我有一个模板参数PrivateIP
和一个创建的条件RequestedPrivateIP
。到目前为止一切顺利。但是我不知道如何将其合并到AWS::EC2::Instance
资源规范中。我试过这个:
"PrivateIpAddress": {
"Fn::If": [ "RequestedPrivateIP",
{ "Ref": "PrivateIP" },
"" <-- This doesn't work
]
},
但当RequestedPrivateIP
CREATE_FAILED AWS::EC2::Instance NodeInstance Invalid addresses: []
知道如何选择性地分配静态私有 IP 吗?如果未指定,则让 AWS 设置动态 IP?
答案1
我将把结构改为:
"PrivateIpAddress": {
"Fn::If": [ "RequestedPrivateIP",
{ "Ref": "PrivateIP" },
{"Ref" : "AWS::NoValue" }
]
}
AWS::NoValue 为您的 if 语句提供了 else 选项。 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html
答案2
由于该属性似乎PrivateIpAddress
不支持将空字符串作为其值,因此我建议创建两个单独的资源AWS::EC2::Instance
。其中一个将满足您的条件RequestedPrivateIP
,而另一个应具有相同的条件但被否定,例如DidNotRequestPrivateIP
。
"InstanceWithPrivateIp": {
"Type": "AWS::EC2::Instance",
"Condition": "RequestedPrivateIP",
"Properties": {
[...]
}
},
"InstanceWithoutPrivateIp": {
"Type": "AWS::EC2::Instance",
"Condition": "DidNotRequestPrivateIP",
"Properties": {
[...]
}
}