Назад | Перейти на главную страницу

Условное свойство в AWS CloudFormation

У нас есть шаблон 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": {
        [...]
    }
}