web-dev-qa-db-fra.com

AWS Cloudformation: créer conditionnellement des propriétés de ressources

Je sais qu'il est possible via l'utilisation de Conditions de créer conditionnellement (quoi d'autre?) Des ressources.

J'essaie cependant de trouver un moyen de créer conditionnellement des propriétés de ressources;

dans mon cas, je crée plusieurs EC2 instances dans un sous-réseau avec affectation IP publique par défaut = false.

Parfois, cependant, à des fins de débogage, je souhaite que mes instances obtiennent des adresses IP publiques.

Maintenant, je dois commenter les propriétés SG/Subnet et NetworkInterfaces ci-dessous (celles-ci ne vont pas ensemble)

  myEC2:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: My EC2 Instance
      AWS::CloudFormation::Init:
        config:
          commands:
            01_provision:
              command:
                !Sub |
                  sed -i "s/somestring/${somevar}/" /some/path/
    CreationPolicy:
      ResourceSignal:
        Timeout: PT4M
    Properties:
      ImageId: !FindInMap [ MyAamiMap, 'myami', amiid ]
      InstanceType: "t2.2xlarge"
      # SubnetId: !Ref SBNDemo1
      # SecurityGroupIds: [!Ref SGInternalDemo]
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          GroupSet:
            - Ref: "SGInternalDemo"
          SubnetId:
            Ref: "SBNDemo1"
      UserData:
        "Fn::Base64":
          !Sub |
            #!/bin/bash -xe
            # Start cfn-init
            /usr/local/bin/cfn-init -s ${AWS::StackId} -r myEC2 --region ${AWS::Region} || echo 'Failed to run cfn-init'
            # All done so signal success
            /usr/local/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource myEC2 --region ${AWS::Region}

Aucune suggestion?

7
pkaramol

Peut-être que je me méprends, mais cela ressemble à un cas d'utilisation de paramètre plutôt qu'à un cas d'utilisation de condition. Je dis cela parce que vous ne dites pas dans quelles conditions vous souhaitez une adresse IP publique. Juste "parfois à des fins de débogage" Comment le modèle pourrait-il savoir que vous déboguez? Vous devez le dire avec un paramètre.

consultez les documents https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html

Vous pouvez donc avoir un paramètre ip public et un paramètre id de sous-réseau et transmettre ce que vous aimez lors de la création de la pile.

Une façon dont les conditions pourraient être utiles est de créer un paramètre de débogage qui permuterait l'IP et le sous-réseau public/privé. C'est à ça que tu pensais?

Pour utiliser des conditions sur les propriétés, utilisez la fonction IF

https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html

Je suggère de configurer votre sous-réseau public pour fournir une adresse IP publique au lancement, et bien sûr de vous assurer que votre sous-réseau privé ne le fait pas. Ensuite, passez simplement le sous-réseau en tant que paramètre.

https://docs.aws.Amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip

1
Michael West