¿Cómo puedo personalizar el valor de una propiedad de recurso cuando hay una brecha entre los componentes de nivel superior de CDK y un recurso de CloudFormation?

4 minutos de lectura
0

Quiero modificar el valor de una propiedad de un recurso cuando haya una brecha entre los componentes L3/L2 del AWS Cloud Development Kit (AWS CDK) y una AWS CloudFormation.

Descripción breve

En algunos casos, los componentes de nivel superior (L3 y L2) tendrán una propiedad de recurso que no se puede modificar. Para solucionar este problema, utilice las tramas de escape de AWS CDK para pasar a un nivel inferior de abstracción y modificar el valor de la propiedad del recurso.

Ejemplo de Amazon Virtual Private Cloud (Amazon VPC) que utiliza 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,
                )
            ]
        )

En el ejemplo anterior, Amazon VPC se define mediante el componente de nivel 2 aws\ _cdk.aws\ _ec2.vpc, que tiene dos zonas de disponibilidad (AZ) con el CidrBlock establecido en 60.0.0.0/16. El ejemplo de Amazon VPC también contiene dos PublicSubnets y dos PrivateSubnets repartidas en las dos AZ.

Al generar un CloudFormation para comprobar el recurso AWS::EC2::Subnet, el CidrBlock partirá del primer rango de IP 60.0.0.0/24 y no se podrá modificar.

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

Para resolver este problema, siga estos pasos:

  1. Recupere las subredes generadas dentro de Amazon VPC (que son el componente PublicSubnet L2 y el componente PrivateSubnet L2).
  2. Utilice la compuerta de escape de AWS CDK, node.default\ _child, en los componentes de L2 y cámbiela como recurso de CfnSubnet de nivel 1.
  3. Modifique el cidr\ _block directamente o mediante anulaciones sin procesar.
  4. Compruebe la actualización cidr\ _block en la plantilla de CloudFormation.

Resolución

Para utilizar una trampilla de escape de AWS CDK para modificar el valor de CidrBlock de una capa de abstracción inferior para PublicSubnets o PrivateSubnets, siga estos pasos:

Importante: Los siguientes pasos se aplican a PublicSubnets. Para aplicarlo a PrivateSubnets, sustituya todas las instancias de PublicSubnet por PrivateSubnet.

1.    Recupere una lista de PublicSubnets en la VPC de Amazon mediante el atributo vpc.public\ _subnets:

public_subnets = vpc.public_subnets

Nota: Cada elemento de la lista generada es un componente PublicSubnet L2. Consulte el siguiente ejemplo de impresión:

########## 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.    Utilice el atributo node.default\ _child en el componente L2 deseado (por ejemplo, aws\ _cdk.aws\ _EC2.PublicSubnet). A continuación, cámbielo como el recurso CfnSubnet L1 (por ejemplo 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.    Tras acceder al recurso CfnSubnet L1, modifique el CidrBlock del componente CfnSubnet L1 mediante uno de los métodos siguientes:

Ejemplo de modificación del cidr\ _block directamente o mediante anulaciones sin procesar:

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

Importante: Asegúrese de reemplazar el ejemplo\ _start\ _value por el valor especificado por usted. Por ejemplo, si desea modificar su public_subnet para que comience desde 60.0.100.0/24, defina su ejemplo\ _start\ _value en 100.

4.    Compruebe la actualización de CidrBlock dentro del recurso AWS::EC2::Subnet en la plantilla de CloudFormation recién generada mediante la ejecución del comandocdk synth:

cdk synth

Ejemplo de salida:

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

Información relacionada

Subred privada

vpc.private\ _subredes

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año