
VPC(Virtual Private Cloud)は、AWS上に作成する仮想的な専用ネットワーク環境です。
利用者自身で CIDR(Classless Inter-Domain Routing)を割り当て、AZ(Availability Zone)ごとにPublic SubnetやPrivate Subnetを構成し、Route Table、IGW(Internet Gateway)、NAT Gateway、SG(Security Group)、NACL(Network ACL)などを組み合わせて、EC2 や RDS などのリソースを安全に配置・分離することができます。
各リソースには Private IP(内部通信用)と、必要に応じて Public IP(インターネット通信用)を割り当てることができます。また、ENI(Elastic Network Interface) と呼ばれる仮想ネットワークインターフェースを利用することで、1つのインスタンスに複数のネットワークアドレスやサブネットを柔軟に付与できます。
VPC内部からAWSの他サービスへ安全に接続する際は、VPC Endpointを利用することで、インターネットを経由せずにS3やDynamoDBなどへプライベート接続が可能です。
VPC内のトラフィックを監視・可視化するには、VPC Flow Logs を有効化します。これにより、ネットワーク通信の送信元・宛先・許可/拒否情報などをCloudWatch LogsやS3に記録し、セキュリティ監査やトラブルシューティングに活用できます。
オンプレミス環境とVPCを接続する場合は、Direct Connect や Site-to-Site VPN を利用します。
VPC間の接続には、VPC Peering、Transit Gateway、PrivateLink などを用いて、複数のVPCを安全かつ効率的に連携させることができます。
このようにVPCでは、ネットワーク境界を明確に定義し、ゼロトラストを前提とした細粒度なトラフィック制御が可能です。
重要用語
ユースケース
| Webアプリケーションの安全な構築 | 公開するWebサーバーをパブリックサブネットに、データベースをプライベートサブネットに配置し、セキュリティグループで外部からのアクセスを制御する構成をとる。 |
| 社内ネットワークとつなぐハイブリッドクラウド | オンプレミス環境とVPCをSite-to-Site VPNやDirect Connectで接続し、社内システムとクラウド上のシステムを同一ネットワークのように扱う。 |
| マイクロサービスごとのネットワーク分離 | サービスごとにサブネットやセキュリティグループを分け、最小限のポート・通信経路だけを許可することでマイクロサービス間の影響範囲を限定する。 |
ベストプラクティス
| 複数AZにまたがるサブネット設計 | 高可用性のために少なくとも2つ以上のAZにパブリック/プライベートサブネットを配置する。 |
| 最小権限のセキュリティグループ | インバウンド・アウトバウンドは必要最小限のポートとCIDR範囲のみを許可する。 |
| VPCフローログの有効化 | トラフィックをCloudWatch LogsやS3に記録し、監査やトラブルシューティングに活用する。 |
高可用性・バックアップ・リトライ
| 高可用性・バックアップ・リトライ設計のポイント |
|---|
| 【デフォルト】AWS内部で冗長化 ・VPCルーター(暗黙的ルーター) ・Internet Gateway (IGW) ・VPC DNS(Route 53 Resolver) ・DHCPサービス ・セキュリティグループ処理基盤 ・ネットワークACL処理基盤 ・VPCエンドポイント(ゲートウェイ型) ・VPC Peering接続 |
| サブネットの複数AZ設計 |
| NAT Gatewayの複数AZ配置 |
| VPCエンドポイント(インターフェース型)の複数AZ配置 |
| Transit Gateway Attachmentの複数AZ配置 |
| Direct Connect接続の冗長化 |
| VPN接続のCustomer Gateway冗長化 |
セキュリティ
| 関連サービス | 設定内容 |
|---|---|
| CloudTrail(操作履歴の記録・監査・追跡) | 【自動記録】 作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI) データ操作は追跡できない(データプレーンAPI) |
| Config(リソースの構成状態・設定変更を記録) | 【Configが有効な場合】 サブネット/ルートテーブル/SG/NACL等の変更履歴・パブリック露出/不適切ポート開放の準拠評価 |
| GuardDuty(脅威を自動検出) | 【GuardDutyが有効な場合】 Flow Logs由来のネットワーク/DNS異常通信検知 |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| CloudWatch Logs | 【有効化が必要】 VPCフローログ |
標準メトリクス(NAT Gateway)
| メトリクス名 | 説明 |
|---|---|
| BytesInFromDestination | 宛先からの受信バイト数 |
| BytesInFromSource | ソースからの受信バイト数 |
| BytesOutToDestination | 宛先への送信バイト数 |
| BytesOutToSource | ソースへの送信バイト数 |
| ConnectionAttemptCount | 接続試行回数 |
| ConnectionEstablishedCount | 確立された接続数 |
| PacketsInFromDestination | 宛先からの受信パケット数 |
| PacketsInFromSource | ソースからの受信パケット数 |
| PacketsOutToDestination | 宛先への送信パケット数 |
| PacketsOutToSource | ソースへの送信パケット数 |
| ActiveConnectionCount | アクティブ接続数 |
| ErrorPortAllocation | ポート割り当てエラー数 |
| IdleTimeoutCount | アイドルタイムアウト数 |
| PacketsDropCount | ドロップされたパケット数 |
カスタムメトリクス(VPC Flow Logs+メトリクスフィルター)
| メトリクス名 | 説明 |
|---|---|
| BytesIn | VPC内受信バイト(フローログメトリクスなど) |
| BytesInFromAWS | AWS内部からの受信バイト数 |
| BytesInFromInternet | インターネットからの受信バイト数 |
| BytesOut | VPC内送信バイト |
| BytesOutToAWS | AWS内部への送信バイト数 |
| BytesOutToInternet | インターネットへの送信バイト数 |
| PacketsIn | 受信パケット数 |
| PacketsOut | 送信パケット数 |
| RejectedPackets | 拒否されたパケット数 |
制限値(固定値/ハードリミット/ソフトリミット)
| ハードリミット | 制限値 |
|---|---|
| IPv6 CIDR ブロック数/VPC | 5 |
| フローログ数/リソース | 2 |
| ソフトリミット | 制限値 |
|---|---|
| VPC数/リージョン | 5 |
| サブネット数/VPC | 200 |
| IPv4 CIDR ブロック数/VPC | 5(最大50) |
| Elastic IP数/リージョン | 5 |
| インターネットゲートウェイ数/リージョン | 5 |
| カスタマーゲートウェイ数/リージョン | 50 |
| VPNゲートウェイ数/リージョン | 5 |
| セキュリティグループ数/VPC | 2,500 |
| セキュリティグループルール数/グループ | 60(インバウンド)、60(アウトバウンド) |
| ネットワークACL数/VPC | 200 |
| ルートテーブル数/VPC | 200 |
| ルート数/ルートテーブル | 50 |
| NATゲートウェイ数/AZ | 5 |
| VPCピアリング接続数/VPC | 50 |
AWS CLIのサンプルコード

①VPC を作成する
aws ec2 create-vpc ¥
--cidr-block 10.0.0.0/16 ¥
--tag-specifications 'ResourceType=vpc, \
Tags=[{Key=Name,Value=MyVPC}]'
VPC ID を表示する
aws ec2 describe-vpcs
❶VPC を削除する(VPC ID 指定)
aws ec2 delete-vpc \
--vpc-id vpc-xxxxxxxxx
②Subnet を作成する(VPC ID 指定)
aws ec2 create-subnet \
--vpc-id vpc-xxxxxxxxx \
--cidr-block 10.0.0.0/24 \
--availability-zone ap-northeast-1a \
--tag-specifications 'ResourceType=subnet, \
Tags=[{Key=Name,Value=public-subnet-1a}]'
Subnet IDを表示する
aws ec2 describe-subnets
❷Subnet を削除する(Subnet ID 指定)
aws ec2 delete-subnet \
--subnet-id subnet-xxxxxxxxx
③RouteTable を作成する(VPC ID 指定)
aws ec2 create-route-table \
--vpc-id vpc-xxxxxxxxx \
--tag-specifications 'ResourceType=route-table, \
Tags=[{Key=Name,Value=public-rt-1a}]'
RouteTable ID、関連付けを表示する
aws ec2 describe-route-tables
③RouteTableをSubnetに関連付ける(RouteTable ID、Subnet ID 指定)
aws ec2 associate-route-table \
--route-table-id rtb-xxxxxxxxx \
--subnet-id subnet-xxxxxxxxx
❸RouteTableとSubnetの関連付けを解除する(関連付けID 指定)
aws ec2 disassociate-route-table \
--association-id rtbassoc-xxxxxxxxx
❸RouteTable を削除する(RouteTable ID 指定)
aws ec2 delete-route-table \
--route-table-id rtb-xxxxxxxxx
④Internet GW を作成する
aws ec2 create-internet-gateway \
--tag-specifications 'ResourceType=internet-gateway,\
Tags=[{Key=Name,Value=MyIGW}]'
Internet GW ID 、アタッチ状態を表示する
aws ec2 describe-internet-gateways
④Internet GW を VPC にアタッチする(Internet GW ID、VPC ID 指定)
aws ec2 attach-internet-gateway \
--internet-gateway-id igw-xxxxxxxxx \
--vpc-id vpc-xxxxxxxxx
⑤RouteTable に Internet GW 用のルートを追加する(RouteTable ID、Internet GW ID 指定)
aws ec2 create-route \
--route-table-id rtb-xxxxxxxxx \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id igw-xxxxxxxxx
❹Internet GW を VPC からデタッチする(Internet GW ID、VPC ID 指定)
aws ec2 detach-internet-gateway \
--internet-gateway-id igw-xxxxxxxxx \
--vpc-id vpc-xxxxxxxxx
❹Internet GW を 削除する(Internet GW ID 指定)
aws ec2 delete-internet-gateway \
--internet-gateway-id igw-xxxxxxxxx
➅Elastic IP(NAT GW用)を作成する
aws ec2 allocate-address \
--domain vpc
Elastic IP の Allocation IDを表示する
aws ec2 describe-addresses
⑦NAT GW をPublic Subnet に作成する(Subnet ID、Allocation ID 指定)
aws ec2 create-nat-gateway \
--subnet-id subnet-xxxxxxxxx \
--allocation-id eipalloc-xxxxxxxxx
NAT GW ID を表示する
aws ec2 describe-nat-gateways
⑧RouteTable に NAT GW 用のルートを追加する(RouteTable ID、NAT GW ID 指定)
aws ec2 create-route \
--route-table-id rtb-xxxxxxxxx \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id nat-xxxxxxxxx
❼NAT GW を 削除する(NAT GW ID 指定)
aws ec2 delete-nat-gateway \
--nat-gateway-id nat-xxxxxxxxx
❻Elastic IP(NAT GW用)を解放する(Allocation ID 指定)
aws ec2 release-address \
--allocation-id eipalloc-xxxxx
CloudFormationのサンプルコード
Terraformのサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| VPC自体は無料 | - |
| NAT Gateway | NAT Gatewayの稼働時間と処理データ量 |
| VPCエンドポイント | Interfaceエンドポイントの時間とデータ処理 GLBエンドポイントの時間とデータ処理 |
| VPCピアリング | アベイラビリティゾーン間データ転送 リージョン間のデータ転送 |
| パブリックIPv4アドレス | パブリックIPv4アドレスの使用料金 |