Propiedad condicional en AWS CloudFormation

10

Tenemos una plantilla de AWS CloudFormation para crear algunas instancias EC2. Sin embargo, algunos de ellos requieren un específico PrivateIpAddressy estoy luchando por descubrir cómo incorporar eso a la plantilla.

Por ahora tengo un parámetro de plantilla PrivateIPy una creación de una condición RequestedPrivateIP. Hasta ahora tan bueno. Sin embargo, no puedo entender cómo incorporarlo a la AWS::EC2::Instanceespecificación de recursos. Intenté esto:

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

Pero eso falla cuando RequestedPrivateIPes falso con

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

¿Alguna idea de cómo asignar opcionalmente una IP privada estática y, si no se especifica, dejar que AWS establezca una dinámica?

MLu
fuente

Respuestas:

0

Como parece que la PrivateIpAddresspropiedad no admite una cadena vacía como valor, sugeriría crear dos recursos separados de su AWS::EC2::Instance. Uno de ellos tendrá su condición, RequestedPrivateIPmientras que el otro debe tener la misma condición pero negado, por ejemplo DidNotRequestPrivateIP.

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

"InstanceWithoutPrivateIp": {
    "Type": "AWS::EC2::Instance",
    "Condition": "DidNotRequestPrivateIP",
    "Properties": {
        [...]
    }
}
Bazze
fuente
1
De hecho, esa es una opción, pero rompe severamente el principio SECO (No te repitas) que no tengo muchas ganas de hacer. Además, a menudo hay otras propiedades que se pueden establecer o no, por ejemplo, si ELB escucha en HTTPS en función de si se ha establecido un certificado SSL. Intentar captar todas estas pequeñas variaciones repitiendo todas las declaraciones con un ligero cambio conduciría rápidamente a una plantilla masiva que no se puede mantener. Pero gracias por la sugerencia de todos modos.
MLu
Estoy totalmente de acuerdo contigo @MLu, repetir nunca es divertido. Sin embargo, según mi experiencia con CloudFormation, a veces te ves obligado a repetirte. La otra solución que veo es crear subconjuntos en lugar de incluirlos con las condiciones que mencioné anteriormente y luego, en esos subconjuntos, haces cosas específicas para esa condición.
Bazze