Como personalizo o valor de uma propriedade de recurso quando há uma lacuna entre as estruturas de nível superior do CDK e um recurso do CloudFormation?

4 minuto de leitura
0

Quero modificar o valor de uma propriedade de recurso quando há uma lacuna entre as estruturas L2/L3 do AWS Cloud Development Kit (AWS CDK) e um AWS CloudFormation.

Breve descrição

Em alguns casos, as estruturas de nível superior (L3 e L2) terão uma propriedade de recurso que não pode ser modificada. Para contornar esse problema, use as escotilhas de escape do AWS CDK para passar para um nível mais baixo de abstração e modificar o valor da propriedade do recurso.

Exemplo de uma Amazon Virtual Private Cloud (Amazon VPC) usando o 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,
                )
            ]
        )

O exemplo anterior do Amazon VPC é definido usando a estrutura L2 aws_cdk.aws_ec2.Vpc, que tem duas zonas de disponibilidade (AZ) com o CidrBlock definidas como 60.0.0.0/16. O exemplo do Amazon VPC contém também duas PublicSubnets e duas PrivateSubnets espalhadas pelas duas AZs.

Ao gerar um CloudFormation para verificar o recurso AWS::EC2::Subnet, o CidrBlock iniciará no primeiro intervalo de IP 60.0.0.0/24 e não poderá ser modificado.

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 esse problema, siga estas etapas:

  1. Recupere sub-redes geradas dentro da Amazon VPC (que são a estrutura L2 PublicSubnet e a estrutura L2 PrivateSubnet).
  2. Use a escotilha de escape do AWS CDK, node.default_child, nas estruturas L2 e converta-a para recurso L1 CfnSubnet.
  3. Modifique o cidr_block diretamente ou usando substituições brutas.
  4. Verifique a atualização do cidr_block no modelo do CloudFormation.

Solução

Para usar uma escotilha de escape do AWS CDK para modificar o valor de CidrBlock de uma camada de abstração inferior para PublicSubnets ou PrivateSubnets, siga estas etapas:

Importante: As etapas a seguir se aplicam às PublicSubnets. Para se inscrever em PrivateSubnets, substitua todas as instâncias de PublicSubnet por PrivateSubnet.

1.    Recupere uma lista de PublicSubnets na Amazon VPC usando o atributo vpc.public_subnets:

public_subnets = vpc.public_subnets

**Nota:**Cada elemento dentro da lista gerada é uma estrutura L2 PublicSubnet. Veja a ilustração de exemplo a seguir:

########## 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.    Use o atributo node.default_child na estrutura L2 desejada (com este exemplo aws_cdk.aws_ec2.PublicSubnet). Em seguida, converta-o como o recurso L1 CfnSubnet (com este exemplo 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.    Depois de acessar o recurso L1 CfnSubnet, modifique o CidrBlock na estrutura L1 CfnSubnet usando um dos seguintes métodos:

Exemplo de modificação do cidr_block diretamente ou usando substituições brutas:

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:Certifique-se de substituir o example_start_value pelo seu valor especificado. Por exemplo, se você quiser modificar sua sub-rede pública public_subnet para começar em 60.0.100.0/24, defina seu example_start_value em ** 100.

4.    Verifique a atualização doCidrBlock dentro do recurso AWS::EC2::Subnet no modelo recém-gerado do CloudFormation executando o comando cdk synth:

cdk synth

Exemplo de saída:

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

Informações relacionadas

PrivateSubnet

vpc.private_subnets

AWS OFICIAL
AWS OFICIALAtualizada há um ano