G-gen の堂原です。本記事では、Google Cloud の共有 VPC(Shared VPC)を設定または利用する際に必要な IAM 権限について解説します。

はじめに
共有 VPC は、複数のプロジェクト間で VPC ネットワークを共有できる機能です。ネットワークの管理を行うホストプロジェクトと、そのネットワークリソースを利用するサービスプロジェクトを定めて管理します。
- 参考 : 共有 VPC
共有 VPC については、以下の記事も参照してください。
共有 VPC の有効化時や利用時には、組織、フォルダ、ホストプロジェクト上での適切な IAM 権限設定が必要です。
当記事では、共有 VPC の有効化時と利用時、それぞれの IAM 権限設定と、無効化時の IAM 権限設定の挙動について解説します。
ホストプロジェクト有効化時の IAM 権限
必要な IAM ロール
Google Cloud のコンソール画面にて、プロジェクトを共有 VPC の「ホストプロジェクト」として有効化する操作を行う際は、操作するプリンシパル(Google アカウントやサービスアカウント)に対して、以下のとおりロールを付与する必要があります。
| ロールを付与するリソース | ロール名 |
|---|---|
| 組織またはフォルダ | Compute Shared VPC 管理者(roles/compute.xpnAdmin) |
| ホストプロジェクト | Project IAM 管理者(roles/resourcemanager.projectIamAdmin)※ resourcemanager.projects.setIamPolicy 権限があれば他のロールでも可能 |
ただし、gcloud コマンドを用いて有効化する際は「Project IAM 管理者」ロールは必要ありません。コンソールで操作する場合のみ、「Project IAM 管理者」ロールが無いと設定画面に遷移する際にエラーメッセージが表示されます。
重要な点は、「Compute Shared VPC 管理者」ロールは、ホストプロジェクト自身ではなく、その上位の組織またはフォルダレベルで付与する必要があるという点です。
- 参考 : 共有 VPC - 管理者と IAM
権限不足時のエラーメッセージ
上記の権限が不足している場合、コンソールや gcloud コマンドでホストプロジェクトを有効化しようとすると、以下のようなエラーメッセージが表示されます。
Required 'compute.organizations.enableXpnHost' permission for 'projects/xxx'
または
プロジェクト「xxx」の 'compute.subnetworks.setIamPolicy', 'resourcemanager.projects.setIamPolicy' 権限がありません。
これらのメッセージは、一見すると対象のプロジェクトレベルでの権限付与を促しているように見えます。 しかし、前述のとおり、「Compute Shared VPC 管理者」ロールは、ホストプロジェクト自身ではなく、その上位の組織またはフォルダレベルで付与する必要がある点に注意してください。
共有 VPC 利用時の IAM 権限
必要な IAM ロール
サービスプロジェクトにおいて、共有されたサブネットを利用するためには、操作を行うプリンシパル(Google アカウントやサービスアカウント)が、ホストプロジェクトまたは該当サブネットに対して「Compute ネットワーク ユーザー(roles/compute.networkUser)」ロールを有している必要があります。
ホストプロジェクトレベルで付与した場合、そのホストプロジェクト上のすべてのサブネットを利用することができます。
コンソールでの設定
共有 VPC コンソール画面では、ホストプロジェクトの初期有効化時に、プリンシパルに対して「Compute ネットワーク ユーザー」ロールを付与するための設定が用意されています。
「役割別のユーザーの選択」画面では、どのプリンシパルに「Compute ネットワーク ユーザー」ロールを付与するかを決定します。例えば、各サービスプロジェクトの「Compute インスタンス管理者」ロールや「オーナー」ロールを持つプリンシパルなど、既にサービスプロジェクトに対して特定のロールを持つプリンシパルに対して、「Compute ネットワーク ユーザー」ロールを付与することができます。

「アクセスを許可」画面では、上記で選択したプリンシパルに対し、プロジェクトレベルで「Compute ネットワーク ユーザー」ロールを付与するか(すなわち、ホストプロジェクト上のすべてのサブネットが利用可能)、あるいは個々のサブネットレベルで付与するかを選択します。

ユースケース別の具体例
Compute Engine VM の起動
サービスプロジェクトにおいて共有 VPC ネットワーク上に Compute Engine VM を起動するには、操作者の Google アカウントが、ホストプロジェクトの該当サブネットへの「Compute ネットワーク ユーザー」ロールを持っている必要があります。
Cloud Run サービスの Egress 接続
サービスプロジェクト上の Cloud Run サービスから、ホストプロジェクト上のサブネットに Direct VPC Egress などで接続するケースです。
この場合、「Cloud Run サービス エージェント」に対して、ホストプロジェクトの該当サブネットへの「Compute ネットワーク ユーザー」ロールを付与する必要があります。
Cloud Run サービスエージェントのメールアドレスは、以下の形式です。
service-{サービスプロジェクト番号}@serverless-robot-prod.iam.gserviceaccount.com
なお、サービスエージェントとは、Google Cloud サービスが使用する特殊なサービスアカウントのことです。以下の記事も参照してください。
無効化時の IAM 権限に関する挙動
Google Cloud コンソールからホストプロジェクトの共有 VPC 設定を無効化すると、ホストプロジェクトにおいて、プロジェクトレベル、またはサブネットごとに設定されているすべての「Compute ネットワーク ユーザー」ロール設定が自動的に削除されます。
この自動的な削除処理は Google Cloud コンソールからの操作時のみ行われます。一方で、gcloud コマンド(gcloud compute shared-vpc disable)で無効化した場合は、「Compute ネットワーク ユーザー」ロール設定は自動的には削除されず、残ります。
堂原 竜希(記事一覧)
クラウドソリューション部クラウドエクスプローラ課。2023年4月より、G-genにジョイン。
Google Cloud Partner Top Engineer 2023, 2024, 2025に選出 (2024年はRookie of the year、2025年はFellowにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。
Follow @ryu_dohara