GCPでVPC内にあるリソースとVPC外にあるサービスを見分ける

GCPのネットワークを学ぶとき、「Cloud SQLは自分のGCPリソースなのに、なぜVPC内ではないのか」「Cloud RunはGoogle管理サービスだからVPC内ではないのか」「Cloud StorageやBigQueryはどこにいるのか」が混乱しがちです。

「実行基盤」「DBサービス」「オブジェクトストレージ」「serverless」といった分類はクラウド全般に通じる考え方です。一方で、Cloud SQL、Cloud Run、Private Google Access、Direct VPC egress のような具体名とVPCへの接続方法はGCP固有です。本記事では、一般的な見方を使いながら、最終的にはGCP上でどう判定するかに絞って整理します。

この混乱は、以下の2つを混ぜることで起きます。

  • 自分のGCPリソースか
  • 自分のVPC/Subnetに直接ぶら下がっているか

本記事では、この2軸でVPC内外のリソースを整理します。

判定基準

まず判定基準はこれです。

  • 作る場所としてVPC/Subnetを選ぶ: VPC内リソース
  • 接続先としてVPCを設定する: VPC外サービスだがVPCと接続できる

ここで出てくるNICは、Network Interfaceのことです。物理サーバーでいうネットワークカードの仮想版で、VMがVPC/Subnetにつながるための「ネットワーク口」と考えると分かりやすいです。

VM
└── NIC
    ├── 接続先VPC
    ├── 接続先Subnet
    └── 内部IP

たとえばCompute Engine VMは、作成時にVPCとSubnetを選びます。VMのNICがSubnetに接続され、内部IPを持ちます。これはVPC内リソースです。

一方でCloud Runは、通常「どのSubnetに配置するか」を選んでVMのように置くものではありません。ただし、VPC内リソースへアクセスしたい場合にVPC egressを設定できます。これは「VPC内に置かれる」のではなく「VPCへ出られるようにする」設定です。

GCPリソースかどうかとVPC内かどうかは別

Cloud SQLが混乱しやすいのは、Console上では確かに自分のリソースとして存在するからです。Cloud SQL instance という名前も出ます。

しかし、Compute Engine VMのように自分のVPC/SubnetにNICを持つわけではありません。

観点Compute Engine VMCloud SQL
Console上のGCPリソースはいはい
instanceという名前VM instanceCloud SQL instance
自分でOS管理するしない
自分のVPC/SubnetにNICを持つはい基本は違う
VPCとの関係VPC内に置くVPCからprivate接続する

つまりCloud SQLは「自分のGCPリソース」ではありますが、「自分のVPC内に置いたVM」ではありません。

Cloud SQLは自分の持ち物ですが、自分のVPC内に置いたサーバーではありません。

VPC内に直接いる代表

VPC内リソースとしてまず押さえるのは、アプリを動かす実行基盤です。

リソースVPC内か理由
Compute Engine VMVPC内NICがVPC/Subnetに接続される
GKE nodeVPC内実体はCompute Engine VM
GKE PodほぼVPC内として扱うVPC-nativeではPod IPもVPC由来
Internal Load BalancerVPC内VPC内のprivate IPで待ち受ける

ここでいう「VPC内の自前サービス」は、オンプレのことではありません。VPC内のVMやGKEに自分で載せているアプリやミドルウェアのことです。

Compute Engine VM
└── 自前APIアプリ

GKE
└── Pod
    └── 自前APIアプリ

設計図では、Compute Engine VMを「アプリサーバー」として省略表現することもあります。ただし厳密には、Compute Engineはアプリそのものではなく、アプリを載せる機械です。

VPC外にあるGoogleサービス

次に、VPC外として扱うGoogleサービスを分類します。ここで「マネージドサービス」という言葉を雑に使うと混乱します。GCPの多くのサービスはGoogleが管理するサービスですが、ネットワーク上の扱いは違います。

分類VPCとの関係
Serverlessアプリ実行基盤Cloud Run, App Engine, Cloud FunctionsVPC外。必要ならVPCへ接続する
Google API系Cloud Storage, BigQuery, Pub/Sub, Secret ManagerVPC外。APIとして呼ぶ
Google管理DB/Cache系Cloud SQL, MemorystoreVPC外。private接続で使うことが多い

重要なのは、Cloud RunとCloud SQLを「どちらもGoogle管理サービスだから同じ」と見ないことです。

  • Cloud Run: アプリ実行基盤。入る通信と出る通信を別々に考える
  • Cloud SQL: DB接続先。VPC内アプリからprivate接続する対象

Serverless系はVPC外だがVPCへ接続できる

Cloud Run、App Engine、Cloud Functionsは、アプリケーション実行基盤としてはserverless系です。これらは基本的に自分のVPC内に直接置かれるものではありません。

アプリの置き方代表例
VPC内でアプリを動かすCompute Engine / GKE
VPC外のserverlessでアプリを動かすCloud Run / App Engine / Cloud Functions

ただし、serverlessからVPC内リソースへアクセスすることはあります。その場合はDirect VPC egressやServerless VPC Accessを使います。

これは、VPC内リソースからCloud SQLやGoogle APIへ出る通信とは向きが逆です。ここではCloud Runなどのserverless実行基盤から、Your VPC内のリソースへ出ていく通信として見ます。

flowchart LR
  run["Cloud Run<br/>VPC外のserverless実行基盤"]
  subgraph vpc["Your VPC"]
    app["VPC内リソース<br/>VM / GKE / internal API"]
  end

  run -->|"Direct VPC egress"| app

まとめ

  • 「自分のGCPリソースか」と「自分のVPC内にいるか」は別の軸
  • VPC内かどうかは、VPC/Subnetに直接ぶら下がるかで見る
  • Compute Engine VMやGKE nodeはVPC内リソース
  • Cloud SQLは自分のGCPリソースだが、自分のVPC内VMではない
  • Cloud Run / App Engine / Cloud Functionsはserverless実行基盤で、基本はVPC外
  • VPC外サービスでも、private接続やVPC egressによってVPCと接続できる

参考

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