У нас есть шаблон AWS CloudFormation для создания нескольких экземпляров EC2. Однако некоторые из них требуют особого 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 для установки динамического?
я бы изменил структуру на:
"PrivateIpAddress": {
"Fn::If": [ "RequestedPrivateIP",
{ "Ref": "PrivateIP" },
{"Ref" : "AWS::NoValue" }
]
}
AWS :: NoValue предназначен для того, чтобы предоставить вам вариант else для вашего оператора if. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html
Поскольку кажется, что PrivateIpAddress
свойство не поддерживает пустую строку в качестве значения, я бы предложил создать два отдельных ресурса вашего AWS::EC2::Instance
. У одного из них будет твое состояние RequestedPrivateIP
в то время как другой должен иметь такое же условие, но отрицаться, например DidNotRequestPrivateIP
.
"InstanceWithPrivateIp": {
"Type": "AWS::EC2::Instance",
"Condition": "RequestedPrivateIP",
"Properties": {
[...]
}
},
"InstanceWithoutPrivateIp": {
"Type": "AWS::EC2::Instance",
"Condition": "DidNotRequestPrivateIP",
"Properties": {
[...]
}
}