AWS CDK v2 でVPCを自分好みに!(そのに)

ならたけぽん
2023-06-22
2023-06-22

おつかれさまです。ならたけぽんです。🍀

いつのまにやら、梅雨、入ってます。☔

こちらは天気痛?でふぃらふぃらですが、🐌は超元気ですね。
いつもは何も無い道の真ん中をずんずん進んでいたりするので、
毎朝踏まないか注視しながら歩いています。😵
彼らはどこに向かっているのだろうか。
実は出勤中だったりするのかな。🏙️

今回も、前回のブログの続きになります~。🐾



前々々回、

// VPC
const
vpc = new ec2.Vpc(this,'Vpc',{});

こんな感じに1行追加してVPCを作成したのですが、
デフォルトの値なんですよね。
VPC名とか、CIDRとか、いろいろと。

やっぱり、せっかくなんで、自分好みに設定したいですよね。😍

というわけで、以下、自分好みの設定のやり方になります。
このやり方が唯一無二というわけではないので、あくまでご参考までに。

※まだるっこしい皆様は、AWS CDK公式のこちらのリンクをご参考に。
 もちろん英語です~。😱
 AWS CDK リファレンス




🐥 CIDR!

 例えば、

// VPC
const
vpc = new ec2.Vpc(this,'Vpc',{
    ipAddresses:  ec2.IpAddresses.cidr('192.168.0.0/16'),
    vpcName: 'piyopiyopiyo'
}
);

 「ipAddresses」プロパティに上記のような設定を行うと、

  • CIDR:10.0.0.0/16

 デフォルトですとこのようなVPCの「CIDR」が、

  • CIDR:192.168.0.0/16

 と指定した「CIDR」で設定されます!🍾



🐥 サブネットなし! NATゲートウェイなし! インターネットゲートウェイなし!

 例えば、

// VPC
const
vpc = new ec2.Vpc(this,'Vpc',{
    ipAddresses:  ec2.IpAddresses.cidr('192.168.0.0/16'),
    subnetConfiguration:  [],
    vpcName:
'piyopiyopiyo'
}
);

 「subnetConfiguration」プロパティに上記のような空行の設定を行うと、
 なんとVPCしか作成されません!🍾
 サブネットもNATゲートウェイもインターネットゲートウェイも作成なし!🙈
 
 自動生成は便利だけと、
 やっぱり生成系はいろいろ自分で管理したいっしょ、というときにピッタリ!💘

 ※さりげなくNATゲートウェイは稼働時間でも課金されてしまうので、
  何か想定以上に課金走っているな~、というときには、
  原因は気づかずに生成されていたこの子だったりします。。。🙊



🐥 インターネットゲートウェイ!

 例えば、

// VPC
const
vpc = new ec2.Vpc(this, 'Vpc', {
    ipAddresses:  ec2.IpAddresses.cidr('192.168.0.0/16'),
    subnetConfiguration:  [],
    vpcName:
'piyopiyopiyo'
}
);

// Internet Gateway
const igw = new ec2.CfnInternetGateway(this, 'IGW', {
    tags:  [{
        key: 'Name',  value: 'piyopiyopiyo_igw'
    }]
});
const igwAttach = new ec2.CfnVPCGatewayAttachment(this, 'IGWA', {
    vpcId:  vpc.vpcId,
    internetGatewayId:  igw.ref
});

 上記のように「CfnInternetGateway」クラスを使用すると、

  • タグ:Name / piyopiyopiyo_igw

 と、指定した「Name」タグが設定されたインターネットゲートウェイが生成されます!🍾

 さらに上記のように「CfnVPCGatewayAttachment」クラスを使用すると、
 指定したVPCと生成したインターネットゲートウェイとを
 紐づける(アタッチ)することができます!🍾
 
 逆に言うと、
 インターネットゲートウェイを手動で生成した場合は、
 手動でVPCにアタッチする必要がある、ということになります。😱

 このあたり、AWS管理画面でのVPC生成とかAWS CDKのVPC自動生成とかですと、
 見えないところで勝手にアタッチしてくれちゃうので、初見ですと分からないんですよね。

 こうしていろいろ試してみると思わぬ知見を得られたりするので、
 個人的には、寄り道場万歳!だったりします。😆
 知見ゲットだぜ!🐣

 ※もちろん守るべき期限は守った上での寄り道を推奨です。
  社会人の皆様におかれましては、特に。。。⏳



🐥 サブネット!

 例えば、

// VPC
const vpc = new ec2.Vpc(this, 'Vpc', {
    ipAddresses:  ec2.IpAddresses.cidr('192.168.0.0/16'),
    subnetConfiguration:  [],
    vpcName:
'piyopiyopiyo'
}
);

// Internet Gateway
const igw = new ec2.CfnInternetGateway(this, 'IGW', {
    tags:  [{
        key: 'Name',  value: 'piyopiyopiyo_igw'
    }]
});
const igwAttach = new ec2.CfnVPCGatewayAttachment(this, 'IGWA', {
    vpcId:  vpc.vpcId,
    internetGatewayId: 
igw.ref
});


// Subnet
const
subnetPubA = new ec2.Subnet(this, 'SubnetPubA', {
    vpcId:  vpc.vpcId,
    cidrBlock: '192.168.0.0/24',
    availabilityZone: 'ap-northeast-1a',
});
cdk.Tags.of(subnetPubA).add('Name',  'piyopiyopiyo_subnet_pub_a');
subnetPubA.addDefaultInternetRoute(igw.ref, igwAttach);

 上記のように「Subnet」クラスを使用すると、

  • VPC:指定したVPC
  • CIDR:192.168.0.0./24
  • AvailabilityZone:ap-northeast-1a (東京リージョン)
  • タグ:Name / piyopiyopiyo_subnet_pub_a

 と、指定した「VPC」に指定した情報が設定されたサブネットが生成されます!🍾
 ちなみに、

  • subnetPubA.addDefaultInternetRoute(igw.ref, igwAttach);

 この行を設定すると、作成したサブネットのルートテーブルに、

  • 送信先:0.0.0.0/0
  • ターゲット:[設定したインターネットゲートウェイ] 

 とルーティングが付与されます。
 要はパブリックなサブネットになります。

 逆に設定しないと、プライベートなサブネットになります。

 このあたりも、初見ですと分からない箇所ですね。
 パブリックなサブネットを生成したつもりがインターネットに出れなかったりします。
 知見ゲットだぜ!🐣



🐥 NATゲートウェイ!

 例えば、

// VPC
const vpc = new ec2.Vpc(this, 'Vpc', {
    ipAddresses:  ec2.IpAddresses.cidr('192.168.0.0/16'),
    subnetConfiguration:  [],
    vpcName:
'piyopiyopiyo'
}
);

// Internet Gateway
const igw = new ec2.CfnInternetGateway(this, 'IGW', {
    tags:  [{
        key: 'Name',  value: 'piyopiyopiyo_igw'
    }]
});
const igwAttach = new ec2.CfnVPCGatewayAttachment(this, 'IGWA', {
    vpcId:  vpc.vpcId,
    internetGatewayId: 
igw.ref
});


// Subnet
const
subnetPubA = new ec2.Subnet(this, 'SubnetPubA', {
    vpcId:  vpc.vpcId,
    cidrBlock: '192.168.0.0/24',
    availabilityZone: 'ap-northeast-1a',
});
cdk.Tags.of(subnetPubA).add('Name',  'piyopiyopiyo_subnet_pub_a');
subnetPubA.addDefaultInternetRoute(igw.ref, igwAttach);

// NAT Gateway
const eipNGWA = new ec2.CfnEIP(this, 'EIP_NGWA', {});
cdk.Tags.of(eipNGWA).add('Name',  'piyopiyopiyo_eip_ngw_a');
const
ngwA = new ec2.CfnNatGateway(this, 'NGWA', {
    allocationId:  eipNGWA.attrAllocationId,
    subnetId: 
subnetPubA.subnetId,
    tags:  [{
        key: 'Name',  value: 'piyopiyopiyo_ngw_a'
    }]
});
cdk.Tags.of(ngwA).add('Name',  'piyopiyopiyo_ngw_a');

 上記のように「CnfEIP」クラスを使用してElasticIPを生成した後、
 「CfnNatGateway」クラスを使用すると、

  • サブネット:設定したパブリックサブネット
  • ElasticIPアドレス:設定したElasticIPアドレス
  • タグ:Name / piyopiyopiyo_ngw_a

 と、指定した情報が設定されたNATゲートウェイが生成されます!🍾

 先にElasticIPを生成して、
 NATゲートウェイ生成時にそのElasticIPアドレスを設定するのがミソです!🐣
 
 ※逆にElasticIPアドレスを設定しないと、
  「The request must include the AllocationId parameter.
   Add the required parameter and retry the request.
  なんてエラーが出ます。



こんな感じで、VPCをどんどん自分好みにしていくぜっ!、の回でした。🐣

エンドポイントとかTransitゲートウェイとか、いろいろと応用効きますので、
ぜひ、お試しください。🐬

次の回を書くときは、多分、暑いんだろうな。。。🔥🌞🔥

それでは、良き良き、AWS CDKライフを!!!🌈