當 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 所定義的,該區塊有兩個可用區域 (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

若要解決這個問題,請執行下列步驟:

  1. 在 Amazon VPC 內擷取產生的子網路 (L2 公有子網路建構模組和 L2 私有子網路建構模組)。
  2. 在 L2 建構模組上使用 AWS CDK 逸出剖面線 (節點 node.default_child),並將其轉換為 L1 CfnSubnet 資源。
  3. 直接或使用原始取代來修改 cidr_block
  4. 驗證 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

相關資訊

私有子網路

vpc.private_subnets

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