當 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
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- 已提問 6 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 10 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前