¿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?
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:
- Recupere las subredes generadas dentro de Amazon VPC (que son el componente PublicSubnet L2 y el componente PrivateSubnet L2).
- 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.
- Modifique el cidr\ _block directamente o mediante anulaciones sin procesar.
- 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:
- Modifique el cidr\ _block directamente
- Modifique el cidr\ _block mediante anulaciones sin procesar
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
Contenido relevante
- OFICIAL DE AWSActualizada hace 10 meses
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 4 años