CDKで冗長構成のVPC作成

## はじめに
CDKの応用として以前作成したパラメータからコードを書いてVPCを作成してみました。

## 作成するリソース
### VPC
- 今回はVPCのみです
![名称未設定ファイル.drawio(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/d40a4b17-8467-fe89-129d-d7b0c3df3214.png)

### コードの概要
目的: 高可用性構成のVPCを作成し、パブリックおよびプライベートサブネットを設定
テンプレート概要:
- 1つのVPC
- 2つのパブリックサブネット
- 2つのプライベートサブネット
- インターネットゲートウェイとそれに紐づくルートテーブル
        
### パラメータ
- VPC

|項目  |値  |
|---|---|
|名前  |test-vpc  |
|CIDRブロック  |10.0.0.0/16  |
|DNSサポート  |有効  |
|DNSホスト名  |有効  |

- サブネット

|サブネット名  |CIDRブロック  |可用性ゾーン  |パブリックIP  |備考  |
|---|---|---|---|---|
|PublicSubnet1  |10.0.0.0/24  |AZ1  |自動割り当て  |パブリック通信が可能  |
|PublicSubnet2  |10.0.1.0/24  |AZ2  |自動割り当て  |パブリック通信が可能  |
|PrivateSubnet1 |10.0.10.0/24 |AZ1  |無効  |プライベート通信  |
|PrivateSubnet2 |10.0.11.0/24 |AZ2  |無効  |プライベート通信  |

- インターネットゲートウェイ

|項目  |値  |
|---|---|
|名前  |test-igw  |
|接続VPC  |test-vpc  |

- ルートテーブル

|項目  |値  |
|---|---|
|名前  |test-public-crt  |
|ルート  |デフォルトルート (0.0.0.0/0) をインターネットゲートウェイに設定  |
|サブネットの関連付け  |PublicSubnet1, PublicSubnet2  |
作成するVPCのパラメータは以下のものを参照しながら作成しました。

## 作成したコード
```
import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { CfnOutput } from 'aws-cdk-lib';
import { IpAddresses } from 'aws-cdk-lib/aws-ec2';

export class TestCdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    
    const vpc = new ec2.Vpc(this, 'test-vpc', {
      maxAzs: 2,
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      subnetConfiguration: [],
    });

    const publicSubnet1 = new ec2.Subnet(this, 'MyPublicSubnet1', {
      vpcId: vpc.vpcId,
      cidrBlock: '10.0.0.0/24',
      availabilityZone: 'ap-northeast-1a',
      mapPublicIpOnLaunch: true,
    });
  
    const publicSubnet2 = new ec2.Subnet(this, 'MyPublicSubnet2', {
      vpcId: vpc.vpcId,
      cidrBlock: '10.0.1.0/24',
      mapPublicIpOnLaunch: true,
      availabilityZone: 'ap-northeast-1c',
    });
    const privateSubnet1 = new ec2.Subnet(this, 'MyPrivateSubnet1' , {
      vpcId: vpc.vpcId,
      cidrBlock: '10.0.10.0/24',
      availabilityZone: 'ap-northeast-1a',
      mapPublicIpOnLaunch: false,
    });

    const privateSubnet2 = new ec2.Subnet(this, 'MyPrivateSubnet2', {
      vpcId: vpc.vpcId,
      cidrBlock: '10.0.11.0/24',
      availabilityZone: 'ap-northeast-1c',
      mapPublicIpOnLaunch: false,
    }); 
  
    const igw = new ec2.CfnInternetGateway(this, 'DefaultInternetGateway');
    
    new ec2.CfnVPCGatewayAttachment(this, 'MyVPCGatewayAttachment', {
      vpcId: vpc.vpcId,
      internetGatewayId: igw.ref,
    });
  
    const routeTable = new ec2.CfnRouteTable(this, 'MyRouteTable', {
      vpcId: vpc.vpcId,
    });

    new ec2.CfnRoute(this, 'MyRoute', {
      routeTableId: routeTable.ref,
      gatewayId: igw.ref,
      destinationCidrBlock: '0.0.0.0/0',
    });

    [publicSubnet1, publicSubnet2].forEach((subnet, index) => {
      new ec2.CfnSubnetRouteTableAssociation(this, `MySubnetRouteTableAssociation${index}`, {
        subnetId: subnet.subnetId,
        routeTableId: routeTable.ref,
      });
    });
  }
}
```

- CDKはデフォルトでサブネットを作成する。上で挙げたパラメータのサブネットのCidrと重複してしまいます。
- 自分でCidrを割り当てるため以下のコードを追加
```
subnetConfiguration: [], //サブネットの自動作成を無効化
```

## リソース確認
![スクリーンショット 2024-12-31 075620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/8443d424-8f18-b30a-deda-a7deb3b0047e.png)