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:
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