当 CDK 更高级别的构造和 CloudFormation 资源之间存在差距时,如何自定义资源属性值?

2 分钟阅读
0

我想在 AWS Cloud Development Kit(AWS CDK)L3/L2 构造与 AWS CloudFormation 之间存在差距时修改资源属性值。

简短描述

在某些情况下,更高级别的构造(L3 和 L2)将具有无法修改的资源属性。要解决此问题,请使用 AWS CDK 逃生舱口移至较低的抽象级别并修改资源属性值。

使用 AWS CDK Python 的 Amazon Virtual Private Cloud(Amazon VPC)示例:

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,
                )
            ]
        )

前面的示例 Amazon VPC 是使用 L2 构造 aws_cdk.aws_ec2.Vpc 定义的,它具有 CidrBlock 设置为 60.0.0.0/16 的两个可用区(AZ)。该示例 Amazon VPC 还包含分布在两个可用区的两个 PublicSubnet 和两个 PrivateSubnet

在生成 CloudFormation 来检查 AWS::EC2::Subnet 资源时,CidrBlock 将从第一个 IP 范围 60.0.0.0/24 开始并且无法修改。

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

要解决此问题,请执行下列步骤:

  1. 检索 Amazon VPC 内生成的子网(即 L2 PublicSubnet 构造和 L2 PrivateSubnet 构造)。
  2. 在 L2 构造上使用 AWS CDK 逃生舱口 node.default_child,并将其转换为 L1 CfnSubnet 资源。
  3. 直接修改 cidr_block 或使用原始覆盖修改。
  4. 验证 CloudFormation 模板上的 cidr_block 更新。

解决方法

要使用 AWS CDK 逃生舱口修改 PublicSubnetsPrivateSubnets 的下层抽象层的 CidrBlock 值,请执行以下步骤:

重要信息: 以下步骤适用于 PublicSubnet。要应用于 PrivateSubnet,请将 PublicSubnet 的所有实例替换为 PrivateSubnet

1.    使用 vpc.public_subnets 属性检索 Amazon VPC 中的 PublicSubnet 列表:

public_subnets = vpc.public_subnets

**注意:**生成的列表中的每个元素都是 L2 PublicSubnet 构造。请参阅以下示例打印输出:

########## 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.    在所需的 L2 构造上使用 node.default_child 属性(此示例中为 aws_cdk.aws_ec2.PublicSubnet)。然后,将其转换为 L1 CfnSubnet 资源(此示例中为 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.    访问 L1 CfnSubnet 资源后,使用以下方法之一修改 L1 CfnSubnet 构造上的 CidrBlock

  • 直接修改 cidr_block
  • 使用原始覆盖修改 cidr_block

直接修改 cidr_block 或使用原始覆盖修改的示例:

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

**重要信息:**确保将 example_start_value 替换为您指定的值。例如,如果要将 public_subnet 修改为从 60.0.100.0/24 开始,请将 example_start_value 设置为 100

4.    运行 cdk synth 命令,在新生成的 CloudFormation 模板上验证 AWS::EC2::Subnet 资源中的 CidrBlock 更新:

cdk synth

示例输出:

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

相关信息

PrivateSubnet

vpc.private_subnets

AWS 官方
AWS 官方已更新 1 年前