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?

4 minuti di lettura
0

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:

  1. Recupera le sottoreti generate all'interno di Amazon VPC (che sono il costrutto PublicSubnet L2 e il costrutto PrivateSubnet L2).
  2. Usa l'escape hatch di AWS CDK, node.default_child, sui costrutti L2 e lancialo come risorsa CfnSubnet L1.
  3. Modifica cidr\ _block direttamente o utilizzando sovrascritture non elaborate.
  4. 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:

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

PrivateSubnet

vpc.private_subnets

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa