2026年5月17日
2026年5月17日
AWSでVPC(仮想プライベートクラウド)を設定する方法
はじめに
AWSのVPC(Virtual Private Cloud)はクラウド上に論理的に分離されたネットワーク空間を作る仕組みで、すべてのリソース配置の基盤となります。デフォルトVPCも利用可能ですが、本番運用ではCIDR設計・サブネット分割・ルーティング設計を意識した独自VPCを作るのが定石です。
本記事ではAWS CLI v2を使い、VPC作成からパブリック・プライベートサブネット構成、IGW(インターネットゲートウェイ)アタッチ、ルートテーブル設定までを実例で示します。
設計上はマルチAZ配置を基本とし、可用性と将来のスケールに備えたCIDRレンジを選ぶことが重要です。
症状・背景
- デフォルトVPCで運用しているが、本番用に分離したい
- マルチAZ構成で耐障害性を高めたい
- パブリック(Web)とプライベート(DB)サブネットを分けたい
- 既存オンプレネットワークと将来VPNで接続することを見据えたCIDR設計が欲しい
手順・設定方法
ステップ1: VPCを作成
# VPCを作成(10.0.0.0/16)
VPC_ID=$(aws ec2 create-vpc --cidr-block 10.0.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=prod-vpc}]' \
--query "Vpc.VpcId" --output text)
echo "VPC: $VPC_ID"
# DNSホスト名を有効化
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-support
ステップ2: パブリック・プライベートサブネットを作成
# パブリックサブネット(ap-northeast-1a)
PUB_A=$(aws ec2 create-subnet --vpc-id $VPC_ID \
--cidr-block 10.0.1.0/24 --availability-zone ap-northeast-1a \
--query "Subnet.SubnetId" --output text)
# パブリックサブネット(1c)
PUB_C=$(aws ec2 create-subnet --vpc-id $VPC_ID \
--cidr-block 10.0.2.0/24 --availability-zone ap-northeast-1c \
--query "Subnet.SubnetId" --output text)
# プライベートサブネット(1a, 1c)
PRI_A=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.0.11.0/24 --availability-zone ap-northeast-1a --query "Subnet.SubnetId" --output text)
PRI_C=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block 10.0.12.0/24 --availability-zone ap-northeast-1c --query "Subnet.SubnetId" --output text)
ステップ3: IGWアタッチとルートテーブル設定
# IGWを作成しVPCにアタッチ
IGW_ID=$(aws ec2 create-internet-gateway --query "InternetGateway.InternetGatewayId" --output text)
aws ec2 attach-internet-gateway --vpc-id $VPC_ID --internet-gateway-id $IGW_ID
# パブリック用ルートテーブル
RT_PUB=$(aws ec2 create-route-table --vpc-id $VPC_ID --query "RouteTable.RouteTableId" --output text)
aws ec2 create-route --route-table-id $RT_PUB --destination-cidr-block 0.0.0.0/0 --gateway-id $IGW_ID
# パブリックサブネットへ関連付け
aws ec2 associate-route-table --route-table-id $RT_PUB --subnet-id $PUB_A
aws ec2 associate-route-table --route-table-id $RT_PUB --subnet-id $PUB_C
ステップ4: NATゲートウェイでプライベートからの送信路を確保
# Elastic IPを確保
EIP_ALLOC=$(aws ec2 allocate-address --domain vpc --query "AllocationId" --output text)
# NAT Gateway をパブリックサブネットに作成
NAT_ID=$(aws ec2 create-nat-gateway --subnet-id $PUB_A \
--allocation-id $EIP_ALLOC --query "NatGateway.NatGatewayId" --output text)
# プライベート用ルートテーブルとデフォルトルート
RT_PRI=$(aws ec2 create-route-table --vpc-id $VPC_ID --query "RouteTable.RouteTableId" --output text)
aws ec2 create-route --route-table-id $RT_PRI --destination-cidr-block 0.0.0.0/0 --nat-gateway-id $NAT_ID
aws ec2 associate-route-table --route-table-id $RT_PRI --subnet-id $PRI_A
aws ec2 associate-route-table --route-table-id $RT_PRI --subnet-id $PRI_C
注意事項
- VPCのCIDRは作成後に縮小できないため、最初に十分余裕を持って
/16を割り当てる - NAT Gatewayは時間課金+データ転送課金が発生する。コスト最適化が必要なら NAT インスタンスや VPC エンドポイントを検討
- マルチAZ構成にしないと単一AZ障害でサービス全停止のリスク
- セキュリティグループとネットワークACL(NACL)の役割を混同しないように
まとめ
1. CIDR /16で大きく確保し将来の拡張に備える
2. パブリック・プライベートサブネットを2AZ以上で配置
3. IGWでパブリック、NATでプライベートの外向きを実現
4. ルートテーブルを用途別に分離し誤って公開しない
5. VPC設計はやり直し困難なので最初に十分検討する
関連記事: