Wie passe ich einen Eigenschaftswert der Ressource an, wenn zwischen CDK-Konstrukten auf höherer Ebene und einer CloudFormation-Ressource eine Diskrepanz besteht?

Lesedauer: 4 Minute
0

Ich möchte den Eigenschaftswert der Ressource ändern, wenn eine Diskrepanz zwischen AWS Cloud Development Kit (AWS CDK) L3/L2-Konstrukten und einer AWS CloudFormation besteht.

Kurzbeschreibung

In einigen Fällen haben Konstrukte auf höherer Ebene (L3 und L2) eine Ressourceneigenschaft, die nicht geändert werden kann. Um dieses Problem zu umgehen, verwenden Sie AWS CDK Escape Hatch, um auf eine niedrigere Abstraktionsebene zu wechseln und den Eigenschaftswert der Ressource zu ändern.

Beispiel für eine Amazon Virtual Private Cloud (Amazon VPC) mit 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,
                )
            ]
        )

Das vorherige Beispiel für Amazon VPC wurde mithilfe des L2-Konstrukts aws_cdk.aws_ec2.Vpc definiert, das über zwei Availability Zones (AZ) verfügt, wobei der CidrBlock auf 60.0.0.0/16 gesetzt ist. Das Beispiel für Amazon VPC enthält außerdem zwei PublicSubnets und zwei PrivateSubnets, die auf die beiden AZs verteilt sind.

Beim Generieren einer CloudFormation zur Überprüfung der AWS::EC2::Subnet-Ressource beginnt der CIDRBlock im ersten IP-Bereich 60.0.0.0/24 und kann nicht geändert werden.

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

Gehen Sie wie folgt vor, um dieses Problem zu beheben:

  1. Rufen Sie generierte Subnetze innerhalb der Amazon VPC ab (das sind das L2 PublicSubnet-Konstrukt und das L2 PrivateSubnet-Konstrukt).
  2. Verwenden Sie die AWS CDK-Escape-Hatch node.default_child für die L2-Konstrukte und wandeln Sie als L1 CFNSubnet-Ressource um.
  3. Ändern Sie den cidr_block direkt oder mithilfe von raw overrides.
  4. Überprüfen Sie das cidr_block-Update in der CloudFormation-Vorlage.

Lösung

Gehen Sie wie folgt vor, um eine AWS CDK-Escape-Hatch zu verwenden, um denCidrBlock-Wert einer unteren Abstraktionsebene für PublicSubnets oder PrivateSubnets zu ändern:

Wichtig: Die folgenden Schritte gelten für PublicSubnets. Zur Anwendung auf PrivateSubnets, ersetzen Sie alle Instanzen von PublicSubnet durch PrivateSubnet.

1.Rufen Sie eine Liste der PublicSubnets in der Amazon VPC ab, indem Sie das vpc.public_subnets-Attribut verwenden:

public_subnets = vpc.public_subnets

Hinweis: Jedes Element in der generierten Liste ist ein L2 PublicSubnet-Konstrukt. Sehen Sie sich den folgenden Beispielausdruck an:

########## 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.    Verwenden Sie das Attribut node.default_child für das gewünschte L2-Konstrukt (für dieses Beispiel aws_cdk.aws_ec2.PublicSubnet). Verwenden Sie es dann als L1 CfnSubnet-Ressource (für dieses Beispiel 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.Nachdem Sie auf die L1 CfnSubnet-Ressource zugegriffen haben, ändern Sie den CidrBlock im L1 CfnSubnet-Konstrukt, indem Sie eine der folgenden Methoden verwenden:

  • Ändern Sie cidr_block direkt
  • Ändern Sie cidr_block mithilfe von raw overrides

Beispiel für die direkte Änderung des cidr_block oder mithilfe von raw overrides:

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

Wichtig: Stellen Sie sicher, dass Sie example_start_value durch Ihren angegebenen Wert ersetzen. Wenn Sie beispielsweise Ihr public_subnet so ändern möchten, dass es bei 60.0.100.0/24 beginnt, setzen Sie example_start_value auf 100.

4.Überprüfen Sie das CidrBlock-Update in der AWS::EC2::Subnet-Ressource auf der neu generierten CloudFormation-Vorlage, indem Sie den Befehl cdk synth ausführen:

cdk synth

Beispielausgabe:

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

Relevante Informationen

PrivateSubnet

vpc.private_subnets

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren