いちはじCDK第6回 ついにサブネット

やっと・・・

やっとサブネットですね・・改めて、構成図を張っておきます。。。
(´・ω・`)まぁ忘れちゃったしね!

こんな感じでしたね・・・

例の如く…サブネットについて調べてみる。

サブネットを作るL1コンストラクタはCfnSubnetです。
こいつのパラメータの説明は…よくわからない部分が多い…りふぁれんすに調べたところを整理したので参考までに…
一番解り難かったのは以下のパラメータは「private_dns_name_options_on_launch」この人はどう設定するのか書いてない。…で色々試してみたけどdict型で設定したらいいみたい。
このブログでは、yamlパラメータに記載して、dict型に変換して設定って流れになるんですけど、yamlパラメータは以下の感じで書いたらいいみたい。

first_vpc_params.yaml
  subnets:
    first-pub-subnet-az1:
      construct_id: "first-pub-subnet-az1"
… 省略 …
      private_dns_name_options_on_launch:
        "EnableResourceNameDnsAAAARecord": "True"
        "EnableResourceNameDnsARecord": "True"
        "HostnameType": "ipname または リソース名"

ただ、上記は試してないし、設定の意味みたいなものも良く理解してなくて設定値を書いてみたものので実際使う人はもう少し、設定の意味も調べて使ってもらえたら良いかと思います。

では、やってみましょう

サブネットを作るのは、CfnSubnetで!サブネットとルートテーブルの関連付けは、CfnSubnetRouteTableAssociation(名前が長い!(≧◇≦))を使います。
例の如く、ラッパー関数、IFデータ構成、パラメータリストを作って行きます。
ラッパー関数は他のラッパー関数をこぴって、以下の部分を変更する感じで作ってきます。
CfnSubnetのラッパー関数は、赤字がコピー元からの変更部分になります。

class MySubnet(MyBase):★当然名前は違う
    def __init__(self, obj: Any, name: str):
        super().__init__(obj, name)

    def create(self, myif: dict) -> Any:
        self.myif = myif
        return self._subnet_(myif=MySubnetIF(**myif), updif=self.myif)

    def _subnet_(self, myif: MySubnetIF, updif: dict) -> CfnSubnet:
        tags = MyTags(myif.tags)
        rsc = CfnSubnet(
            self.obj,
            myif.construct_id,
            vpc_id=myif.vpc_id,
            assign_ipv6_address_on_creation=myif.assign_ipv6_address_on_creation,
            availability_zone=myif.availability_zone,
            availability_zone_id=myif.availability_zone_id,
            cidr_block=myif.cidr_block,
            enable_dns64=myif.enable_dns64,
            enable_lni_at_device_index=myif.enable_lni_at_device_index,
            ipv4_ipam_pool_id=myif.ipv4_ipam_pool_id,
            ipv4_netmask_length=myif.ipv4_netmask_length,
            ipv6_cidr_block=myif.ipv6_cidr_block,
            ipv6_ipam_pool_id=myif.ipv6_ipam_pool_id,
            ipv6_native=myif.ipv6_native,
            ipv6_netmask_length=myif.ipv6_netmask_length,
            map_public_ip_on_launch=myif.map_public_ip_on_launch,
            outpost_arn=myif.outpost_arn,
            private_dns_name_options_on_launch=myif.private_dns_name_options_on_launch,
            tags=tags,
        )
        # subnet_id
        updif["attr_subnet_id"] = rsc.attr_subnet_id
        return rsc

CfnSubnetに代わるので当然パラメータ部分は全部違う。他の部分は、名前が変わる部分だけ修正で行ける。ルール決まっているので変更するのは楽でした。
次にCfnSubnetRouteTableAssociationは以下の感じです。

class MySubnetRouteTableAssociation(MyBase):
    def __init__(self, obj: Any, name: str):
        super().__init__(obj, name)

    def create(self, myif: dict) -> Any:
        self.myif = myif
        return self._subnet_route_table_association_(
            myif=MySubnetRouteTableAssociationIF(**myif), updif=self.myif
        )

    def _subnet_route_table_association_(
        self, myif: MySubnetRouteTableAssociationIF, updif: dict
    ) -> CfnSubnetRouteTableAssociation:
        rsc = CfnSubnetRouteTableAssociation(
            self.obj,
            myif.construct_id,
            route_table_id=myif.route_table_id,
            subnet_id=myif.subnet_id,
        )
        return rsc

で、詳しくはGITの方見てもらうってことで…IFデータ構成は省略します。
パラメータリストは以下の感じ。サブネットの部分だけ書いてますが・・・長くなっちゃいましたね。アベイラビリティゾーンを1aと1cの2つ用意してそれぞれに、プライベートサブネット、パブリックサブネットを用意したので、定義としては4種類してあります。

  subnets:
    first_pub_subnet_az1:★パブリックサブネット(アベイラビリティゾーン1a)
      construct_id: "first_pub_subnet_az1"
      vpc_id: "{{firstvpc.vpcs.first_vpc.vpc_id}}"
      availability_zone: "ap-northeast-1a"
      cidr_block: "10.0.0.0/24"
      tags:
        Name: "first_pub_subnet_az1"
    first_pub_subnet_az3:パブリックサブネット(アベイラビリティゾーン1c)
      construct_id: "first_pub_subnet_az3"
      vpc_id: "{{firstvpc.vpcs.first_vpc.vpc_id}}"
      availability_zone: "ap-northeast-1c"
      cidr_block: "10.0.1.0/24"
      tags:
        Name: "first_pub_subnet_az3"
    first_pri_subnet_az1:★プライベートサブネット(アベイラビリティゾーン1a)
      construct_id: "first_pri_subnet_az1"
      vpc_id: "{{firstvpc.vpcs.first_vpc.vpc_id}}"
      availability_zone: "ap-northeast-1a"
      cidr_block: "10.0.2.0/24"
      tags:
        Name: "first_pri_subnet_az1"
    first_pri_subnet_az3:★プライベートサブネット(アベイラビリティゾーン1c)
      construct_id: "first_pri_subnet_az3"
      vpc_id: "{{firstvpc.vpcs.first_vpc.vpc_id}}"
      availability_zone: "ap-northeast-1c"
      cidr_block: "10.0.3.0/24"
      tags:
        Name: "first_pri_subnet_az3"
…省略…
  subnet-routes:
    first_pub_subnet_route_az1:★パブリックサブネット(1a)をルートテーブルに紐づける
      construct_id: "first_pub_subnet_route_az1"
      route_table_id: "{{firstvpc.route_tables.first-public-routetbl.attr_route_table_id}}"
      subnet_id: "{{firstvpc.subnets.first_pub_subnet_az1.attr_subnet_id}}"
    first_pub_subnet_route_az3:★パブリックサブネット(1c)をルートテーブルに紐づける
      construct_id: "first_pub_subnet_route_az3"
      route_table_id: "{{firstvpc.route_tables.first-public-routetbl.attr_route_table_id}}"
      subnet_id: "{{firstvpc.subnets.first_pub_subnet_az3.attr_subnet_id}}"
    first_pri_subnet_route_az1:★プライベートサブネット(1a)をルートテーブルに紐づける
      construct_id: "first_pri_subnet_route_az1"
      route_table_id: "{{firstvpc.route_tables.first-private-routetbl.attr_route_table_id}}"
      subnet_id: "{{firstvpc.subnets.first_pri_subnet_az1.attr_subnet_id}}"
    first_pri_subnet_route_az3:★プライベートサブネット(1c)をルートテーブルに紐づける
      construct_id: "first_pri_subnet_route_az3"
      route_table_id: "{{firstvpc.route_tables.first-private-routetbl.attr_route_table_id}}"
      subnet_id: "{{firstvpc.subnets.first_pri_subnet_az3.attr_subnet_id}}"

スタックソースは以下赤字を追加です。あまり難しいところはないかと思います。
書き方は一緒なので…追加サブネットとサブネットルートテーブルの関係を追加です。

class FirstVpcStack(Stack):
    def __init__(
        self, scope: Construct, construct_id: str, myctrl: MyCtrl, **kwargs
    ) -> None:
        super().__init__(scope, construct_id, **kwargs)
        self.myctrl = myctrl
        # VPC
        firstvpc = myctrl.create(MyVpc(obj=self, name="firstvpc.vpcs.first_vpc"))

        # first_pub_subnet_az1
        firstpubsubnetaz1 = myctrl.create(MySubnet(obj=self, name="firstvpc.subnets.first_pub_subnet_az1"))
        # first_pub_subnet_az3
        firstpubsubnetaz3 = myctrl.create(MySubnet(obj=self, name="firstvpc.subnets.first_pub_subnet_az3"))
        # first_pri_subnet_az1
        firstprisubnetaz1 = myctrl.create(MySubnet(obj=self, name="firstvpc.subnets.first_pri_subnet_az1"))
        # first_pri_subnet_az3
        firstprisubnetaz3 = myctrl.create(MySubnet(obj=self, name="firstvpc.subnets.first_pri_subnet_az3"))

        # route-table public
        firstpubroutetbl = myctrl.create(
            MyRouteTable(self, name="firstvpc.route_tables.first-public-routetbl")
        )
        # route-table private
        firstpriroutetbl = myctrl.create(
            MyRouteTable(self, name="firstvpc.route_tables.first-private-routetbl")
        )

        # igw
        firstigw = myctrl.create(
            MyInternetGateway(self, name="firstvpc.igws.first-igw")
        )

        # route-igw
        routeigw = myctrl.create(MyRoute(self, name="firstvpc.routes.first-igw-rute"))

        # vpcgatewayattach
        vpcgatewayattach = myctrl.create(
            MyVPCGatewayAttachment(
                self, name="firstvpc.vpcgatewayattachs.first-vpcgatewayattach"
            )
        )

        # first_pub_subnet_route_az1
        firstpubsubnetaz1 = myctrl.create(MySubnetRouteTableAssociation(obj=self, name="firstvpc.subnet-routes.first_pub_subnet_route_az1"))
        # first_pub_subnet_route_az3
        firstpubsubnetaz3 = myctrl.create(MySubnetRouteTableAssociation(obj=self, name="firstvpc.subnet-routes.first_pub_subnet_route_az3"))
        # first_pri_subnet_route_az1
        firstprisubnetaz1 = myctrl.create(MySubnetRouteTableAssociation(obj=self, name="firstvpc.subnet-routes.first_pri_subnet_route_az1"))
        # first_pri_subnet_route_az3
        firstprisubnetaz3 = myctrl.create(MySubnetRouteTableAssociation(obj=self, name="firstvpc.subnet-routes.first_pri_subnet_route_az3"))

あとはデプロイしてみる感じ…第6回目にしてやっと、作業がやりやすくなった感じがする…

できたものを確認

サブネットの一覧
細かくて見えないかもですが、クリックすると拡大できます。Tagで指定したNameが表示されていることがわかると思います。

あと、VPCのリソースマップを見ると、ルートテーブルとサブネットの関係とかが確認できます。

終わってみた感想としては、サブネットはあまり書くことがなかったですね…失敗もしなかったし。
今回はこれでお終いです。GITはこちらを見て下さい。
あとはりふぁれんすも整備していくので参考にしてもらえたらいいかなと思います。
次回は…EC2へ行きたかったんですけど…その前にちょっと思うところあり…また、プロジェクトを見直します!
(。-`ω-)えっ・・・・また?!
と言う訳で次回は「いちはじCDK第7回 また見直し」でっす。

コメント

タイトルとURLをコピーしました