【正解】A
【0からの解説】
①前提知識
共有 VPC では、ホスト プロジェクトが VPC ネットワークとサブネットを所有し、サービス プロジェクトのリソース(VM や GKE ノードなど)がそのサブネットを利用します。サービス プロジェクトのユーザーが共有サブネットを使うには、ホスト プロジェクト全体または個々のサブネットに対して Compute ネットワーク ユーザー(roles/compute.networkUser)ロールが必要です。
これに加え、組織のポリシーにも共有 VPC 用のリスト型制約があります。
・constraints/compute.restrictSharedVpcSubnetworks:プロジェクト(またはフォルダ / 組織)内のリソースが使用できる共有 VPC サブネットの一覧を制限する。
・constraints/compute.restrictSharedVpcHostProject:サービス プロジェクトとして接続できるホスト プロジェクトを制限する。
②要件の整理
・開発者は複数チームにまたがって作業しており、複数のサービス プロジェクトで権限を持っている。
・各サービス プロジェクトのリソースが、そのプロジェクト用に予約されたサブネットだけを使えるようにしたい。
③正解の理由
A のように各アプリケーションのサービス プロジェクトに restrictSharedVpcSubnetworks を設定し、許可するサブネットを指定すれば、開発者がどのサービス プロジェクトで作業していても、そのプロジェクトのリソースは割り当てられたサブネットにしかデプロイできません。ユーザー個人の IAM ではなくプロジェクト単位でガードレールをかけるため、複数チームにまたがる開発者がいても確実に制御できます。(なお、サブネット レベルで compute.networkUser を付与してホスト プロジェクト全体には付与しないことも、共有 VPC のベスト プラクティスです。)
【誤りの選択肢】
B:compute.networkViewer はネットワーク リソースの閲覧のみを許可するロールです。既存の権限(デプロイできてしまう状態)を取り消すものではなく、サブネットの利用を制限する効果もありません。
C:restrictSharedVpcHostProject は、サービス プロジェクトが接続できる「ホスト プロジェクト」を制限する制約で、ホスト プロジェクト内の特定のサブネット単位での制限はできません。
D:共有 VPC のサブネットを利用する権限は、ホスト プロジェクトまたはそのサブネットに対して付与します。サービス プロジェクトで compute.networkUser を付与しても共有サブネットへのアクセス範囲は制御できず、別アプリケーション用サブネットへのデプロイも防げません。
【参考】
共有 VPC | Virtual Private Cloud共有 VPC をプロビジョニングする | Virtual Private Cloud