GCPのVPCを理解するときに最初に詰まりやすいのは、VPC・サブネット・リージョン・ゾーンの関係です。特に「サブネットはゾーンに属するのか」「VPCはリージョンごとに作るのか」「VMはリージョンとゾーンのどちらに置くのか」が混ざると、その後のCloud NAT、Private Google Access、Cloud SQL private IP、Cloud RunのVPC接続まで曖昧になります。
本記事では、GCPのVPCを「どこに置かれるか」と「どのIPを使うか」に分けて整理します。
なお、VPC・サブネット・リージョン・ゾーンという言葉自体はクラウド全般で出てきますが、スコープの切り方はクラウドごとに違います。この記事で扱うのはGCPの仕様です。たとえばGCPではVPCがglobal、Subnetがregionalですが、AWSではVPCはregional、SubnetはAvailability Zone単位です。したがって「GCPではこう」と明示して理解する必要があります。
まず結論
GCPでは、スコープを以下のように押さえると理解しやすいです。
| リソース | スコープ |
|---|---|
| VPC | global |
| Subnet | regional |
| VM | zonal |
つまり、VPCはグローバルなネットワークで、その中にリージョン単位のサブネットを作ります。VMはゾーンに配置され、同じリージョンのサブネットから内部IPをもらいます。
flowchart TB
subgraph vpc["VPC: my-vpc(global)"]
subgraph region["Region: asia-northeast1"]
subnet["Subnet: app-subnet<br/>10.0.0.0/24"]
subgraph zoneA["Zone: asia-northeast1-a"]
vm1["VM #1<br/>10.0.0.10"]
end
subgraph zoneB["Zone: asia-northeast1-b"]
vm2["VM #2<br/>10.0.0.11"]
end
end
end
subnet -. "IPを配る" .-> vm1
subnet -. "IPを配る" .-> vm2
VPCはグローバルなネットワーク
GCPのVPCはリージョンごとに作るものではありません。1つのVPCの中に、複数リージョンのサブネットを持てます。
flowchart TB
subgraph vpc["VPC: my-vpc(global)"]
subgraph tokyo["Region: asia-northeast1"]
subnetTokyo["Subnet: tokyo-subnet<br/>10.0.0.0/24"]
end
subgraph osaka["Region: asia-northeast2"]
subnetOsaka["Subnet: osaka-subnet<br/>10.1.0.0/24"]
end
subgraph us["Region: us-central1"]
subnetUs["Subnet: us-subnet<br/>10.2.0.0/24"]
end
end
ただし、VPCがグローバルだからといって「VPCは1つしか作れない」という意味ではありません。プロジェクト内に複数のVPCを作れます。各VPCがそれぞれグローバルスコープを持つ、という理解です。
Project
├── VPC: prod-vpc(global)
│ ├── asia-northeast1 subnet
│ └── us-central1 subnet
└── VPC: dev-vpc(global)
├── asia-northeast1 subnet
└── us-central1 subnet
サブネットはリージョン単位のIP範囲
サブネットは、VPCの中に作るIPアドレス範囲です。ただし、スコープはリージョンです。ゾーンではありません。
Subnetは、VPC内に作る特定Region用のIPアドレス範囲です。
たとえば asia-northeast1 に app-subnet 10.0.0.0/24 を作ると、そのサブネットは東京リージョン内の複数ゾーンから使えます。
Region: asia-northeast1
Subnet: app-subnet 10.0.0.0/24
Zone: asia-northeast1-a
VM #1: 10.0.0.10
Zone: asia-northeast1-b
VM #2: 10.0.0.11
サブネットを「ゾーンの中にある箱」と考えると混乱します。サブネットは、リージョン全体で使う住所リストのようなものです。
- Zone: VMを置く場所
- Subnet: VMに配るIP住所リスト
VMはゾーンに置かれる
Compute Engine VMはゾーンリソースです。VMを作るときはゾーンを選びます。ゾーンを選ぶと、そのゾーンが属するリージョンも決まります。
VM作成時:
Zone: asia-northeast1-a
結果:
Region: asia-northeast1
Zone: asia-northeast1-a
同時に、VMはVPCとサブネットも選びます。正確には、VMのNICがそのサブネットに接続され、内部IPをもらいます。
NICはNetwork Interfaceのことで、VMがネットワークにつながるための仮想的な口です。
VM
└── NIC
├── VPC: my-vpc
├── Subnet: app-subnet
└── Internal IP: 10.0.0.10
- Zone:
asia-northeast1-a - VPC:
my-vpc - Subnet:
app-subnet - Internal IP:
10.0.0.10
ここで重要なのは、VMのゾーンとサブネットのリージョンが一致している必要があることです。
| 判定 | VM Zone | Subnet |
|---|---|---|
| OK | asia-northeast1-a | asia-northeast1 の subnet |
| NG | asia-northeast1-a | us-central1 の subnet |
ZoneとSubnetは親子ではない
ZoneとSubnetはどちらもRegionに関係しますが、親子ではありません。役割が違います。
Region: asia-northeast1
├── Zones
│ ├── asia-northeast1-a
│ └── asia-northeast1-b
└── Subnets
└── app-subnet: 10.0.0.0/24
VMは、配置場所としてZoneを持ち、ネットワーク接続先としてSubnetを持ちます。
- 置き場所:
asia-northeast1-a - IPの出どころ:
app-subnet 10.0.0.0/24
この2軸を分けると、GCPネットワークの見通しがよくなります。
まとめ
- GCPのVPCはグローバルリソースで、1つのVPCに複数リージョンのサブネットを持てる
- サブネットはVPC内に作るリージョン単位のIPアドレス範囲
- VMはゾーンに置かれ、同じリージョンのサブネットから内部IPをもらう
- Zoneは「置き場所」、Subnetは「IP住所リスト」と考えると混乱しにくい
- この関係を押さえると、VPC内外のリソース識別やprivate接続方式を理解しやすくなる