はじめに
はじめまして、社会人4年目の道産子エンジニア 村井です。
AWSを学び始めたとき、最初に大きな壁になりやすいサービスのひとつが Amazon VPC ではないでしょうか。
EC2を起動するだけなら、デフォルトVPCを使えばなんとなく動きます。
しかし、自分でVPC、サブネット、ルートテーブル、Internet Gateway、NAT Gateway、セキュリティグループ、ネットワークACLを設定し始めると、一気に分からない単語が増えます。
特に初心者のころは、次のような疑問で詰まりやすいと思います。
- パブリックサブネットとプライベートサブネットは何が違うのか
- Internet Gatewayを付けたのにEC2へ接続できないのはなぜか
- セキュリティグループとネットワークACLはどちらを見ればいいのか
- NAT Gatewayを作ったのにプライベートサブネットからインターネットへ出られないのはなぜか
- ルートテーブルは何をしているのか
この記事では、VPCまわりで初心者が混乱しやすい設定を、できるだけ実務で確認する順番に近い形で整理します。
対象読者
- AWSのVPCを学び始めた方
- EC2やRDSを触り始めたが、ネットワーク設定でよく詰まる方
- パブリックサブネット、プライベートサブネット、ルートテーブル、セキュリティグループ、NACLの違いを整理したい方
この記事で扱うこと
- VPCとサブネットの基本
- パブリックサブネットとプライベートサブネットの違い
- ルートテーブルの見方
- Internet GatewayとNAT Gatewayの役割
- セキュリティグループとネットワークACLの違い
- 接続できないときの確認順
この記事で扱わないこと
- Transit Gateway
- VPC Peering
- Direct Connect
- Site-to-Site VPN
- IPv6の詳細設計
- 本番向けの詳細なネットワーク設計
1. VPCとは
Amazon VPCは、AWS上に作る仮想ネットワークです。
AWS公式ドキュメントでは、VPCは自分で定義した論理的に分離された仮想ネットワークとして説明されています。
ざっくり言うと、VPCは「AWS上に作る自分用のネットワーク空間」です。
例えば、次のようなリソースはVPCの中に配置されます。
- EC2
- RDS
- ECSのタスク
- LambdaのVPC接続
- ALB
- ElastiCache
VPCを作るときには、CIDRブロックを決めます。
例えば 10.0.0.0/16 のような範囲です。
このVPCの中を、さらに小さく分けたものがサブネットです。
2. サブネットとは
サブネットは、VPC内のIPアドレス範囲をさらに分割したものです。
例えば、VPCを 10.0.0.0/16 で作った場合、次のようにサブネットを分けることがあります。
10.0.1.0/24: パブリックサブネット10.0.2.0/24: プライベートサブネット10.0.11.0/24: 別AZのパブリックサブネット10.0.12.0/24: 別AZのプライベートサブネット
ここで混乱しやすいのが、「パブリックサブネット」と「プライベートサブネット」という名前です。
名前だけ見ると、サブネットそのものに「パブリック属性」や「プライベート属性」があるように感じます。
しかし実際には、サブネットの性質は主に関連付けられたルートテーブルによって決まります。
パブリックサブネットとプライベートサブネットの違い
初心者がまず押さえたいポイントは次のとおりです。
パブリックサブネット:
- ルートテーブルに
0.0.0.0/0 -> Internet Gatewayのルートがある - インターネットと直接通信できる経路がある
- ALBや踏み台EC2など、外部から到達させたいリソースを置くことが多い
プライベートサブネット:
- ルートテーブルに
0.0.0.0/0 -> Internet Gatewayのルートがない - インターネットから直接到達できない
- RDSやアプリケーションサーバーなど、外部公開したくないリソースを置くことが多い
- 外向き通信が必要な場合は、NAT Gatewayなどを経由する
つまり、パブリックサブネットかどうかを判断するときは、サブネット名ではなくルートテーブルを見ます。
サブネット名を
public-subnetにしただけでは、パブリックサブネットにはなりません。
ルートテーブルでInternet Gatewayへのデフォルトルートが設定されている必要があります。
3. ルートテーブルとは
ルートテーブルは、通信の行き先を決める表です。
AWS公式ドキュメントでは、ルートテーブルはサブネットやゲートウェイからのネットワークトラフィックの宛先を決めるルールの集合として説明されています。
例えば、次のようなルートがあるとします。
宛先: 10.0.0.0/16
ターゲット: local
これは、VPC内の通信はVPC内部でルーティングする、という意味です。
VPCを作成すると、このlocalルートは自動的に作成されます。
パブリックサブネットの場合は、さらに次のようなルートを追加します。
宛先: 0.0.0.0/0
ターゲット: Internet Gateway
0.0.0.0/0 は、ざっくり言えば「それ以外のすべてのIPv4宛先」です。
このルートがあることで、VPC外、つまりインターネット方向への通信がInternet Gatewayに向かいます。
プライベートサブネットからインターネットへ出たい場合は、次のようなルートにします。
宛先: 0.0.0.0/0
ターゲット: NAT Gateway
ここでのポイントは、プライベートサブネットのデフォルトルートをInternet Gatewayに向けるのではなく、NAT Gatewayに向けることです。
4. Internet Gatewayとは
Internet Gatewayは、VPCとインターネットを接続するためのゲートウェイです。
ただし、Internet GatewayをVPCにアタッチしただけでは、EC2がインターネットと通信できるとは限りません。
外部からEC2へ接続するには、少なくとも次の条件を確認する必要があります。
- VPCにInternet Gatewayがアタッチされている
- 対象サブネットのルートテーブルに
0.0.0.0/0 -> Internet Gatewayがある - EC2にパブリックIPv4アドレス、またはElastic IPが付いている
- セキュリティグループで必要なインバウンド通信が許可されている
- ネットワークACLで必要な通信が拒否されていない
- OS側のファイアウォールやアプリケーション設定で待ち受けている
「Internet Gatewayを付けたのにSSHできない」というケースでは、Internet Gatewayだけを見ても原因は分かりません。
ルートテーブル、パブリックIP、セキュリティグループ、NACL、OS側設定を順番に確認する必要があります。
5. NAT Gatewayとは
NAT Gatewayは、プライベートサブネット内のリソースからインターネットなどVPC外へ出ていく通信を可能にするためのサービスです。
AWS公式ドキュメントでは、NAT Gatewayを使うと、プライベートサブネット内のインスタンスからVPC外のサービスへ接続できる一方、外部サービスからそのインスタンスへ接続を開始することはできない、と説明されています。
よくある構成は次のとおりです。
- パブリックサブネットにNAT Gatewayを作成する
- NAT GatewayにElastic IPを関連付ける
- パブリックサブネットのルートテーブルは
0.0.0.0/0 -> Internet Gateway - プライベートサブネットのルートテーブルは
0.0.0.0/0 -> NAT Gateway
この構成により、プライベートサブネットのEC2やECSタスクなどは、インターネットから直接入られることなく、外向き通信だけを行えます。
例えば、次のような用途です。
- OSパッケージのアップデート
- 外部APIへのアクセス
- コンテナイメージの取得
- 外部リポジトリへのアクセス
NAT Gatewayはプライベートサブネットではなく、通常はパブリックサブネットに配置します。
NAT Gateway自身がInternet Gateway経由でインターネットへ出られる必要があるためです。
6. セキュリティグループとは
セキュリティグループは、EC2やALB、RDSなどのリソース単位で通信を制御する仮想ファイアウォールです。
AWS公式ドキュメントでは、セキュリティグループはEC2インスタンスなどのリソースレベルで、特定のインバウンド・アウトバウンド通信を許可するものとして説明されています。
特徴は次のとおりです。
- リソース単位で設定する
- 許可ルールのみを書く
- ステートフル
- インバウンドで許可した通信への戻り通信は自動で許可される
- 複数のセキュリティグループを1つのリソースに関連付けられる
例えば、Webサーバー用EC2であれば次のような設定をします。
インバウンド:
- HTTP 80番ポートを
0.0.0.0/0から許可 - HTTPS 443番ポートを
0.0.0.0/0から許可 - SSH 22番ポートを自分のIPアドレスからのみ許可
アウトバウンド:
- 必要に応じて外向き通信を許可
初心者のうちは、「まずセキュリティグループを見る」と覚えておくとトラブルシュートしやすいです。
7. ネットワークACLとは
ネットワークACL、またはNACLは、サブネット単位で通信を制御する機能です。
AWS公式ドキュメントでは、ネットワークACLはサブネットレベルで特定のインバウンド・アウトバウンド通信を許可または拒否するものとして説明されています。
特徴は次のとおりです。
- サブネット単位で設定する
- 許可ルールと拒否ルールを書ける
- ステートレス
- インバウンドとアウトバウンドをそれぞれ明示的に考える必要がある
- ルール番号の小さい順に評価される
セキュリティグループと比べると、NACLは少し扱いが難しいです。
初心者のうちは、明確な理由がなければデフォルトのNACLから大きく変更しない方がトラブルを避けやすいです。
セキュリティグループとNACLの違い
混乱しやすいので、表で整理します。
| 項目 | セキュリティグループ | ネットワークACL |
| 適用単位 | リソース単位 | サブネット単位 |
| ルール | 許可のみ | 許可と拒否 |
| 状態管理 | ステートフル | ステートレス |
| 戻り通信 | 自動で許可される | 明示的に許可が必要 |
| 評価 | 関連する全ルール | ルール番号順 |
| 初心者の確認優先度 | 高い | セキュリティグループの次 |
個人的な覚え方は次のとおりです。
- セキュリティグループ: リソースのドア
- NACL: サブネットの入口・出口
EC2に接続できない場合、まずセキュリティグループを確認し、それでも分からない場合にNACLを確認すると整理しやすいです。
8. よくある詰まりポイント
ここからは、初心者がよく混乱するパターンを具体的に整理します。
8-1. EC2にSSHできない
確認すること:
- EC2がパブリックサブネットにあるか
- サブネットのルートテーブルに
0.0.0.0/0 -> Internet Gatewayがあるか - EC2にパブリックIPv4アドレスまたはElastic IPが付いているか
- セキュリティグループで22番ポートが自分のIPから許可されているか
- NACLで22番ポートと戻り通信が拒否されていないか
- キーペアやユーザー名が正しいか
- OS側でSSHが起動しているか
初心者のころは、セキュリティグループだけを見て「22番ポートを開けているのになぜ接続できないのか」と悩みがちです。
しかし、そもそもパブリックIPが付いていなかったり、ルートテーブルがInternet Gatewayを向いていなかったりするケースもあります。
8-2. プライベートサブネットのEC2からインターネットへ出られない
確認すること:
- NAT Gatewayが作成されているか
- NAT Gatewayがパブリックサブネットにあるか
- NAT GatewayにElastic IPが関連付いているか
- NAT Gatewayがあるパブリックサブネットのルートテーブルに
0.0.0.0/0 -> Internet Gatewayがあるか - プライベートサブネットのルートテーブルに
0.0.0.0/0 -> NAT Gatewayがあるか - セキュリティグループでアウトバウンドが許可されているか
- NACLで外向き通信と戻り通信が拒否されていないか
特に多いのは、NAT Gatewayを作っただけで満足してしまい、プライベートサブネット側のルートテーブルをNAT Gatewayに向け忘れるパターンです。
8-3. ALBはあるのにWeb画面が表示されない
確認すること:
- ALBがパブリックサブネットに配置されているか
- ALBのセキュリティグループで80番ポートまたは443番ポートが許可されているか
- ターゲットグループに登録されたEC2やECSタスクがhealthyになっているか
- ALBからターゲットへの通信がターゲット側セキュリティグループで許可されているか
- ターゲットのアプリケーションが指定ポートで待ち受けているか
- ヘルスチェックパスが正しいか
- ルートテーブルやNACLで通信が拒否されていないか
ALBの場合、インターネットからALBへの通信だけでなく、ALBからターゲットへの通信も考える必要があります。
例えば、ALBのセキュリティグループで80番ポートを開けていても、EC2側のセキュリティグループでALBからの通信を許可していなければ、ターゲットはunhealthyになります。
8-4. RDSに接続できない
確認すること:
- RDSが配置されているサブネットグループが正しいか
- 接続元のEC2やLambdaと同じVPC、または到達可能なネットワークにあるか
- RDSのセキュリティグループで接続元からのDBポートが許可されているか
- 接続元のセキュリティグループでアウトバウンドが許可されているか
- NACLで通信が拒否されていないか
- RDSをパブリックアクセス可能にする必要が本当にあるか
- DBのユーザー名、パスワード、エンドポイント、ポートが正しいか
RDSは基本的にプライベートサブネットに置くことが多いです。
学習目的で手元PCから直接接続したい場合、パブリックアクセスやセキュリティグループを調整することもありますが、本番環境では慎重に考える必要があります。
9. 接続できないときの確認順
VPCまわりで接続できないときは、次の順番で確認すると整理しやすいです。
- どこからどこへ通信したいのかを明確にする
- 送信元と送信先のVPC、サブネット、IPアドレスを確認する
- 送信元サブネットのルートテーブルを確認する
- Internet GatewayやNAT Gatewayなど、必要なターゲットが存在するか確認する
- セキュリティグループを確認する
- ネットワークACLを確認する
- OSやアプリケーション側で待ち受けているか確認する
- DNS名を使っている場合は名前解決を確認する
- VPC Flow LogsやReachability Analyzerなどで追加調査する
ポイントは、「通信経路」と「許可設定」を分けて考えることです。
通信経路:
- VPC
- サブネット
- ルートテーブル
- Internet Gateway
- NAT Gateway
許可設定:
- セキュリティグループ
- ネットワークACL
- OSファイアウォール
- アプリケーション設定
経路がない通信は、セキュリティグループを開けても届きません。
逆に、経路があってもセキュリティグループで拒否されていれば通信できません。
10. 初心者向けの覚え方
最後に、VPCまわりの用語をざっくり覚えるためのイメージをまとめます。
- VPC: AWS上に作る自分用のネットワーク空間
- サブネット: VPCを小さく分けた部屋
- ルートテーブル: 通信の行き先を決める地図
- Internet Gateway: VPCからインターネットへ出るための出口
- NAT Gateway: プライベートサブネットから外へ出るための中継役
- セキュリティグループ: リソース単位のドア
- ネットワークACL: サブネット単位の入口・出口チェック
このイメージだけでも、トラブルシュートのときに「今どこを見ればいいのか」が分かりやすくなります。
まとめ
今回は、AWS初心者が混乱しやすいVPC設定について整理しました。
特に重要なのは次のポイントです。
- パブリックサブネットかどうかは、名前ではなくルートテーブルで判断する
- Internet Gatewayを付けただけではインターネット接続は完成しない
- プライベートサブネットから外へ出るには、NAT Gatewayとルートテーブル設定が必要
- セキュリティグループはリソース単位、NACLはサブネット単位
- 接続できないときは、経路と許可設定を分けて確認する
VPCは最初こそ難しく感じますが、構成要素をひとつずつ分けて見ると理解しやすくなります。
まずは小さな構成で、パブリックサブネットのEC2に接続する、プライベートサブネットのEC2からNAT Gateway経由で外に出る、といった基本パターンを手を動かして確認してみるのがおすすめです。
参考リンク
– Amazon VPCとは?
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html
– サブネット
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/configure-subnets.html
– ルートテーブル
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Route_Tables.html
– インターネットゲートウェイ
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html
– NAT ゲートウェイ
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html
– セキュリティグループ
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-security-groups.html
– ネットワーク ACL
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-network-acls.html
– VPCのセキュリティ機能
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Security.html
– トラブルシューティング(EC2)
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-troubleshoot.html
– トラブルシューティング(ALB)
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-troubleshooting.html
– トラブルシューティング(RDS)
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Troubleshooting.html