AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
当 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
相关信息
- 语言
- 中文 (简体)
