New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
当 CDK 更高级别的构造和 CloudFormation 资源之间存在差距时,如何自定义资源属性值?
我想在 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
要解决此问题,请执行下列步骤:
- 检索 Amazon VPC 内生成的子网(即 L2 PublicSubnet 构造和 L2 PrivateSubnet 构造)。
- 在 L2 构造上使用 AWS CDK 逃生舱口 node.default_child,并将其转换为 L1 CfnSubnet 资源。
- 直接修改 cidr_block 或使用原始覆盖修改。
- 验证 CloudFormation 模板上的 cidr_block 更新。
解决方法
要使用 AWS CDK 逃生舱口修改 PublicSubnets 或 PrivateSubnets 的下层抽象层的 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
相关信息

相关内容
- AWS 官方已更新 8 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前