Come personalizzare il valore di una proprietà di risorsa quando c'è un divario tra i costrutti di livello superiore di CDK e una risorsa CloudFormation?
Voglio modificare il valore della proprietà di una risorsa quando c'è un divario tra i costrutti L3/L2 del Kit di sviluppo per il cloud AWS (AWS CDK) e un AWS CloudFormation.
Breve descrizione
In alcuni casi, i costrutti di livello superiore (L3 e L2) avranno una proprietà di risorsa che non può essere modificata. Per ovviare a questo problema, usa gli escape hatch di AWS CDK per passare a un livello di astrazione inferiore e modificare il valore della proprietà della risorsa.
Esempio di Amazon Virtual Private Cloud (Amazon VPC) che utilizza 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, ) ] )
Il precedente esempio di Amazon VPC è definito utilizzando il costrutto L2 aws_cdk.aws_ec2.Vpc, che ha due zone di disponibilità (AZ) con CidrBlock impostato su 60.0.0.0/16. L'esempio di Amazon VPC contiene anche due PublicSubnets e due PrivateSubnets distribuite tra le due AZ.
Quando si genera un CloudFormation per controllare la risorsa AWS::EC2::Subnet, CidrBlock partirà dal primo intervallo IP 60.0.0.0/24 e non può essere modificato.
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
Per risolvere il problema, procedi nel modo seguente:
- Recupera le sottoreti generate all'interno di Amazon VPC (che sono il costrutto PublicSubnet L2 e il costrutto PrivateSubnet L2).
- Usa l'escape hatch di AWS CDK, node.default_child, sui costrutti L2 e lancialo come risorsa CfnSubnet L1.
- Modifica cidr\ _block direttamente o utilizzando sovrascritture non elaborate.
- Verifica l'aggiornamento cidr_block sul modello CloudFormation.
Risoluzione
Per utilizzare un escape hatch di AWS CDK che serve a modificare il valore CidrBlock di un livello di astrazione inferiore per PublicSubnets o PrivateSubnets, procedi nel modo seguente:
Importante: I seguenti passaggi si applicano a PublicSubnets. Per applicarli a PrivateSubnets, sostituisci tutte le istanze di PublicSubnet con PrivateSubnet.
1. Recupera un elenco di PublicSubnets in Amazon VPC utilizzando l'attributo vpc.public_subnets:
public_subnets = vpc.public_subnets
Nota: Ogni elemento all'interno dell'elenco generato è un costrutto PublicSubnet L2. Vedi il seguente esempio di stampa:
########## 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. Usa l'attributo node.default_child sul costrutto L2 desiderato (per questo esempio aws_cdk.aws_ec2.PublicSubnet). Quindi, lancialo come risorsa CfnSubnet L1 (per questo esempio 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. Dopo aver effettuato l'accesso alla risorsa CfnSubnet L1 modifica CidrBlock sul costrutto CfnSubnet L1 utilizzando uno dei seguenti metodi:
- Modifica direttamente cidr_block
- Modifica cidr_block utilizzando sovrascritture non elaborate
Esempio di modifica di cidr\ _block direttamente o utilizzando sovrascritture non elaborate:
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:**Assicurati di sostituire example\ _start\ _value con il valore specificato. Ad esempio, se desideri modificare la tua public_subnet in modo che inizi da 60.0.100.0/24, imposta il tuo example_start_value su 100.
4. Verifica l'aggiornamento CidrBlock all'interno della risorsa AWS::EC2::Subnet sul modello CloudFormation appena generato eseguendo il comando cdk synth:
cdk synth
Esempio di output:
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
Informazioni correlate
Contenuto pertinente
- AWS UFFICIALEAggiornata 3 mesi fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 2 anni fa