Propriété conditionnelle dans AWS CloudFormation

10

Nous avons un modèle AWS CloudFormation pour créer des instances EC2. Certains d'entre eux nécessitent cependant un spécifique PrivateIpAddresset j'ai du mal à comprendre comment l'incorporer au modèle.

Pour l'instant, j'ai un paramètre de modèle PrivateIPet une création de condition RequestedPrivateIP. Jusqu'ici tout va bien. Cependant, je ne peux pas comprendre comment l'intégrer à la AWS::EC2::Instancespécification de ressource. J'ai essayé ceci:

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

Mais cela échoue quand RequestedPrivateIPest faux avec

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

Avez-vous une idée de la façon d'attribuer éventuellement une IP privée statique et, si elle n'est pas spécifiée, de laisser AWS en définir une dynamique?

MLu
la source

Réponses:

0

Puisqu'il semble que la PrivateIpAddresspropriété ne supporte pas une chaîne vide comme valeur, je suggère de créer deux ressources distinctes de votre AWS::EC2::Instance. L'un d'eux aura votre état RequestedPrivateIPtandis que l'autre devrait avoir le même état mais annulé, par exemple DidNotRequestPrivateIP.

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

"InstanceWithoutPrivateIp": {
    "Type": "AWS::EC2::Instance",
    "Condition": "DidNotRequestPrivateIP",
    "Properties": {
        [...]
    }
}
Bazze
la source
1
C'est en effet une option mais rompt sévèrement le principe DRY (Don't Repeat Yourself) que je n'ai pas envie de faire. En outre, il existe souvent d'autres propriétés qui peuvent être définies ou non, par exemple si ELB écoute sur HTTPS en fonction de la définition d'un certificat SSL. Essayer d'attraper toutes ces petites variations en répétant toutes les déclarations avec un léger changement conduirait rapidement à un modèle massif et non maintenable. Mais merci pour la suggestion quand même.
MLu
Je suis totalement d'accord avec vous @MLu, répéter n'est jamais amusant. Cependant, d'après mon expérience avec CloudFormation, vous êtes parfois obligé de vous répéter. L'autre solution que je vois est de créer des sous-piles à la place que vous incluez avec les conditions que j'ai mentionnées ci-dessus, puis dans ces sous-piles, vous faites des choses spécifiques à cette condition.
Bazze