はじめに
前回のパート1では、VPCの概要やPrivate Isolated Subnetについて説明しました。
今回は実際にAWS Cloud Development Kit(CDK)を使用して、VPCとサブネットを構築していきます。
CDKは、TypeScriptなどのプログラミング言語を使って、AWSのインフラ構成をコードで定義・管理できるツールです。
1. 今回構築する構成
| 項目 | 設定値 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| VPC名 | sesame-admin-vpc |
| VPC CIDR | 10.0.0.0/16 |
| AZ | 2つ |
| サブネット | Private Isolated Subnet × 2 |
| サブネットCIDR | 各 /24 |
| NAT Gateway | なし |
今回はPrivate Isolated Subnetのみを作成するため、インターネットへの直接通信経路は設けません。
将来的にはRDS(PostgreSQL)などのリソースを配置することを想定しています。
2. CDKの準備
まずはCDKを使用できる環境を準備します。
CDKはNode.js上で動作するため、Node.jsとnpmが必要です。
また、AWS環境へのデプロイには、AWSの認証情報と適切な権限が必要になります。
CDK CLIがインストールされていない場合は、以下のコマンドでインストールします。
npm install -g aws-cdk
インストール後、バージョンを確認します。
cdk --version
続いて、CDKプロジェクトを作成します。
mkdir sesame-infra
cd sesame-infra
cdk init app --language typescript
これでTypeScriptを使用したCDKプロジェクトが作成されます。
※ すでにCDKプロジェクトが存在する場合は、初期化作業は不要です。
3. VPCとサブネットの定義
続いて、CDKのスタックファイルにVPCの定義を追加します。
今回は aws-cdk-lib/aws-ec2 を使用します。
以下はVPC構築部分のコードです。
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';
export class SesameInfraStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const vpc = new ec2.Vpc(this, 'SesameVpc', {
vpcName: 'sesame-admin-vpc',
ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
maxAzs: 2,
natGateways: 0,
subnetConfiguration: [
{
cidrMask: 24,
name: 'private',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
],
});
new cdk.CfnOutput(this, 'VpcId', {
value: vpc.vpcId,
});
}
}
このコードで、VPCと2つのPrivate Isolated Subnetをまとめて定義できます。
各設定の説明
| 設定項目 | 内容 |
|---|---|
vpcName |
VPC名を sesame-admin-vpc に設定 |
ipAddresses |
VPCのCIDRを 10.0.0.0/16 に設定 |
maxAzs: 2 |
使用するAZの最大数を2つに設定 |
natGateways: 0 |
NAT Gatewayを作成しない |
cidrMask: 24 |
各サブネットのCIDRを /24 に設定 |
subnetType |
Private Isolated Subnetを作成 |
今回はNAT Gatewayを作成しないため、その分の利用料金は発生しません。
また、Private Isolated SubnetにはインターネットゲートウェイやNAT Gatewayへのデフォルトルートが作成されません。
4. CDK Bootstrapの実行
CDKで初めてデプロイするAWSアカウント・リージョンでは、通常Bootstrapが必要になります。
Bootstrapは、CDKがデプロイ時に使用するS3バケットやIAMロールなどを準備する処理です。
cdk bootstrap
正常に完了すると、CDKのデプロイに必要な環境が準備されます。
※ 同じAWSアカウント・リージョンですでにBootstrap済みの場合は、通常は再実行する必要はありません。
5. CDKのビルドと差分確認
VPCとサブネットの定義が完了したら、デプロイ前にコードの確認を行います。
今回は以下の3つのコマンドを使用します。
| コマンド | 目的 |
|---|---|
npm run build |
TypeScriptのコンパイルエラーを確認 |
cdk synth |
CloudFormationテンプレートを生成・確認 |
cdk diff |
デプロイ時の作成・変更内容を確認 |
これらのコマンドでは、VPCやサブネットなどの構築対象リソースはデプロイされません。
① TypeScriptのコンパイル確認
まず、以下のコマンドを実行します。
npm run build
このコマンドでは、TypeScriptのコードをコンパイルし、構文や型のエラーがないか確認します。
想定出力結果
> sesame-infra@0.1.0 build
> tsc
エラーがなければ、通常は追加のメッセージが表示されずに終了します。
ただし、コンパイルが成功しても、AWSリソースの設定内容やデプロイの成功まで保証されるわけではありません。
② CloudFormationテンプレートの生成・確認
続いて、以下のコマンドを実行します。
cdk synth
CDKでは、TypeScriptで記述した構成をCloudFormationテンプレートに変換し、そのテンプレートを使用してAWSリソースを作成します。
cdk synth は、生成されるテンプレートの内容をデプロイ前に確認するためのコマンドです。
なお、cdk deploy の実行時にも内部でテンプレートが生成されるため、cdk synth の事前実行は必須ではありません。
CDKからAWS環境への反映の流れ
今回の確認観点と想定出力結果
生成されたCloudFormationテンプレートから、以下の3点を確認します。
| 確認項目 | 確認する内容 |
|---|---|
| VPC |
AWS::EC2::VPC が定義され、CIDRが 10.0.0.0/16 になっているか |
| サブネット |
AWS::EC2::Subnet が2つ定義されているか(各 /24) |
| NAT Gateway |
AWS::EC2::NatGateway が定義されていないか |
想定出力結果(一部抜粋・簡略化)
Resources:
# ① VPC
SesameVpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: sesame-admin-vpc
# ② Private Isolated Subnet(AZ-1)
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: SesameVpc
CidrBlock: 10.0.0.0/24
# ③ Private Isolated Subnet(AZ-2)
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: SesameVpc
CidrBlock: 10.0.1.0/24
上記の例では、VPCが1つ、サブネットが2つ定義されていることが分かります。
また、NAT Gatewayについては、テンプレート全体を確認し、AWS::EC2::NatGateway が含まれていないことを確認します。
※ 上記は確認箇所を分かりやすくするための簡略化した例です。実際の出力にはルートテーブルなども含まれ、論理IDやCIDRが異なる場合があります。
③ デプロイ前の差分確認
最後に、以下のコマンドを実行します。
cdk diff
cdk diff は、CDKで定義した構成と、現在AWS環境にデプロイされているCloudFormationスタックの構成を比較するコマンドです。
これにより、デプロイ時に新規作成・変更・削除されるリソースを事前に確認できます。
想定出力結果(一部抜粋・簡略化)
Stack SesameInfraStack
Resources
[+] AWS::EC2::VPC SesameVpc
[+] AWS::EC2::Subnet SesameVpc/privateSubnet1/Subnet
[+] AWS::EC2::Subnet SesameVpc/privateSubnet2/Subnet
[+] AWS::EC2::RouteTable SesameVpc/privateSubnet1/RouteTable
[+] AWS::EC2::RouteTable SesameVpc/privateSubnet2/RouteTable
[+] AWS::EC2::SubnetRouteTableAssociation SesameVpc/privateSubnet1/RouteTableAssociation
[+] AWS::EC2::SubnetRouteTableAssociation SesameVpc/privateSubnet2/RouteTableAssociation
差分表示の記号には、以下の意味があります。
| 記号 | 意味 | 表示色の目安 |
|---|---|---|
[+] |
リソースの新規作成 | 緑 |
[~] |
既存リソースの変更 | 黄 |
[-] |
既存リソースの削除 | 赤 |
今回のように初めてスタックをデプロイする場合は、主に新規作成を示す [+] が表示されます。
また、CDKの設定によっては、デフォルトセキュリティグループを制限するためのカスタムリソースなども作成対象に含まれます。
※ 上記は確認対象のリソースを抜粋した例です。実際の出力では、CDKが生成した論理IDなども表示されます。
意図しないリソースの変更や削除が含まれていないことを確認してから、デプロイへ進みます。
6. AWS環境へのデプロイ
差分を確認したら、実際にAWS環境へデプロイします。
cdk deploy
cdk deploy は、CDKで定義した構成をCloudFormation経由でAWS環境に反映するコマンドです。
デプロイが正常に完了すると、VPCとサブネット、ルートテーブルなどが作成されます。
また、今回のコードでは CfnOutput を設定しているため、デプロイ結果にVPC IDが出力されます。
AWS CLIでの構築結果確認
cdk deploy が正常に完了したら、AWS CLIを使用して作成されたリソースを確認します。
① VPCの確認
aws ec2 describe-vpcs \
--filters "Name=tag:Name,Values=sesame-admin-vpc" \
--query "Vpcs[].{VpcId:VpcId,Cidr:CidrBlock,State:State}" \
--region ap-northeast-1
VPCが作成され、CIDRが 10.0.0.0/16、状態が available になっていることを確認します。
② サブネットの確認
続いて、作成したVPCに紐づくサブネットを確認します。
以下の vpc-xxxxxxxxxxxxxxxxx は、①で取得したVPC IDに置き換えて実行します。
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=vpc-xxxxxxxxxxxxxxxxx" \
--query "Subnets[].{SubnetId:SubnetId,Cidr:CidrBlock,AZ:AvailabilityZone}" \
--region ap-northeast-1
サブネットが2つ存在し、それぞれ異なるAZに配置され、CIDRが /24 になっていることを確認します。
以上で、CDKで定義したVPCとサブネットがAWS環境に作成されたことを確認できました。
まとめ
今回はCDKを使用して、VPCとサブネットを構築しました。
CDKを使用することで、VPCやサブネットなどのAWSリソースをコードでまとめて管理できることや、構成を変更した場合でも、コードを修正して再デプロイすることで元の構成に戻しやすいことが分かりました。
また、「CDKからAWS環境への反映の流れ」を図解することで、TypeScriptで定義した構成がCloudFormationテンプレートに変換され、AWS環境へ反映されるまでの仕組みについても理解を深めることができました。
次回は、今回構築したVPCとは別に、Webアプリケーションのフロントエンドを配置するためのS3の構築を進めていく予定です。
CDKを使用してS3バケットを作成し、Nuxtで作成したWebアプリケーションの静的ファイルを配置するための環境を準備していきます。
その後は、CloudFrontと組み合わせて、Webアプリケーションを配信できる構成を目指します。
関連記事
