GCPのVPC・サブネット・リージョン・ゾーンの関係を整理する

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では、スコープを以下のように押さえると理解しやすいです。

リソーススコープ
VPCglobal
Subnetregional
VMzonal

つまり、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-northeast1app-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 ZoneSubnet
OKasia-northeast1-aasia-northeast1 の subnet
NGasia-northeast1-aus-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接続方式を理解しやすくなる

参考

タグ: GCP, クラウド設計, ネットワーク