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 所定義的,該區塊有兩個可用區域 (AZ),其中 CidrBlock 設定為 60.0.0.0/16。此範例 Amazon VPC 也包含兩個公開子網路和分散在兩個 AZ 中的兩個私有子網路。
當生成一個 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 公有子網路建構模組和 L2 私有子網路建構模組)。
- 在 L2 建構模組上使用 AWS CDK 逸出剖面線 (節點 node.default_child),並將其轉換為 L1 CfnSubnet 資源。
- 直接或使用原始取代來修改 cidr_block。
- 驗證 CloudFormation 範本上的 cidr_block 更新。
分辨率
若要使用 AWS CDK 逸出剖面線來修改公開子網路或私有子網路的較低抽象層的 CidrBlock 值,請執行下列步驟:
重要事項: 下列步驟套用於公開子網路。若要套用至私有子網路,請將公有子網路的所有執行個體取代為私有子網路。
1. 使用 vpc.public_subnets 屬性擷取 Amazon VPC 中的公共子網路清單:
public_subnets = vpc.public_subnets
**注意:**生成的列表中的每個元素是一個 L2 公共子網路建構模組。請參閱下面的範例列印輸出:
########## 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
相關資訊
- 語言
- 中文 (繁體)
