Propriedade condicional no AWS CloudFormation

8

Temos um modelo do AWS CloudFormation para criar algumas instâncias do EC2. No entanto, alguns deles exigem um PrivateIpAddress específico e estou com dificuldades para descobrir como incorporar isso ao modelo.

Por enquanto, tenho um parâmetro de modelo PrivateIP e uma condição de criação RequestedPrivateIP . Por enquanto, tudo bem. No entanto, não consigo descobrir como incorporá-lo à especificação de recurso AWS::EC2::Instance . Eu tentei isso:

    "PrivateIpAddress": {
        "Fn::If": [ "RequestedPrivateIP",
            { "Ref": "PrivateIP" },
            ""                            <-- This doesn't work
        ]
    },

Mas isso falha quando RequestedPrivateIP é falso com

CREATE_FAILED    AWS::EC2::Instance    NodeInstance    Invalid addresses: []

Alguma ideia de como, opcionalmente, atribuir um IP privado estático e, se não especificado, deixá-lo para a AWS definir um dinâmico?

    
por MLu 19.11.2014 / 00:38

2 respostas

17

eu mudaria a estrutura para:

"PrivateIpAddress": {
    "Fn::If": [ "RequestedPrivateIP",
        { "Ref": "PrivateIP" },
        {"Ref" : "AWS::NoValue" }
    ]
}

o AWS :: NoValue está lá para lhe dar a opção else para sua declaração if. link

    
por 15.01.2015 / 04:03
0

Como parece que a propriedade PrivateIpAddress não suporta uma string vazia como valor, sugiro criar dois recursos separados do seu AWS::EC2::Instance . Um deles terá sua condição RequestedPrivateIP , enquanto o outro deverá ter a mesma condição, mas negado, por ex. DidNotRequestPrivateIP .

"InstanceWithPrivateIp": {
    "Type": "AWS::EC2::Instance",
    "Condition": "RequestedPrivateIP",
    "Properties": {
        [...]
    }
},

"InstanceWithoutPrivateIp": {
    "Type": "AWS::EC2::Instance",
    "Condition": "DidNotRequestPrivateIP",
    "Properties": {
        [...]
    }
}
    
por 02.12.2014 / 12:23