Comment personnaliser la valeur d'une propriété de ressource en cas d’écart entre les constructions de niveau supérieur du CDK et une ressource CloudFormation ?

Lecture de 4 minute(s)
0

Je souhaite modifier la valeur d'une propriété de ressource en cas d’écart entre les constructions L3/L2 d'AWS Cloud Development Kit (AWS CDK) et celles d'AWS CloudFormation.

Brève description

Dans certains cas, les constructions de niveau supérieur (L3 et L2) auront une propriété de ressource qui ne peut pas être modifiée. Pour contourner ce problème, utilisez les trappes d'échappement AWS CDK pour passer à un niveau d'abstraction inférieur et modifier la valeur de la propriété de la ressource.

Exemple d’Amazon Virtual Private Cloud (Amazon VPC) utilisant AWS CDK Python :

vpc = ec2.Vpc(self, "MyCDKVPC",
            max_azs=2,
            cidr='60.0.0.0/16',
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    name="public",
                    subnet_type=ec2.SubnetType.PUBLIC,
                    cidr_mask=24,
                ),
                ec2.SubnetConfiguration(
                    name="private",
                    subnet_type=ec2.SubnetType.PRIVATE_WITH_NAT,
                    cidr_mask=24,
                )
            ]
        )

L'exemple précédent d’Amazon VPC est défini à l'aide de la construction L2 aws_cdk.aws_EC2.vpc, qui possède deux zones de disponibilité (AZ) compte tenu d’un CidrBlock défini sur 60.0.0.0/16. L'exemple Amazon VPC contient également deux publicSubnets et deux PrivateSubnets répartis sur les deux AZ.

Lors de la génération d'un CloudFormation pour vérifier la ressource AWS::EC2::Subnet, le CidrBlock démarre à partir de la première plage d'adresses IP 60.0.0.0/24 et ne peut pas être modifié.

PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: 60.0.0.0/24
  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: 60.0.1.0/24
  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: 60.0.2.0/24
  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: 60.0.3.0/24

Pour résoudre ce problème, procédez comme suit :

  1. Récupérez les sous-réseaux générés au sein d'Amazon VPC (soit la construction L2 PublicSubnet et la construction L2 PrivateSubnet).
  2. Utilisez la trappe d'échappement du CDK AWS, node.default_child, sur les constructions L2 et convertissez-la en ressource CFNSubnet L1.
  3. Modifiez le cidr_block directement ou en utilisant des remplacements bruts.
  4. Vérifiez la mise à jour cidr_block sur le modèle CloudFormation.

Résolution

Pour utiliser une trappe d'échappement AWS CDK afin de modifier la valeurCidrBlock d'une couche d'abstraction inférieure pour PublicSubnets ou PrivateSubnets, procédez comme suit :

Important : les étapes suivantes s'appliquent aux sous-réseaux publics. Pour les appliquer à des PrivateSubnets, remplacez toutes les instances de PublicSubnet par PrivateSubnet.

1.    Récupérez la liste des PublicSubnets dans Amazon VPC à l'aide de l'attribut vpc.public_subnets :

public_subnets = vpc.public_subnets

Remarque :chaque élément de la liste générée est une construction L2 PublicSubnet. Consultez l'exemple d'impression suivant :

########## confirm public_subnets is a L2 construct ##########
print(public_subnets)  
# printout: [<aws_cdk.aws_ec2.PublicSubnet object at 0x7f3f48acb490>, <aws_cdk.aws_ec2.PublicSubnet object at 0x7f3f48acb050

2.    Utilisez l'attribut node.default_child sur la construction L2 souhaitée (pour cet exemple, aws_cdk.aws_EC2.PublicSubnet). Ensuite, convertissez-la en ressource L1 CfnSubnet (pour cet exemple aws_cdk.aws_EC2.CFNSubnet) :

########## confirm cfn_public_subnet is a L1 construct ##########
for public_subnet in public_subnets:
    cfn_public_subnet = public_subnet.node.default_child
    print(cfn_public_subnet)
    # printout: <aws_cdk.aws_ec2.CfnSubnet object at 0x7f3f48acb710>
    # printout: <aws_cdk.aws_ec2.CfnSubnet object at 0x7f3f48acb950>

3.    Après avoir accédé à la ressource L1 CFNSubnet, modifiez le** CidrBlock** sur la construction L1 CFNSubnet en utilisant l'une des méthodes suivantes :

  • Modifiez directement lecidr_block
  • Modifiez le cidr_block en utilisant des remplacements bruts

Exemple de modification du cidr_block directe ou en utilisant des remplacements bruts :

public_subnets = vpc.public_subnets
        public_subnet_index = 0

        for public_subnet in public_subnets:
            cfn_public_subnet = public_subnet.node.default_child

            ########### 1) modify the cidr_block property directly ###########
            cfn_public_subnet.cidr_block = "60.0." + str(public_subnet_index + example_start_value) + ".0/24")

            ########### 2) modify the cidr_block by using raw overrides ###########
            cfn_public_subnet.add_property_override("CidrBlock", "60.0." + str(public_subnet_index + example_start_value) + ".0/24")

            public_subnet_index += 1

**Important :**veillez à remplacer l'example_start_value par la valeur que vous avez spécifiée. Par exemple, si vous souhaitez modifier votre public/_subnet pour qu’il commence à partir de 60.0.100.0/24, définissez votre example_start_value sur 100.

4.    Vérifiez la mise à jour de CidrBlock dans la ressource AWS::EC2::Subnet sur le modèle CloudFormation récemment généré en exécutant la commande cdk synth :

cdk synth

Exemple de sortie :

PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: 60.0.100.0/24 <---
  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: 60.0.101.0/24
  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: <example_custom_value>/24
  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      ...
      CidrBlock: <example_custom_value>/24

Informations connexes

PrivateSubnet

vpc.private_subnets

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an