PCDE 合格対策
DEEP DIVE

🏗️ 組織と基盤の Bootstrap 徹底深掘り

Google Cloud 組織を正しい姿で立ち上げる Landing Zone 設計から、Shared VPC・WIF・IaC・GKE Fleet・Cloud Workstations まで、実務 BP と事故ケースを深掘り。Cloud Foundation Fabric / Enterprise Foundations Blueprint / Workload Identity Federation の attribute condition / Fleet の Sameness 原則 / Config Sync の RootSync vs RepoSync など、PCDE で「Google が推奨するパターン」を即答するための一枚教材です。

公式 docs 準拠 🎯 上級 ⚙️ 内部動作 📊 制限値表 ⚠️ 事故ケース 35+ 🏛️ Landing Zone
🎯 試験頻出 ⚠️ 事故ケース ✅ ベストプラクティス 📋 制限値 💰 コスト
🔑 TL;DR — このページの結論 Landing Zone は Identity / Resource Hierarchy / Network / Security の 4 要素を Terraform で IaC 化して bootstrap、Google 公式は Enterprise Foundations Blueprint(4 ステージ:bootstrap → org → environments → networks/projects)。Resource Hierarchy は Org → Folder(最大 10 階層 / Org あたり 300 フォルダ)→ Project(Project ID は作成後変更不可、削除後 30 日 reservation)。Shared VPC は 1 Host Project に複数 Service Project(Service Project は 1 Host にのみ所属、同一 Org 内のみ)、VPC Peering は 非推移(A↔B↔C で A↔C 不通)/ CIDR 重複禁止、PSC は NAT で IP 重複 OK / マネージドサービス推奨
Workload Identity Federation は OAuth 2.0 Token Exchange + STS で SA Key を完全廃止、Workload Identity Pool(1 Project 100 個)/ Provider(1 Pool 100 個)/ Attribute Mapping(最大 50 個、google.subject 必須・127 文字)/ Attribute Condition で必ず repo/branch 限定。IaC は Infrastructure Manager(マネージド Terraform、State 自動)/ Config Connector(K8s CRD で GCP リソース)/ CFT / Cloud Foundation Fabric(FAST)を用途別に選択。
GKE Fleet の核心は Sameness(同名 namespace / service は同一エンティティ)/ Exclusivity(1 cluster は 1 fleet のみ)/ High Trust。Config Sync は RootSync(クラスタ全体・Platform 用)vs RepoSync(namespace 単位・アプリ用)。Policy Controller は OPA Gatekeeper 統合の ConstraintTemplate + Constraint
Cloud Workstations は Cluster(VPC 紐付け)→ Config(テンプレ:machineType / image / IDE)→ Instance(ephemeral GCE VM + Persistent Home)の 3 層、Gemini Code Assist 統合。最大の事故源は SA Key 流出 / WIF Attribute Condition 緩すぎ / Folder 削除でリソース道連れ / Project quota 上限到達 / Config Sync drift で本番上書き / Workstations 中断で作業消失の 6 つです。

📚 参照する公式ドキュメント

本資料は以下の Google Cloud 公式ドキュメント(2026 年時点)から技術詳細・制限・SLA・ベストプラクティスを抽出しています。各章で都度引用と URL を併記します。

#領域公式 URL
1Landing Zone designcloud.google.com/architecture/landing-zones
2Cloud Foundationcloud.google.com/architecture/cloud-foundation
3Enterprise Foundations Blueprintcloud.google.com/architecture/security-foundations
4Resource Manager 概要cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy
5Org Policy 概要cloud.google.com/resource-manager/docs/organization-policy/overview
6Org Policy Constraints 一覧cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints
7Shared VPC 概要cloud.google.com/vpc/docs/shared-vpc
8VPC Network Peeringcloud.google.com/vpc/docs/vpc-peering
9Private Service Connectcloud.google.com/vpc/docs/private-service-connect
10IAM 概要cloud.google.com/iam/docs/overview
11Service Account ベストプラクティスcloud.google.com/iam/docs/best-practices-service-accounts
12Workload Identity Federationcloud.google.com/iam/docs/workload-identity-federation
13WIF GitHub Actionscloud.google.com/iam/docs/workload-identity-federation-with-deployment-pipelines
14Infrastructure Managercloud.google.com/infrastructure-manager/docs
15Config Connectorcloud.google.com/config-connector/docs/overview
16Cloud Foundation Toolkitcloud.google.com/foundation-toolkit
17GKE Fleetcloud.google.com/anthos/multicluster-management/fleets
18Config Synccloud.google.com/anthos-config-management/docs/config-sync-overview
19Policy Controllercloud.google.com/anthos-config-management/docs/concepts/policy-controller
20Cloud Workstations 概要cloud.google.com/workstations/docs/overview
21Gemini Code Assistcloud.google.com/gemini/docs/codeassist/overview
22Gemini Cloud Assistcloud.google.com/gemini/docs/cloud-assist/overview

1Landing Zone と組織設計

Landing Zone とは「Google Cloud に最初に降り立つ場所」=「組織として安全に・スケーラブルにワークロードを動かせる最低限の土台」のこと。Google は Identity / Resource Hierarchy / Network / Security の 4 要素を IaC で bootstrap し、ワークロードを追加しながら段階的に拡張することを推奨します。試験では「最初に何を Folder で切るか」「Org Policy をどこに当てるか」「IAM / Org Policy の継承」「Cloud Foundation Fabric / CFT の選定」が頻出です。

「A landing zone is the modular, scalable foundation that enables your enterprise to adopt Google Cloud. ... designed around four key elements: identity provisioning, resource hierarchy, network design, and security.」 — Landing zone design in Google Cloud

1.1 リソース階層の全体像(Org / Folder / Project / Resource)

Organization (acme.com) Cloud Identity / Workspace に紐付け・全社 1 つ Folder: common network / logging / secrets Folder: production 本番ワークロード Folder: non-prod stage / qa Folder: development 開発 sandbox prj: net-host prj: logging prj: payment prj: search GKE cluster Cloud SQL IAM ロール・Org Policy は親 → 子へ継承(加算) Org / Folder で IAM 付与 → 子 Project / Resource にも自動で効く(拒否は deny policy で) 制限:Folder 最大 10 階層 / Org あたり 300 Folder / 1 Folder 直下 300 Folder
図 1-1:Google Cloud リソース階層と IAM/Org Policy の継承

1.2 各階層の役割と制限値

階層役割制御単位主な制限
Organization最上位、Cloud Identity / Workspace に紐付けOrg Policy、Aggregated Sink、Org Admin1 ドメインに 1 つ、削除に注意
Folder部門 / 環境の論理境界IAM / Org Policy 継承境界最大 10 階層 / Org あたり 300 Folder / 1 親 直下 300 Folder
Projectリソース所有・課金・API 有効化の単位API、Quota、課金、IAMProject ID 作成後変更不可、削除後 30 日 reservation、Org あたり quota 制(拡張可)
Resource実リソース (GCE / GCS / GKE 等)IAM(一部)、Labels各サービスのリソース quota

1.3 Folder 設計パターン(Application-centric vs Environment-centric)

🅰 Application-centric

Org
├─ app-payment
│   ├─ dev / stage / prod
├─ app-search
│   ├─ dev / stage / prod
└─ common
  • アプリチームが IAM / 予算を自律運用
  • 新規アプリ追加が容易(テンプレ Folder 複製)
  • 環境横断の統制(Org Policy)は Org / common に集中
  • マイクロサービス組織・スタートアップ向け

🅱 Environment-centric

Org
├─ prod
│   ├─ app-payment / app-search
├─ stage
│   └─ ...
└─ dev
  • 本番 / 開発の 境界が明確(金融・規制対応)
  • prod Folder に「外部 IP 禁止」等の 強い Org Policy 集中
  • アプリ追加で 3 Folder 触る必要あり
  • 強い変更管理 / 監査プロセスのある企業向け
💡 ベストプラクティス 混在禁止。組織内では Application-centric / Environment-centric のどちらか 1 つに統一する(途中で変えると Folder 構造の再設計が必要 = 数百プロジェクト動かすことになる)。新規組織には Application-centric がやや推奨(チーム自律性 / DevOps カルチャー)。

1.4 Enterprise Foundations Blueprint(Google 公式の Landing Zone)

Google は Enterprise Foundations Blueprint(旧 Security Foundations Blueprint)として、Terraform で構築する Landing Zone の参照実装を提供。4 ステージで段階的に bootstrap します。

  1. Stage 0: bootstrap — Terraform の bootstrap プロジェクト・seed project・CI/CD(Cloud Build)・Terraform 用 SA を作成。これだけは 手作業 or gcloud で一度だけ
  2. Stage 1: org — Org Policy / IAM の組織横断ポリシー、共通 Folder(common / production / non-production / development)作成。
  3. Stage 2: environments — 各環境 Folder 配下の共通プロジェクト(host VPC / DNS / Secret / logging / monitoring)作成。
  4. Stage 3: networks & projects — 各環境の Shared VPC / Subnet / Firewall / Interconnect、アプリ用 Service Project の量産(Project Factory)。

1.5 Cloud Foundation Toolkit (CFT) vs Cloud Foundation Fabric (FAST)

観点Cloud Foundation Toolkit (CFT)Cloud Foundation Fabric (FAST)Terraform Modules for Google
提供元Google Cloud Professional ServicesGoogle Cloud(OSS、より opinionated)HashiCorp 公式 Verified
提供形式Terraform / Helm の module 集End-to-End FAST (Foundation, Application, Security, Team) blueprintmodule 集
カスタマイズ性高(module を選んで自分で組む)低(Google 推奨を素直に採用)
学習コスト高(FAST 全体の理解が必要)
適合既存 Terraform 資産がある組織新規組織・PoC から本番まで一気通貫マルチクラウド組織
🔑 試験ポイント 「Google が推奨する Landing Zone を Terraform で素早く構築」=「Cloud Foundation Toolkit の terraform-example-foundation」または「Cloud Foundation Fabric」。組織がエンタープライズ規模なら Fabric / FAST、既存 Terraform module 資産がある中堅組織なら CFT。「全く同じものを 100 プロジェクトで複製したい」→ Project Factory module が答え。

1.6 Organization Policy の Constraint タイプ

タイプ説明設定方法
Boolean Constrainttrue / false で機能を on/offcompute.disableSerialPortAccessiam.disableServiceAccountKeyCreationenforce: true/false
List Constraintallow / deny リストで値制限compute.vmExternalIpAccessgcp.resourceLocationsallowedValues / deniedValues
Custom ConstraintCEL で任意条件(2023 GA)custom.requireProjectLabelCEL 式、CREATE/UPDATE methodType

1.7 試験頻出 Org Policy Constraint(20 個)

Constraintタイプ効果 / 用途
iam.disableServiceAccountKeyCreationBooleanSA Key 作成禁止(WIF 移行の第一歩)
iam.disableServiceAccountKeyUploadBoolean外部生成 Key のアップロード禁止
iam.disableServiceAccountCreationBooleanSA 自体の作成禁止(中央管理)
iam.automaticIamGrantsForDefaultServiceAccountsBooleanDefault SA への Editor 自動付与を阻止
iam.allowedPolicyMemberDomainsList許可ドメイン制限(外部メンバー流入防止)
compute.vmExternalIpAccessList外部 IP 付与可能な VM を限定
compute.requireOsLoginBooleanOS Login 必須(SSH 鍵集中管理)
compute.requireShieldedVmBooleanShielded VM 必須
compute.skipDefaultNetworkCreationBoolean新規プロジェクトの default VPC 作成抑止
compute.restrictVpcPeeringListVPC Peering 相手の制限
compute.restrictSharedVpcHostProjectsListShared VPC Host にできる Project 限定
compute.restrictSharedVpcSubnetworksList使える Shared VPC subnet 制限
storage.uniformBucketLevelAccessBooleanGCS の均一アクセス強制(ACL 禁止)
storage.publicAccessPreventionBooleanGCS public 公開禁止
sql.restrictPublicIpBooleanCloud SQL Public IP 禁止
sql.restrictAuthorizedNetworksBooleanCloud SQL の Authorized Networks 禁止
gcp.resourceLocationsListリソース作成可能リージョン制限(データ常駐)
gcp.restrictNonCmekServicesListCMEK 必須サービス指定
gcp.restrictCmekCryptoKeyProjectsListCMEK 鍵に使える Project 限定
essentialcontacts.allowedContactDomainsListessential contact のドメイン制限

1.8 Org Policy の Dry-Run モード

Org Policy を本番適用する前に、違反対象を Audit Log に出力するだけのモードで検証できます。「数年運用後に Org Policy を追加 → 大量違反で動かないリソース続出」の事故を防ぐ必須機能。

# Dry-Run モードで適用(実際にはブロックしない) gcloud org-policies set-policy policy.yaml --update-mask=dryRunSpec # policy.yaml name: organizations/123/policies/iam.disableServiceAccountKeyCreation dryRunSpec: rules: - enforce: true # Audit Log で違反検出 gcloud logging read 'protoPayload.metadata.dryRunPolicy=*' --limit=50 # 検証後、本番適用 gcloud org-policies set-policy policy.yaml # spec で適用

1.9 Resource Manager / Project Factory の API

# Project の作成(Resource Manager API) gcloud projects create acme-prod-payment-001 \ --folder=123456789 \ --labels=env=prod,team=payment,cost-center=cc-1001 # Project に Billing Account を紐付け gcloud billing projects link acme-prod-payment-001 \ --billing-account=01ABCD-234567-EFGHIJ # Folder 作成(10 階層まで) gcloud resource-manager folders create \ --display-name="production" \ --organization=98765432100 # プロジェクト削除 → 30 日間は restore 可能 gcloud projects delete acme-prod-payment-001 gcloud projects undelete acme-prod-payment-001 # 30 日以内

1.10 事故ケース

⚠️ 事故 1: Org Policy 設定漏れで外部ドメインに Owner 権限
状況新人エンジニアが partner@example.org(外部ドメイン)に Org-level で roles/owner を付与してしまった
影響全プロジェクトに対する完全管理権限が外部ユーザーに渡る。本番 DB 削除可能な状態
根本原因iam.allowedPolicyMemberDomains Constraint が未設定。誰でも任意ドメインのメンバー追加可能
即対処該当 binding を即削除 → 全 Audit Log を確認 → 該当ユーザーのアクションを全 revoke
恒久対策Org 直下に iam.allowedPolicyMemberDomains Constraint で自社ドメインのみ allow に固定
⚠️ 事故 2: Folder 削除でリソース道連れ削除
状況「使わないチームの Folder を整理」と思って削除 → 配下に運用中の Project が残っており、Project ごと削除状態に
影響30 日以内なら undelete 可能だが、BigQuery dataset / Spanner instance / Pub/Sub subscription など Project 削除と同時に消えるリソースは復旧不能
根本原因Folder 削除前のリソース棚卸し未実施、IAM で resourcemanager.folders.delete を Org Admin が即実行
即対処gcloud projects undelete で 30 日以内に復旧 → ただし Spanner 等は喪失
恒久対策Org Policy の Deny Policy で resourcemanager.folders.delete をブロック、PAM(Privileged Access Manager)で都度承認制に
⚠️ 事故 3: Project quota 上限到達で新規環境作れず
状況PR ごとに ephemeral 環境を作る運用で、Org あたりの Project 数上限に到達 → 新規 PR の deploy が全停止
影響1 週間リリース全停止、quota 拡張申請に 3-5 営業日
根本原因古い ephemeral Project の自動削除 lifecycle 未設定、削除済み Project も 30 日間 quota を消費
即対処不要 Project を hard delete(gcloud projects delete + undelete 待たない)、quota 増申請
恒久対策ephemeral Project は TTL ラベル付与 + Cloud Scheduler で 24h 後削除、quota dashboard を Cloud Monitoring で監視
⚠️ 事故 4: 命名規則なしで Project ID 重複・命名カオス
状況各チームが自由に Project を作成し、test1 poc-2 kainuma-demo 等が乱立。3 年後に棚卸し不能
影響所有者不明 Project が 200 個、月 $50,000 の無駄コスト発生、監査で指摘
根本原因命名規則の Custom Constraint なし、Label 必須化なし
即対処BigQuery で Billing Export 分析、所有者不明 Project にラベル付与依頼を automation
恒久対策Custom Constraint で「cost-center ラベル必須」「Project ID は <company>-<env>-<app>-<seq> 形式」を CREATE 時に enforce
⚠️ 事故 5: Default SA への Editor 自動付与を放置
状況新規プロジェクト作成時に GCE / Cloud Build / App Engine の Default SA に Editor が自動付与される(2024 以前のデフォルト動作)
影響Default SA を使う Cloud Build job が全プロジェクトリソースを操作可能、権限昇格穴に
根本原因iam.automaticIamGrantsForDefaultServiceAccounts Org Policy 未設定
即対処Default SA の Editor binding を全プロジェクトから削除、User-managed SA に切替
恒久対策Org 直下に iam.automaticIamGrantsForDefaultServiceAccounts Constraint で自動付与 disable
⚠️ 事故 6: Bootstrap Terraform State 喪失で Org 再構築不能
状況Bootstrap Project の Terraform State を 個人 PC の local backend で管理していたが、退職者の PC 廃棄で消失
影響Org 構造を変更する全ての変更が import からやり直しに、6 か月停滞
根本原因GCS backend 未設定、State 暗号化なし、版管理なし
即対処terraform import で 1 リソースずつ取り込み、新規 GCS backend に移行
恒久対策必ず Infrastructure Manager(State 自動) または GCS backend + 版管理 + CMEK、Bootstrap State だけ別 Project で分離

2Shared VPC / VPC Peering / Private Service Connect

「複数プロジェクトのネットワーク方式」は Shared VPC / VPC Network Peering / Private Service Connect (PSC) の 3 択。試験では「どれを選ぶか」の判断軸と、それぞれの非推移性 / IP 重複可否 / Org 跨ぎ可否 / マネージドサービス接続が頻出。

「Shared VPC allows an organization to connect resources from multiple projects to a common Virtual Private Cloud (VPC) network. ... A project cannot be both a host project and a service project simultaneously, and each service project can only be attached to a single host project.」 — Shared VPC overview

2.1 Shared VPC のアーキテクチャ

Host Project: net-host (Network Team) Shared VPC: shared-vpc-prod subnet: app (10.0.0/24) subnet: db (10.0.1/24) subnet: gke (10.1.0/22) subnet: lb (10.2.0/24) Service Project A: payment GCE VM GKE cluster subnet: app, gke を利用 Project IAM 独立 課金は Project A に Service Project B: search Cloud Run Serverless VPC subnet: app を利用 Project IAM 独立 Network 集中管理(Host)/ アプリ運用は分散(Service)/ 同一 Org 内のみ
図 2-1:Shared VPC の Host / Service Project 構造

2.2 3 方式の詳細比較マトリクス

観点Shared VPCVPC Network PeeringPrivate Service Connect
用途Org 内集中管理VPC 1:1 接続サービスエンドポイント公開
スコープ同一 Org のみOrg 跨ぎ可Org 跨ぎ可
推移性N/A(同一 VPC)なし(A↔B↔C で A↔C 不通)エンドポイント単位
ルート交換同一 VPC で共有自動不要(エンドポイント IP)
IP 重複不可(同一 VPC)不可(CIDR 重複禁止)可(NAT 動作)
レイテンシVPC 内通信(最速)VPC 内通信+1 hop(ほぼ無視可)
追加コスト無料無料(egress 課金あり)エンドポイント時間課金 + データ処理料
マネージド接続△(Private Services Access 併用)×◎(推奨)
運用負荷中(Host/Service の IAM 分離)低(peering 数増えると爆発)低(per-service endpoint)
クォータProject quota 個別VPC あたり peering 25 個Project あたり endpoint 数
FirewallHost で一括管理各 VPC で個別Producer / Consumer で個別

2.3 Shared VPC の必須 IAM ロール

ロール付与対象権限
roles/compute.xpnAdmin
(Shared VPC Admin)
Network Team(Org or Folder level)Host を有効化、Service Project の attach / detach、subnet 単位の IAM 委譲
roles/compute.networkUserService Project の SA / ユーザー指定 subnet を使ってリソース作成(特定 subnet のみ可能)
roles/compute.networkAdminNetwork TeamVPC / route / Cloud NAT / VPN 管理(Firewall / SSL は除く)
roles/compute.securityAdminSecurity TeamFirewall rule、SSL 証明書管理
💡 Shared VPC IAM の最小権限パターン Network User は Host Project 全体ではなく、特定 subnet にだけ 付与する(subnet-level binding)。これで「app チームは app subnet のみ使える、db subnet は使えない」を実現。Service Project Admin(=app チーム責任者)は Service Project 内では owner 相当、Host 側には触れない。

2.4 Shared VPC の制限と落とし穴

2.5 VPC Network Peering の制限

25
VPC あたり peering 数(hard limit)
非推移
A↔B↔C で A↔C は不通
CIDR 重複×
subnet CIDR が重なると peering 不可
無料
peering 通信は同一 region なら egress 無料

2.6 Private Service Connect の 3 種類

タイプ用途典型例
PSC for Google APIsgoogleapis.com にプライベート IP でアクセスVPC SC 内から GCS / BigQuery に内部 IP で接続
PSC for Published Services自社 / SaaS の内部サービスを別 VPC に公開Producer (Confluent / Snowflake) → Consumer VPC
PSC for Managed ServicesCloud SQL / Memorystore / AlloyDB 等Cloud SQL Private Service Connect エンドポイント

2.7 ハイブリッド接続との組み合わせ

接続方式帯域SLA用途Shared VPC との関係
Cloud VPN(Classic)3 Gbps99.9%小規模、PoCHost VPC に attach、Service Project から透過
HA VPN10 Gbps(合計)99.99%本番、IPsecHost VPC に attach
Dedicated Interconnect10 or 100 Gbps99.9-99.99%大規模、低レイテンシHost Project に terminate
Partner Interconnect50 Mbps - 50 Gbps99.9-99.99%キャリア経由Host Project に terminate
Cross-Cloud Interconnect10 or 100 Gbps99.99%AWS / Azure / OCI 直結Host VPC で受ける
Network Connectivity Center (NCC)複数 VPN / Interconnect の hub-spoke 統合NCC Hub に Spoke として VPC を attach

2.8 事故ケース

⚠️ 事故 7: VPC Peering の非推移性で 3 拠点が片方向通信不能
状況VPC A ↔ B、B ↔ C で peering を組み「A から C も通信できる」と勘違いしてアプリ設計
影響本番リリース当日に A → C への API call が全て timeout、緊急 rollback
根本原因VPC Peering は 非推移(non-transitive)。A↔C を直接 peering するか別方式が必要
即対処A↔C の直接 peering を急遽追加(CIDR 重複なければ即可)
恒久対策3 つ以上の VPC を統合するなら最初から Shared VPC または Network Connectivity Center (NCC) で hub-spoke 構成
⚠️ 事故 8: Shared VPC で誤って IAM role 上書き → 全 Service Project 停止
状況Host Project の IAM policy を setIamPolicy全置換(add ではなく overwrite)
影響全 Service Project の networkUser binding が消滅、全 VM / GKE node 作成停止
根本原因gcloud projects set-iam-policyetag を見ずに全置換する破壊的コマンド
即対処etag を確認した backup policy.yaml から restore、Terraform state から再 apply
恒久対策本番 IAM 変更は必ず add-iam-policy-binding / remove-iam-policy-binding、または Terraform / Infrastructure Manager で管理。Policy Analyzer で事前影響評価
⚠️ 事故 9: PSC エンドポイント quota 上限到達
状況マイクロサービス 100 個を各 PSC エンドポイント経由で接続、Project あたり endpoint 数上限に到達
影響新規サービス追加が全停止、quota 増申請に 3 営業日
根本原因サービスごとに endpoint を作る設計(粒度過剰)
即対処quota 増申請、優先度の低い endpoint を削除
恒久対策共通の internal LB を経由させ、PSC endpoint は 環境 × サービスグループ単位に集約
⚠️ 事故 10: Cross-Org で Shared VPC が組めず M&A 統合が頓挫
状況買収した子会社の Org を統合せずに親会社の Shared VPC に Service Project として attach しようとした
影響Shared VPC は同一 Org 必須で attach 不可、ネットワーク統合計画が 3 か月遅延
根本原因Shared VPC のスコープ制約理解不足
即対処暫定的に HA VPN または Cross-Org HA VPN で接続
恒久対策Org 統合(migrate-from-org)または Cross-Cloud Interconnect / NCC で hub-spoke 接続
⚠️ 事故 11: サブネット範囲 /24 で確保 → 1 年で IP 枯渇
状況GKE クラスタの secondary range を /24 で確保、Pod 数が増えて IP 枯渇
影響新規 Pod スケジューリング不能、サブネット拡張は range 重複により不可
根本原因初期設計で Pod range は /17、Service range は /22 等の十分な広さを取らなかった
即対処GKE の Discontiguous Multi-Pod CIDR(2023 GA)で追加 range を後付け
恒久対策初期から /16 で Shared VPC subnet を確保、GKE secondary range は十分広く取る

3IAM と組織ポリシー

IAM は 「誰が(identity) / どのリソースに(resource) / 何ができるか(role)」の 3 要素で構成、Org Policy はその上位レイヤーで 「何が許されるか」を強制。試験では「IAM の継承と Deny」「Conditional IAM」「SA Key 撲滅戦略」「Custom Role vs Predefined」「Policy Analyzer / Recommender」が頻出です。

3.1 IAM 階層と継承(Effective Policy)

Organization roles/viewer to alice@ Folder: production + roles/compute.admin to bob@ Folder: development + roles/editor to dev-team@ Project: prod-payment + roles/cloudsql.admin to dba@ Project: prod-search prod-payment の Effective Policy alice@: viewer(Org から継承) bob@: compute.admin(Folder prod から継承) dba@: cloudsql.admin(Project 直接)
図 3-1:IAM の親 → 子継承と Effective Policy(加算)

3.2 ロールの 3 種 + Deny Policy

種類用途注意
Basic Role(旧 Primitive)roles/ownerroles/editorroles/viewer初期 PoC のみ本番では Org Policy で禁止推奨
Predefined Roleroles/compute.admin(数千種)標準サービス追加で増える
Custom Role任意最小権限の厳密定義Org / Project スコープ、メンテナンスコスト
Deny Policy(2022 GA)「絶対に禁止」を IAM に優先で強制Allow より 強い(IAM allow があっても deny が勝つ)

3.3 よく出る Predefined Role 一覧

ロール ID用途
roles/iam.serviceAccountUserSA を「使う」(impersonate に必要)
roles/iam.serviceAccountTokenCreatorSA の短期トークン発行
roles/iam.workloadIdentityUserWIF / GKE Workload Identity で SA impersonation を許可
roles/iam.serviceAccountAdminSA 作成・削除
roles/iam.securityAdminIAM 全権限(最も強い、限定的に)
roles/iam.securityReviewerIAM 読み取り専用(監査用)
roles/resourcemanager.organizationAdminOrg Admin、folder / project 作成
roles/resourcemanager.folderAdminFolder 管理
roles/orgpolicy.policyAdminOrg Policy 設定
roles/compute.xpnAdminShared VPC Admin
roles/compute.networkUserShared VPC subnet 利用
roles/container.developerGKE Pod 操作(cluster 管理不可)
roles/container.adminGKE フル管理
roles/cloudbuild.builds.editorCloud Build job 作成・管理
roles/clouddeploy.operatorCloud Deploy 操作(promotion / rollback)
roles/artifactregistry.writerArtifact Registry push
roles/logging.privateLogViewerData Access Audit Log 含む全 Logging 閲覧
roles/monitoring.editorCloud Monitoring 設定・編集

3.4 Conditional IAM(IAM Conditions)

IAM binding に CEL(Common Expression Language)条件を付けて、時間 / リソース属性 / リクエスト属性で動的に許可。「営業時間内のみ」「特定タグの付いたリソースのみ」を表現。

# 平日 9-18 時のみ compute.admin 付与 gcloud projects add-iam-policy-binding PRJ \ --member=group:devops@acme.com \ --role=roles/compute.admin \ --condition='expression=request.time.getHours("Asia/Tokyo") >= 9 && request.time.getHours("Asia/Tokyo") < 18 && request.time.getDayOfWeek("Asia/Tokyo") >= 1 && request.time.getDayOfWeek("Asia/Tokyo") <= 5, title=weekday_office_hours,description=平日業務時間のみ' # Resource attribute: 特定 prefix のバケットのみ expression: resource.name.startsWith("projects/_/buckets/dev-") # Tag-based: タグ付与されたリソースのみ expression: resource.matchTag("123456789/env", "dev")
💡 ベストプラクティス Conditional IAM は Project / Resource level の binding に限定。Org / Folder level の binding に CEL 条件を付けると、影響範囲が広すぎてデバッグ困難。本番は PAM(Privileged Access Manager)で「Just-in-Time 昇格 + 承認制」のほうが運用しやすい。

3.5 Service Account ベストプラクティス

⚠️ アンチパターン

・SA Key(JSON)を生成して GitHub Secrets / Vault / S3 に保存
・Default SA(compute / cloudbuild / app engine)に Editor のまま使う
・「1 つの SA で全部やる」god account
・SA Key を 1 年放置(rotation なし)
・本番 SA を開発者の gcloud auth で impersonate 自由

✅ ベストプラクティス

SA Key を作らない(Org Policy で disable)
1 アプリ = 1 SA、責務別に分割
Workload Identity (GKE) / WIF (外部)でキー不要認証
・人間が SA を使うときは impersonation(短期 token)
Service Account Recommender で未使用 SA を定期削除
・SA は 専用 admin SA だけが作成可能

3.6 Service Account Impersonation

# 人 (alice@) が SA (deploy-sa) になりすまして実行 gcloud auth login alice@acme.com # 1) SA に Token Creator を付与(alice@ → deploy-sa) gcloud iam service-accounts add-iam-policy-binding \ deploy-sa@PRJ.iam.gserviceaccount.com \ --member=user:alice@acme.com \ --role=roles/iam.serviceAccountTokenCreator # 2) impersonation で実行 gcloud compute instances list \ --impersonate-service-account=deploy-sa@PRJ.iam.gserviceaccount.com # Audit Log に alice@ と SA の両方が記録される(accountability 保たれる)

3.7 IAM Recommender / Policy Analyzer

ツール用途典型出力
IAM Recommender過去 90 日の利用状況から「使われていない権限」を検出 → より狭いロール提案roles/editorroles/compute.viewer に縮小可能」
Policy Analyzer「誰が」「何に」「どんなアクセス」を持つかを Org 横断で照会roles/storage.admin を持つ principal を全 Org で列挙」
Policy Troubleshooter「なぜこのユーザーがこのリソースに access できない / できる」を逆引き「alice@ が gs://bucket に write できる理由は Folder prod の editor binding」
Service Account Insights未使用 SA、key 流出疑い、過剰権限 SA を検出「90 日未使用の SA を delete 推奨」
Privileged Access Manager (PAM)Just-in-Time 権限昇格、承認制「prod-admin role を 4 時間限定、承認者 2 名」

3.8 Deny Policy の使い所

# 「絶対に SA Key を作らせない」を IAM allow より優先で強制 gcloud iam policies create deny-sa-key-creation \ --attachment-point="cloudresourcemanager.googleapis.com/organizations/123" \ --kind=denypolicies --policy-file=deny-policy.yaml # deny-policy.yaml rules: - deniedPrincipals: - principalSet://goog/public:all # 全 principal に対して deniedPermissions: - iam.googleapis.com/serviceAccountKeys.create exceptionPrincipals: - principalSet://iam.googleapis.com/projects/PRJ_NUM/locations/global/workloadIdentityPools/.../subject/break-glass-bot

3.9 事故ケース

⚠️ 事故 12: Owner ロールを 50 人に付与 → 退職者の元 owner が DB drop
状況初期 PoC で「とりあえず Owner を全員に」付与、退職処理時に IAM 削除が漏れた元従業員のアカウントから本番 DB が削除
影響本番 Cloud SQL の database が drop、PITR から 4 時間ロールバック
根本原因Basic Role の濫用、Group 管理なし、IAM 監査なし
即対処該当 binding 即削除、Cloud SQL PITR で復旧、全 Owner binding 棚卸し
恒久対策Org Policy で Basic Role 禁止(custom constraint)、Group ベース付与、PAM で JIT 昇格、退職時の Group 自動削除
⚠️ 事故 13: SA Key が GitHub に commit → 仮想通貨マイニング
状況開発者が key.json を git add してしまい public repo に push
影響3 時間後にスキャナーが検出、GCE で大量の GPU instance が立ち上がり仮想通貨マイニング、3 日間で $80,000 課金
根本原因SA Key の存在、pre-commit hook なし、Org Policy iam.disableServiceAccountKeyCreation なし
即対処該当 SA を即無効化、Key を delete、Cloud Billing Budget Alert で異常検知、GCE instance 全停止、Google Cloud Support に課金交渉
恒久対策SA Key を作らせない(Org Policy + Deny Policy)、WIF 移行、GitHub Secret Scanning、Cloud Budget Alert
⚠️ 事故 14: Custom Role の権限不足で Cloud Build が deploy 失敗
状況セキュリティチームが「最小権限」と称して Custom Role を作ったが、Cloud Build SA に必要な iam.serviceAccountUser が欠落
影響本番デプロイ全停止、Custom Role を編集する人が休暇中で復旧 6 時間
根本原因Custom Role の権限漏れ、Predefined Role を base にせず一から作成
即対処Cloud Build SA に roles/iam.serviceAccountUser を緊急付与
恒久対策Custom Role は Predefined Role を base に Iterate、IAM Recommender で必要権限を学習、CI/CD で「権限テスト」を行う pre-prod 環境を持つ
⚠️ 事故 15: Conditional IAM の CEL タイポで本番アクセス不能
状況「平日 9-18 時のみ」の CEL 条件で >=> に書き間違え、9:00 ちょうどに access できない
影響朝のオンコール対応で 1 時間 access できず、緊急対応遅延
根本原因Conditional IAM の単体テストなし
即対処条件削除して時間制限なしで一旦回復、後で修正
恒久対策Conditional IAM は Terraform で管理 + Policy Simulator で事前テスト、緊急時は break-glass SA で迂回

4Workload Identity Federation 完全攻略

WIF は OAuth 2.0 Token Exchange + Google Security Token Service (STS) を使い、AWS / Azure / GitHub Actions / GitLab / OIDC / SAML / X.509 などの外部 IdP から、SA Key なしで GCP API を呼ぶ仕組み。PCDE で最頻出かつ実務必須。「外部 CI/CD から GCP に認証」と聞いたら即 WIF。

「Workload identity federation follows the OAuth 2.0 token exchange specification. You provide a credential from your IdP to the Security Token Service, which verifies the identity on the credential, and then returns a federated token in exchange.」 — Workload Identity Federation overview

4.1 WIF アーキテクチャ

External IdP GitHub / AWS / Azure GitLab / Okta / OIDC Workload Identity Pool + OIDC/SAML/AWS Provider attribute mapping attribute condition Google STS Token Exchange API → Federated Token Service Account + workloadIdentityUser → SA Token ① OIDC token ② verify ③ impersonate GCP API 短期 SA Token で実行 ✅ SA Key 不要 ✅ 短期 token(1h) ✅ Audit Log に外部 identity 記録 制限:1 Project 100 Pool / 1 Pool 100 Provider / attribute 50 個 / google.subject 127 文字
図 4-1:WIF のトークン交換フロー

4.2 対応 IdP と Issuer URL

IdPIssuer URL / Type典型 attribute
GitHub Actionshttps://token.actions.githubusercontent.comassertion.repository, assertion.ref, assertion.environment
GitLab CIhttps://gitlab.com または self-hosted URLassertion.project_path, assertion.ref, assertion.ref_type
AWSAWS provider (account ID 指定)assertion.arn, assertion.account
Azure ADhttps://sts.windows.net/{tenant-id}/assertion.sub, assertion.tid, assertion.appid
Oktahttps://<org>.okta.comassertion.sub, assertion.groups
Terraform Cloudhttps://app.terraform.ioassertion.terraform_workspace_id
Kubernetes(自前)cluster の OIDC issuerassertion.sub(system:serviceaccount:ns:sa)
SAML 2.0IdP metadata URLassertion.attributes.role
X.509trust anchor 証明書assertion.subject

4.3 Attribute Mapping と Attribute Condition

Attribute Mapping は外部 IdP の token claim を Google STS の attribute に変換するルール、Attribute Condition はその attribute に対する CEL 条件で「許可する/しない」を決定する 最重要セキュリティ層

# Attribute mapping(外部 token claim → google.subject / attribute.*) --attribute-mapping=" google.subject=assertion.sub, attribute.repository=assertion.repository, attribute.ref=assertion.ref, attribute.environment=assertion.environment " # Attribute condition(CEL で許可条件、false なら拒否) --attribute-condition=" assertion.repository=='myorg/myapp' && assertion.repository_owner_id=='12345' && assertion.ref in ['refs/heads/main', 'refs/heads/release/v1'] " # 注意:repository だけでチェックすると、同名 repo を別 owner が作れば認証できてしまう # → 必ず repository_owner_id を併用
🔑 試験ポイント:Attribute Condition の最低限
  • GitHub Actionsassertion.repository_owner_id(owner ID)と assertion.repository の両方を条件に
  • 環境分離:本番 SA への WIF は assertion.environment=='production' で GitHub Environment Protection と連携
  • ブランチ制限assertion.ref=='refs/heads/main' で main からの workflow のみ許可
  • Reusable workflowjob_workflow_ref で「特定の reusable workflow から」を強制

4.4 External Account Credentials JSON 構造

WIF を利用するクライアント(gcloud / SDK / Terraform)には、credential configuration JSON を渡す。これは「key file」ではなく「STS にどう問い合わせるかのレシピ」。

{ "type": "external_account", "audience": "//iam.googleapis.com/projects/123456789/locations/global/workloadIdentityPools/gh-pool/providers/gh-provider", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/deploy-sa@PRJ.iam.gserviceaccount.com:generateAccessToken", "credential_source": { "url": "https://api.github.com/repos/myorg/myapp/actions/runners/registration-token", "headers": {"Authorization": "Bearer ACTIONS_ID_TOKEN_REQUEST_TOKEN"}, "format": {"type": "json", "subject_token_field_name": "value"} } } # このファイルは秘密情報を含まない(公開しても安全) # 各 SDK が credential_source で外部 token を取得 → STS で交換 → SA token で API call

4.5 GitHub Actions からの WIF 完全例

# ===== 1) GCP 側セットアップ ===== # Pool 作成 gcloud iam workload-identity-pools create gh-pool \ --location=global --display-name="GitHub Actions" # Provider 作成(GitHub OIDC) gcloud iam workload-identity-pools providers create-oidc gh-provider \ --workload-identity-pool=gh-pool --location=global \ --issuer-uri="https://token.actions.githubusercontent.com" \ --attribute-mapping="google.subject=assertion.sub, attribute.repository=assertion.repository, attribute.repository_owner_id=assertion.repository_owner_id, attribute.ref=assertion.ref" \ --attribute-condition="assertion.repository_owner_id=='12345' && assertion.repository=='myorg/myapp'" # SA に workloadIdentityUser 付与(repo 単位で principal set 制限) gcloud iam service-accounts add-iam-policy-binding \ deploy-sa@PRJ.iam.gserviceaccount.com \ --role=roles/iam.workloadIdentityUser \ --member="principalSet://iam.googleapis.com/projects/PRJ_NUM/locations/global/workloadIdentityPools/gh-pool/attribute.repository/myorg/myapp" # ===== 2) GitHub Actions workflow ===== name: Deploy on: { push: { branches: [main] } } permissions: id-token: write # ← OIDC token 発行に必須 contents: read jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - id: auth uses: google-github-actions/auth@v2 with: workload_identity_provider: projects/PRJ_NUM/locations/global/workloadIdentityPools/gh-pool/providers/gh-provider service_account: deploy-sa@PRJ.iam.gserviceaccount.com # token_format: access_token(デフォ)/ id_token も可 - uses: google-github-actions/setup-gcloud@v2 - run: gcloud builds submit --tag asia-northeast1-docker.pkg.dev/PRJ/repo/app:$GITHUB_SHA

4.6 GitLab CI からの WIF 設定例

# GitLab provider 作成 gcloud iam workload-identity-pools providers create-oidc gitlab-provider \ --workload-identity-pool=gitlab-pool --location=global \ --issuer-uri="https://gitlab.com" \ --attribute-mapping="google.subject=assertion.sub, attribute.project_path=assertion.project_path, attribute.ref=assertion.ref, attribute.ref_type=assertion.ref_type" \ --attribute-condition="assertion.project_path=='myorg/myapp' && assertion.ref_type=='branch' && assertion.ref=='main'" # .gitlab-ci.yml deploy: image: google/cloud-sdk:slim id_tokens: GCP_ID_TOKEN: aud: //iam.googleapis.com/projects/PRJ_NUM/locations/global/workloadIdentityPools/gitlab-pool/providers/gitlab-provider script: - echo $GCP_ID_TOKEN > /tmp/oidc_token - | gcloud iam workload-identity-pools create-cred-config \ projects/PRJ_NUM/locations/global/workloadIdentityPools/gitlab-pool/providers/gitlab-provider \ --service-account=deploy-sa@PRJ.iam.gserviceaccount.com \ --output-file=/tmp/cred.json \ --credential-source-file=/tmp/oidc_token - export GOOGLE_APPLICATION_CREDENTIALS=/tmp/cred.json - gcloud auth login --cred-file=/tmp/cred.json - gcloud builds submit ...

4.7 Workforce Identity Federation との違い

観点Workload Identity FederationWorkforce Identity Federation
対象マシン(CI/CD、外部クラウド)人間(社員、契約者)
用途SA impersonation で API callConsole / gcloud / BigQuery にログイン
Pool 種類Workload Identity PoolWorkforce Pool(Org level)
IdPOIDC / SAML / AWS / Azure 等Okta / Azure AD / SAML / OIDC
料金無料月額 / user 課金あり
BigQuery / Looker 統合◎(人間ユーザーとして permission 評価)

4.8 Direct Resource Access(SA impersonation なし)

2024 以降、SA を経由せずに external identity に直接ロールを付与可能(一部サービスのみ)。BigQuery / Cloud Storage / Pub/Sub 等が対応。

# external identity (GitHub repo) に直接 storage.objectViewer を付与 gcloud storage buckets add-iam-policy-binding gs://my-bucket \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PRJ_NUM/locations/global/workloadIdentityPools/gh-pool/attribute.repository/myorg/myapp" # 利点:SA を作らなくて良い、Audit Log にも external identity が直接記録 # 制約:対応していない API が多い(GKE / GCE 等は SA impersonation 必須)

4.9 制限値

100
Pool / Project
100
Provider / Pool
50
attribute / Provider
127
google.subject の最大文字数

その他:Pool / Provider は 削除後 30 日で完全削除(その間 restore 可)、disable は即時。token TTL は 1 時間(federated token)→ impersonated SA token も 1 時間

4.10 事故ケース

⚠️ 事故 16: Attribute Condition 緩すぎで任意 GitHub repo から認証可能
状況WIF Provider の attribute condition を assertion.repository_owner=='myorg' のみ指定(owner ID なし)
影響攻撃者が「myorg」という GitHub Org を新規作成 → 同名で WIF 認証成功 → 本番 SA を impersonate
根本原因GitHub Org の repository_owner文字列で再利用可能。owner_id(数値)でないと不変ではない
即対処Provider を disable、attribute condition に assertion.repository_owner_id を追加
恒久対策必ず repository_owner_id(数値 ID)を条件に。Terraform で WIF Provider を管理し、PR review で条件を強制
⚠️ 事故 17: WIF Pool 削除で全 CI/CD が一斉停止
状況「使ってない pool を整理」と思って delete、実は 50 リポジトリが利用中
影響全社 deploy が 30 分間停止、Pool は 30 日 soft delete だが provider URL の audience が無効化
根本原因Pool 利用状況の可視化なし、Org Policy で delete 制限なし
即対処gcloud iam workload-identity-pools undelete で 30 日以内に復旧
恒久対策WIF Pool / Provider は IaC 管理、Terraform state lock + 2 名承認、Deny Policy で iam.workloadIdentityPools.delete をブロック
⚠️ 事故 18: audience mismatch で workflow 全失敗
状況WIF Provider を rename(pool ID 変更)したが、GitHub Actions の workflow の workload_identity_provider 値を更新し忘れ
影響「audience claim doesn't match」エラーで全 deploy 失敗
根本原因audience(pool/provider full path)と GitHub Actions 側 workflow の不一致
即対処旧 Pool を再作成(同名で)、または全 workflow を一斉更新
恒久対策Pool / Provider ID は 初期から汎用名で固定(rename 想定外設計)、Terraform で workflow 側も同時更新
⚠️ 事故 19: SA に過剰権限 → fork PR が本番 deploy 可能
状況WIF で deploy-sa(roles/owner 付与)を使い、GitHub Actions の trigger に pull_request も含めていた
影響外部の悪意 contributor が fork から PR 送信 → workflow 起動 → 本番 deploy 可能
根本原因fork からの PR でも secrets / OIDC token は通常発行される(pull_request_target 等の混同)
即対処workflow の trigger から pull_request を除外、本番 deploy は main push のみ
恒久対策本番 SA は Environment Protection(GitHub Environments)と attribute condition で environment=='production'、SA は最小権限

5Infrastructure as Code の Google 推奨

GCP の IaC は Infrastructure Manager / Terraform 直接 / Config Connector / Cloud Foundation Toolkit / Cloud Foundation Fabric / Helm の 6 つが主要選択肢。試験では「マネージド state 管理が欲しい」「K8s で GCP リソース管理したい」「Google 推奨パターンで素早く構築」の 3 つの判断軸が頻出。

5.1 IaC ツール比較マトリクス

→ カスタマイズ性(自由度) → マネージド度 Terraform 直接 Infrastructure Manager Config Connector CFT (modules) Cloud Foundation Fabric (FAST) Helm ↑ State 自動 / GCP 内 ↓ 自分で書く HCL
図 5-1:IaC ツール選定マトリクス(マネージド度 × カスタマイズ性)

5.2 6 ツールの詳細比較

観点Infrastructure ManagerTerraform 直接Config ConnectorCFTCloud Foundation Fabric (FAST)Helm
形式Terraform HCLHCLK8s CRD (YAML)HCL / HelmHCL (blueprint)YAML テンプレ
実行GCP マネージド自己管理 (CLI / Cloud)K8s controller自己実行自己実行 (Terraform)helm CLI / Argo
State自動 (GCP 内)GCS / TF Cloud 自前etcd (reconcile)自前自前 (GCS 推奨)K8s release
Lock自動GCS lockless / TF lockK8s lease自前自前K8s
認証IAM (API)SA / WIF / ADCWorkload IdentitySA / WIFSA / WIFkubeconfig
マルチクラウド×(GCP のみ)××K8s なので可
適合GCP ネイティブ、CI/CD 統合マルチクラウドK8s 文化既存 TF 資産新規 enterpriseアプリ deploy

5.3 Infrastructure Manager 詳細

Infrastructure Manager(2023 GA)は GCP マネージドの Terraform 実行サービス。state 管理 / locking / SA 認証 / Terraform バージョン管理を全て GCP 側で行う。Cloud Build と統合して GitOps に。

# Deployment 作成(Git ソースから) gcloud infra-manager deployments apply projects/PRJ/locations/asia-northeast1/deployments/my-deploy \ --git-source-repo=https://github.com/myorg/infra \ --git-source-directory=terraform/prod \ --git-source-ref=main \ --service-account=projects/PRJ/serviceAccounts/im-runner@PRJ.iam.gserviceaccount.com \ --input-values=region=asia-northeast1,env=prod # 内部動作 # 1) GCP が Git から HCL を fetch # 2) Terraform image を ephemeral VM で起動 # 3) terraform init / plan / apply を実行 # 4) state は GCP 内に保存(GCS 不要、暗号化済み) # 5) lock も GCP 内で自動 # 制限:Terraform CLI のすべての provider が使えるわけではない(OSS provider OK) # 料金:実行時間に応じた compute 課金(Terraform 実行 VM のみ)

5.4 Config Connector 詳細

Config Connector は GKE クラスタ内で動く controller で、Kubernetes CRD として GCP リソースを宣言kubectl apply で GCP リソースが作成され、K8s の reconciliation loop が drift 検出 → 自動修復。

# Config Connector で GCS バケットを作る例 apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: name: my-app-bucket-prod namespace: payment-team annotations: cnrm.cloud.google.com/project-id: "prod-payment" spec: location: ASIA-NORTHEAST1 uniformBucketLevelAccess: true versioning: { enabled: true } lifecycleRule: - action: { type: Delete } condition: { age: 90 } # 同じく Cloud SQL Instance を CRD で apiVersion: sql.cnrm.cloud.google.com/v1beta1 kind: SQLInstance metadata: name: payment-db-prod spec: databaseVersion: POSTGRES_15 region: asia-northeast1 settings: tier: db-custom-4-15360 ipConfiguration: privateNetworkRef: external: projects/net-host/global/networks/shared-vpc
💡 Config Connector のユースケース
  • K8s native な GitOps:Argo CD / Config Sync で K8s manifest と GCP リソースを統合管理
  • アプリチームの自律:開発者が PR で StorageBucketPubSubTopic を追加可能(Platform チームが Custom Constraint で制御)
  • drift 自動修復:誰かが Console で手動変更 → 数分で K8s spec に戻る
  • 注意:reconciler が API quota を消費、大規模になると cnrm-system namespace の CPU/Memory が逼迫

5.5 Cloud Foundation Toolkit(CFT)の主要 module

module 名用途使い所
terraform-example-foundationOrg 全体の Landing Zone(4 ステージ)新規 Org の bootstrap
terraform-google-project-factoryProject 量産(SA / API enable / 予算アラート 同梱)「アプリチームが PR で Project 自作成」
terraform-google-networkVPC / Shared VPC / Firewall / NATHost Project でのネットワーク構築
terraform-google-iamIAM binding(Group ベース付与)Org / Folder / Project の IAM 一括管理
terraform-google-kubernetes-engineGKE Standard / Autopilotクラスタ作成
terraform-google-cloud-buildCloud Build Trigger / Private PoolCI 自動化
terraform-google-bigqueryBigQuery dataset / table / scheduled queryデータ基盤
terraform-google-log-exportAggregated Sink 設定監査ログ集約

5.6 GitOps:Argo CD vs Flux vs Cloud Deploy + Terraform

観点Argo CDFluxCloud Deploy + Terraform
提供OSS (CNCF Graduated)OSS (CNCF Graduated)GCP マネージド
対象K8s リソースK8s リソース + HelmK8s / Cloud Run / Anthos / Custom
UI◎ 専用 UI 充実△ CLI 中心○ Console + CLI
マルチクラスタApplicationSetmulti-tenancymultiple targets
Approval GateSyncWindow◎ approval phase
CanaryArgo Rollouts と併用Flagger◎ built-in canary
適合K8s 中心、複雑な appOSS GitOps 純正GCP マネージド志向、進歩的 delivery

5.7 Terraform State 管理ベストプラクティス

5.8 事故ケース

⚠️ 事故 20: terraform apply -auto-approve で本番リソース大量削除
状況新人が dev 用の Terraform に -target を付けずに apply -auto-approve、リソース定義が消えていた本番リソースが destroy
影響本番 GKE node pool / Cloud SQL 削除、PITR / バックアップから 6 時間復旧
根本原因-auto-approve 利用、本番 / dev で同じ state 共有、code review なし
即対処Cloud SQL PITR、GKE は CFT module で再構築、Backup and DR で復旧
恒久対策本番 apply は 必ず承認制(Infrastructure Manager + Approval Workflow)prevent_destroy = true lifecycle、CI で plan diff チェック
⚠️ 事故 21: Terraform state lock 競合で 3 時間停止
状況2 つの CI ジョブが同じ state に同時 apply → lock 競合、片方が timeout、lock が stale lock として残留
影響その後の全 apply が「state is locked」エラー、復旧まで 3 時間
根本原因lock の TTL なし、強制 unlock の手順が文書化されてない
即対処terraform force-unlock LOCK_ID(lock holder 確認後)
恒久対策Infrastructure Manager に移行(lock 自動)、または lock TTL 設定、Cloud Build trigger で同一 state への並行実行を mutex 制御
⚠️ 事故 22: Config Connector reconciler 暴走で API quota 枯渇
状況YAML 定義に誤った field(spec 衝突)、Config Connector が 無限 retry、Compute API へのリクエストが quota 上限到達
影響同 Project 内の全 GCE / GKE 操作が 503、3 時間停止
根本原因controller の backoff 設定不足、CRD のバリデーション不足
即対処該当 CRD を kubectl delete --force、controller を pause
恒久対策Custom Constraint / kyverno で CRD の事前バリデーション、reconciler の retry budget 設定、Cloud Monitoring で controller error rate を監視
⚠️ 事故 23: 1 つの state にすべて入れて plan が 40 分
状況Org / Network / IAM / 全 Project / GKE / Cloud SQL を 1 つの Terraform state に詰め込み
影響terraform plan が 40 分、PR review が機能停止、些細な変更で全社の lock を占有
根本原因State 分割設計なし、layer 分離なし
即対処terraform state mv で段階的に分割
恒久対策Foundations Blueprint に倣い bootstrap / org / env / project の 4 layer に state 分割、各 layer 単体で apply 可能に
⚠️ 事故 24: Helm chart の values 漏れで本番が dev 設定起動
状況Helm chart で replicas: 1 が default、本番では values-prod.yaml で override する設計だったが -f を渡し忘れ
影響本番 replica が 1、Pod 落ち時にダウンタイム発生
根本原因Helm の引数管理が手作業、CI 検証なし
即対処helm upgrade で正しい values を再適用
恒久対策Cloud Deploy + Skaffold で render を envファイル管理、Helm より Kustomize overlay 推奨(本番 / dev の差分が PR で明確)

6GKE Fleet & マルチクラスタ管理

Fleet(旧 Environs)は 「複数の GKE / Anthos / Attached cluster を 1 つの論理単位として扱う」概念。Sameness / Exclusivity / High Trust / Grouping の 4 原則の上に、Config Sync / Policy Controller / Multi-cluster Services (MCS) / Multi-cluster Ingress (MCI) / Cloud Service Mesh(旧 ASM)/ Workload Identity Pool 等の機能が乗ります。試験では「同名 namespace は同一エンティティ」「1 Project = 1 Fleet」「RootSync vs RepoSync」が頻出。

「A fleet is a Google Cloud concept for logically organizing clusters and other resources, letting you use and manage multi-cluster capabilities and apply consistent policies across your systems. ... Fleet-aware resources can only be members of a single fleet at any given time.」 — Fleet management

6.1 Fleet の概念図

Fleet Host Project: org-fleet-host (1 Project = 1 Fleet) GKE asia-tokyo prod, Standard ns: payment, search v1.30 Regular GKE us-central prod, Autopilot ns: payment, search v1.30 Regular Anthos on AWS DR, EKS attached ns: payment 同一 identity pool GKE on bare-metal on-prem, Anthos ns: payment Fleet 機能(4 Cluster に一括適用) Config Sync Git → 全 cluster Policy Controller OPA Gatekeeper Cloud Service Mesh 旧 ASM (Istio) Multi-cluster Svc cluster 跨ぎ DNS Multi-cluster Ing global LB Workload Identity Pool 全 cluster で共通の identity Connect Gateway VPN 不要で kubectl Team Scopes team 単位の subdivide
図 6-1:GKE Fleet と一括機能

6.2 Fleet の 4 つの設計原則

原則意味実装上の影響
Grouping「強く関連する cluster」だけを 1 fleet に本番 fleet と dev fleet は分離、cross-service 通信が多いものを集約
Sameness同名 namespace / service / identity は 同一エンティティとして扱うcluster A の payment namespace と cluster B の payment namespace は同じチーム所有とみなす(MCS / 認可で重要)
Exclusivity1 cluster は 1 fleet にのみ所属、1 Project は 1 fleet のみ hostfleet 変更には membership 削除 → 再 registration が必要
High Trustfleet 内 cluster は互いに高い信頼関係blast radius の境界は cluster ではなく fleet、セキュリティ境界には不向き → 環境ごとに fleet 分離
🔑 試験ポイント:Sameness の罠 Sameness は便利だが、「同名で別チームの namespace を別 cluster で作る」と意図せず統合される。例:cluster A の monitoring(Platform 用)と cluster B の monitoring(あるアプリ用)が MCS で結合 → service 名衝突。Team Scopes(2023 GA)で namespace prefix を team-bound にすると安全。

6.3 Config Sync:RootSync vs RepoSync

観点RootSyncRepoSync
スコープクラスタ全体(cluster-scoped + 全 namespace)1 namespace のみ
権限cluster-admin(強い)namespace 内 admin(弱い)
用途Platform チームが全 namespace の baseline 配布アプリチームが自 namespace の deploy
同居クラスタに 1 つ(v1beta1)/ 複数 (v1)namespace 単位で 1 つ
Source Typegit / oci / helmgit / oci / helm
典型構成1 cluster に 1 RootSync + N RepoSync(マルチテナント)
# RootSync 例(Platform チーム配布、cluster 全体) apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: root-sync namespace: config-management-system spec: sourceFormat: unstructured git: repo: https://github.com/myorg/platform-baseline branch: main dir: clusters/asia-tokyo auth: gcpserviceaccount gcpServiceAccountEmail: config-sync@PRJ.iam.gserviceaccount.com --- # RepoSync 例(payment チームの自 namespace 管理) apiVersion: configsync.gke.io/v1beta1 kind: RepoSync metadata: name: repo-sync namespace: payment # アプリチームの namespace spec: sourceFormat: unstructured git: repo: https://github.com/payment-team/manifests branch: main dir: overlays/prod auth: gcpserviceaccount gcpServiceAccountEmail: payment-cs@PRJ.iam.gserviceaccount.com

6.4 Policy Controller(OPA Gatekeeper 統合)

Policy Controller は OPA Gatekeeper を Google が拡張したものConstraintTemplate(ルールの定義 / Rego)と Constraint(適用インスタンス)で K8s リソースに admission policy を強制。Policy Bundles(Google 提供のプリセット)で PCI-DSS / NIST 800-53 / CIS Benchmark に即準拠。

# ConstraintTemplate(再利用可能なルール定義) apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata: name: k8srequiredlabels spec: crd: spec: names: { kind: K8sRequiredLabels } validation: openAPIV3Schema: type: object properties: labels: { type: array, items: { type: string } } targets: - target: admission.k8s.gatekeeper.sh rego: | package k8srequiredlabels violation[{"msg": msg}] { required := input.parameters.labels provided := input.review.object.metadata.labels missing := required[_] not provided[missing] msg := sprintf("Label %v is required", [missing]) } --- # Constraint(ConstraintTemplate を使って実際に enforce) apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: ns-must-have-team spec: enforcementAction: deny # dryrun / warn / deny match: kinds: [{apiGroups: [""], kinds: ["Namespace"]}] parameters: labels: ["team", "cost-center"]
💡 Policy Bundles で即準拠 Google は policy-essentials / pci-dss-v3.2.1 / nist-sp-800-53-r5 / cis-k8s-v1.5.1 / asm-policy-v0.0.1 等のプリセットを提供。Fleet に enable するだけで「特権 Pod 禁止」「latest tag 禁止」「resource limits 必須」等の数十ルールが即時 enforce。最初は enforcementAction: dryrun で violation を観測 → 段階的に deny 化。

6.5 Multi-cluster Services (MCS) / Multi-cluster Ingress (MCI)

機能仕組み用途
Multi-cluster Servicescluster 跨ぎの Service discovery、ServiceExport CRD で export → 他 cluster で service.namespace.svc.clusterset.local で resolveactive-active region、リージョン跨ぎ failover
Multi-cluster IngressGlobal LB を 1 つ作成し、複数 cluster の backend に weighted で振り分けblue-green region migration、grobal availability
Multi-cluster GatewayMCI の後継、Gateway API ベース、より高度な traffic 制御HTTP/TCP, header-based routing

6.6 GKE Release Channels と Upgrade 戦略

Channel更新頻度適合
Rapid数週最新機能の早期検証、開発環境
Regular(デフォ)数ヶ月一般的な本番
Stable半年金融、規制業界、保守的
Extended16 ヶ月 LTS長期サポート、ダウンタイム最小化
No channel手動非推奨(自動 patch も停止 = CVE 放置)

6.7 Surge Upgrade vs Blue-Green Node Pool Upgrade

Surge Upgrade(デフォルト)

  • 追加ノード作成 → 旧ノード drain → 削除を繰り返し
  • パラメータ:maxSurge=1(追加 node 数)/ maxUnavailable=0
  • コスト:一時的に 1-25% 増
  • PDB(PodDisruptionBudget)必須、漏らすと瞬断
  • 適合:一般用途

Blue-Green Node Pool Upgrade

  • 新 Node Pool を 全量並列で作成 → traffic 切替 → 旧 Pool 削除
  • コスト:upgrade 中 2x
  • 切戻し即座(旧 Pool を残せば)
  • 適合:ステートフル、リスク高、auto-rollback 必須
  • 「soak time」で本番 traffic を一定期間流して確認後切戻し可

6.8 Maintenance Window / Exclusion

# Maintenance Window:upgrade を許可する時間帯 gcloud container clusters update prod-tokyo \ --maintenance-window-start="2026-06-01T18:00:00Z" \ --maintenance-window-end="2026-06-02T02:00:00Z" \ --maintenance-window-recurrence="FREQ=WEEKLY;BYDAY=SA,SU" # → 毎週土日 UTC 18-02 のみ自動 upgrade # Maintenance Exclusion:絶対に upgrade させない期間(セール / 決算) gcloud container clusters update prod-tokyo \ --add-maintenance-exclusion-name=blackfriday-2026 \ --add-maintenance-exclusion-start=2026-11-25T00:00:00Z \ --add-maintenance-exclusion-end=2026-12-02T00:00:00Z \ --add-maintenance-exclusion-scope=NO_MINOR_OR_NODE_UPGRADES # scope: NO_UPGRADES / NO_MINOR_UPGRADES / NO_MINOR_OR_NODE_UPGRADES # 最長:NO_UPGRADES = 7 日、NO_MINOR_UPGRADES = 90 日、NO_MINOR_OR_NODE_UPGRADES = 180 日

6.9 事故ケース

⚠️ 事故 25: Config Sync の drift 検出漏れで本番設定が手動上書きされた
状況運用者が緊急対応で kubectl edit deployment したまま Git に反映せず放置、Config Sync が drift を warning のみで継続
影響1 か月後に別の修正で Config Sync が override、緊急対応が消えて本番障害
根本原因Config Sync の spec.override.reconcileTimeout 設定不足、drift policy が respect ではなく force
即対処緊急対応内容を Git に commit、Config Sync の drift status を確認
恒久対策「手動 kubectl edit 禁止」を Policy Controller で enforce(admission webhook で last-applied-configuration を強制)、drift 検知時に PagerDuty alert
⚠️ 事故 26: Multi-cluster Ingress の weight split が想定外動作
状況MCI で asia-tokyo 80% / us-central 20% に振り分けたが、tokyo cluster の NEG (Network Endpoint Group) が unhealthy 扱いで全 traffic が us に集中
影響us-central の cluster が capacity 不足で 5xx 多発
根本原因health check の path が間違っていて NEG が常に unhealthy、weight より health 判定が優先
即対処health check の path / port を修正、cluster の readiness probe と一致させる
恒久対策NEG status を Cloud Monitoring で監視、MCI 設定変更後は必ず synthetic check で各 region への到達確認
⚠️ 事故 27: GKE auto-upgrade で本番停止(ABI 非互換)
状況Regular channel で自動 upgrade、新版 Kubernetes で 非推奨 API (policy/v1beta1 PodDisruptionBudget) 削除、アプリ起動不能
影響本番 Pod が ImagePullBackOff の山、4 時間ダウン
根本原因Release notes 未確認、API deprecation 検知なし
即対処マニフェスト修正(policy/v1 に移行)、緊急 deploy
恒久対策Stable channel に切替、API Deprecation Insights(GKE)で事前検知、staging cluster で先に upgrade テスト、pluto ツールで deprecated API 検出を CI に
⚠️ 事故 28: PDB なしで Surge Upgrade で全 Pod 同時 drain
状況Deployment に PodDisruptionBudget を設定せず Surge Upgrade、複数 node から同時 drain で 全 replica が同時に terminate
影響瞬断 30 秒、SLO 違反、エラーバジェット消費
根本原因PDB minAvailable 未設定
即対処緊急で kubectl create pdb
恒久対策Policy Controller で「Deployment には PDB 必須」を enforce、CI で同 namespace の PDB 存在チェック
⚠️ 事故 29: Sameness で別チームの monitoring namespace が結合
状況cluster A の monitoring(Platform チーム所有)と cluster B の monitoring(payment チームが個別作成)が、MCS で同一視され ServiceExport が衝突
影響Platform の Prometheus に payment 用 ServiceMonitor が見えてしまい、metrics 衝突
根本原因Sameness 原則の理解不足、namespace 命名規則なし
即対処payment 側を payment-monitoring に rename
恒久対策Team Scopes で team-prefix を強制、Policy Controller で「namespace 名に team prefix 必須」を enforce

7Cloud Workstations & Gemini

Cloud Workstations は 「VPC 内で動く、IDE プリセット済みの ephemeral 開発 VM」。BYOD / 退職者の data 残留 / オンプレ DB アクセス等のセキュリティ要件に強い。Gemini 3 兄弟(Code Assist / Cloud Assist / CLI)と組み合わせて、開発生産性も底上げ。

「Workstations run on ephemeral Compute Engine VMs, and can be started or stopped on demand to improve cost savings. ... Updates to a workstation configuration automatically apply to workstations when each workstation restarts.」 — Cloud Workstations overview

7.1 Cloud Workstations アーキテクチャ(3 階層)

Workstation Cluster(VPC に紐付け、region 固定) Private Cluster (no public IP) / Shared VPC 対応 / IAP TCP forwarding 同一 cluster の workstation は同じ VPC subnet を共有 CMEK 対応 / Audit Logs 出力 Workstation Config(テンプレート) machineType / persistentDirectories container image (code-oss / IntelliJ / custom) idle timeout / running timeout env vars / serviceAccount pool size (pre-warm) config 変更 → 各 workstation の再起動で反映 Workstation Instances(開発者ごと) alice の workstation /home alice 200GB PD bob の workstation /home bob 200GB PD GCE VM (ephemeral) アクセス:HTTPS(IDE in browser)/ JetBrains Gateway / SSH (IAP) idle timeout で自動 stop → コスト削減 stop しても /home の PD は永続化
図 7-1:Cloud Workstations の Cluster / Config / Instance 3 階層

7.2 各階層の役割と制限

階層役割主な設定制限
ClusterVPC / region 単位の境界VPC、subnet、private/public、CMEK1 region 内、Project あたり複数可
Configテンプレート(machineType / image / idle timeout)e2 / n2 / GPU、persistent home サイズ1 cluster 内に複数(チーム別)
Instance個人の VM、ephemeralconfig から起動、停止可idle timeout(default 20m)/ running timeout(default 12h)

7.3 カスタムイメージのビルド・配布

# 公式 base image から派生 FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest # 開発ツール追加 RUN apt-get update && apt-get install -y \ postgresql-client redis-tools jq make \ && curl -sL https://cli.github.com/install.sh | bash # VS Code 拡張機能をプリインストール(OpenVSX 経由) ENV VSCODE_EXTENSIONS="GoogleCloudTools.cloudcode,golang.go,ms-python.python,hashicorp.terraform" # 自社 root CA 同梱(内部 API への HTTPS) COPY company-ca.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates # Cloud SDK / kubectl / gcloud は同梱済み(base image) # Build & Push docker build -t asia-northeast1-docker.pkg.dev/PRJ/workstations/dev:v1.2.3 . docker push asia-northeast1-docker.pkg.dev/PRJ/workstations/dev:v1.2.3 # Config に image を指定 gcloud workstations configs update my-config \ --container-custom-image=asia-northeast1-docker.pkg.dev/PRJ/workstations/dev:v1.2.3 \ --cluster=my-cluster --region=asia-northeast1

7.4 Private Cluster + CMEK + VPC SC

7.5 Gemini Code Assist(IDE 内 AI)

機能StandardEnterprise
コード補完(inline)
チャット(自然言語 → コード)
30+ 言語サポート
プライベートコード参照(自社 repo を context に)
Code Transformation(API 移行等の一括リファクタ)
GitHub / GitLab PR review
Customization(社内コーディング規約)
データプライバシー:プロンプト学習opt-out 可学習に使われない(zero data retention 設定可)
対応 IDEVS Code / JetBrains / Cloud Shell Editor / Cloud Workstations同左
ライセンス無料枠ありper user / 月課金

7.6 Gemini Cloud Assist(Console / 運用 AI)

機能用途
アーキ設計「100 RPS の API インフラを設計」→ 構成図 + Terraform スニペット出力
InvestigationsLogs Explorer / Metrics から障害ストーリーを自動構築、Root Cause 仮説提示
コスト分析「先月のコスト急増の理由は?」→ Billing Export を分析
gcloud / Terraform 生成自然言語 → コマンド / HCL
SQL 生成BigQuery 内で自然言語 → SQL
セキュリティSecurity Command Center の findings を Gemini が要約・優先度付け

7.7 Gemini CLI(ターミナル AI エージェント)

Gemini CLI(2024 OSS 公開、2025 拡張)は、ターミナルで動く AI エージェント。ファイル読み書き / シェル実行 / Web 検索 / MCP server 連携が可能で、リポジトリ理解・自動修正・IaC 生成等のタスクを自律実行。

# ローカル / Cloud Shell / Cloud Workstations で実行 brew install gemini-cli # または npm install -g @google/gemini-cli gemini auth login # 個人 Google アカウント / Vertex AI / WIF gemini # 対話モード起動 > @./src このリポジトリの構成を要約して > @./terraform 既存 IaC を読み取って、Cloud SQL を追加する PR を作成して > @./.github/workflows GitHub Actions の deploy job を Cloud Build に変換して # 非対話(CI で使う) gemini "Update package.json dependencies" --yolo # 自動承認モード(dangerous) gemini -p "Find security issues in src/" --output-format=json

7.8 3 ツールの使い分け

ツール場所主用途典型 prompt
Gemini Code AssistIDE 内(VS Code / JetBrains / Cloud Workstations)コーディング中の補完・チャット「この関数の単体テストを書いて」
Gemini Cloud AssistGCP Console 内クラウド運用・設計・障害調査「prod-payment の 5xx 増加の原因は?」
Gemini CLIターミナル(ローカル / Cloud Shell / Workstations)エージェント的タスク(リポ理解、IaC 生成、自動修正)「全 Dockerfile に health check を追加する PR を作成」

7.9 事故ケース

⚠️ 事故 30: Cloud Workstations の idle timeout で作業データ消失
状況開発者が 30 分席を外し、idle timeout(default 20m)で workstation 停止。/tmp や /workspace の作業データが消失(PD 以外)
影響2 時間分の試行錯誤データが消失、開発者の士気低下
根本原因persistent home(/home)以外の場所に作業ファイルを置いていた、idle timeout が短すぎ
即対処workstation を再 start(PD の /home は残る)、消えた作業は git にあるもののみ復旧
恒久対策「作業ファイルは必ず /home 配下に」を周知、persistent_directories/workspace を追加、idle timeout を 1-2h に延長、頻繁な git push を文化に
⚠️ 事故 31: カスタムイメージ更新後に拡張機能が壊れた
状況Workstations 用カスタムイメージを VS Code 最新版に更新したら、社内独自の VSIX 拡張が API 非互換で起動不能
影響全開発者の IDE が壊れ、半日間生産性低下
根本原因カスタムイメージのテスト環境なし、即本番に推送
即対処config を旧 image tag に rollback、各 workstation を再起動
恒久対策カスタムイメージは dev → stage → prod の段階リリース、Cloud Build で smoke test(image を ephemeral workstation で起動して IDE 起動確認)
⚠️ 事故 32: Workstations から Gemini Code Assist が動かない(VPC SC)
状況VPC Service Controls で workstations を境界に入れたが、aiplatform.googleapis.com を ingress rule に追加し忘れ
影響Gemini Code Assist が「permission denied」、開発者の AI 補助が全停止
根本原因VPC SC の境界設定で AI Platform API 未許可
即対処VPC SC perimeter に aiplatform / generativelanguage を追加
恒久対策VPC SC 設定変更前に Dry Run mode で違反を確認、Gemini 利用 API を一覧化して必ず allow rule に
⚠️ 事故 33: Gemini CLI の --yolo で本番リソース削除
状況Gemini CLI を --yolo(自動承認)で実行、prompt の解釈ミスで terraform destroy 相当のコマンドを実行
影響本番 staging 環境のリソース全削除、復旧 3 時間
根本原因自動承認モードを本番アクセス可能な環境で実行、SA 権限過剰
即対処Terraform から再 apply、Backup and DR で復旧
恒久対策--yolo は dev sandbox のみで使用、Gemini CLI 実行 SA は読み取り中心の権限のみ、本番への apply は人間承認必須

8事故ケース総集編 / 試験で問われる即答パターン

8.1 全章の事故ケース一覧

#領域事故根本原因即対処
1Org Policy外部ドメインに Owner 付与allowedPolicyMemberDomains 未設定Constraint で自社ドメインのみ allow
2Resource MgrFolder 削除でリソース道連れ削除前棚卸し漏れDeny Policy で folders.delete ブロック + PAM
3ProjectProject quota 上限到達ephemeral lifecycle なしTTL ラベル + Scheduler で自動削除
4命名所有者不明 Project 200 個Custom Constraint なしcost-center ラベル必須化
5IAMDefault SA の Editor 自動付与Org Policy 未設定automaticIamGrantsForDefaultServiceAccounts disable
6TerraformState 喪失で Org 再構築不能local backendInfrastructure Manager / GCS + CMEK
7VPC Peering非推移で 3 拠点不通仕様理解不足NCC で hub-spoke 構成
8Shared VPCIAM 全置換で Service Project 停止setIamPolicy 破壊的add-iam-policy-binding 強制 + IaC 管理
9PSCendpoint quota 上限粒度過剰internal LB 経由で集約
10Shared VPCCross-Org で attach 不可同一 Org 必須HA VPN / NCC で接続
11Network/24 で IP 枯渇subnet 設計/16 + Discontiguous Multi-Pod CIDR
12IAMOwner 50 人付与で DB dropBasic Role 濫用Group ベース + PAM JIT
13SA KeyGitHub 流出で仮想通貨マイニングSA Key 存在WIF 移行 + Org Policy で SA Key 禁止
14Custom Role権限不足で Cloud Build 失敗Predefined を base にせずPredefined を base + Iterate
15Conditional IAMCEL タイポで access 不能テストなしPolicy Simulator + break-glass
16WIFcondition 緩く任意 repo 認証owner_id 未指定repository_owner_id 必須化
17WIFPool 削除で全 CI 停止IaC 管理なしundelete + Deny Policy + IaC
18WIFaudience mismatchrename ミス初期から汎用名固定
19WIFfork PR で本番 deploytrigger 制御不足Environment Protection + condition
20Terraform-auto-approve で本番削除承認なし承認 workflow + prevent_destroy
21Terraformstate lock 競合 3h 停止stale lockInfrastructure Manager 移行
22Config Connectorreconciler 暴走で API quota 枯渇CRD バリデーション不足kyverno + retry budget
23Terraform1 state で plan 40 分分割設計なし4 layer 分割(Foundations)
24Helmvalues 漏れで本番起動失敗引数手作業Kustomize overlay + Cloud Deploy
25Config Syncdrift 検出漏れで本番上書きdrift policy 設定kubectl edit 禁止 + alert
26MCIweight が NEG unhealthy で偏ったhealth check 誤設定synthetic check + Monitoring
27GKEauto-upgrade で deprecated APIRelease notes 未確認Stable channel + pluto in CI
28GKEPDB なし Surge で瞬断PDB 未設定Policy Controller で PDB 必須
29FleetSameness で別チーム ns 衝突命名規則なしTeam Scopes + 強制 prefix
30Workstationsidle timeout で作業消失/home 外に保存persistent_directories 拡張 + timeout 延長
31Workstationsimage 更新で拡張壊れテスト環境なしdev→stage→prod の段階リリース
32VPC SCGemini Code Assist 不通aiplatform 未許可Dry Run mode で事前確認
33Gemini CLI--yolo で本番削除権限過剰read-only SA + 本番は人間承認

8.2 試験本番で迷ったらこれ:即答マトリクス

🔑 即答マトリクス(PCDE 試験で頻出)
問題のキーワード正解(即答)
Google 推奨の Landing Zone を Terraform で構築Cloud Foundation Toolkit (terraform-example-foundation) / Cloud Foundation Fabric
複数プロジェクトで 1 つのネットワーク基盤を中央管理Shared VPC(同一 Org 内)
異なる Organization の VPC を接続VPC Peering or HA VPN(Cross-Org Shared VPC は不可)
Cloud SQL / Memorystore 等のマネージドにプライベート接続Private Service Connect
複数 VPN / Interconnect を hub-spoke で統合Network Connectivity Center (NCC)
GitHub Actions / GitLab CI から GCP に SA Key 無しで認証Workload Identity Federation
GKE Pod から GCP API に認証Workload Identity for GKE
人間ユーザーが外部 IdP(Okta 等)で GCP Console にログインWorkforce Identity Federation
SA Key を作らせないOrg Policy iam.disableServiceAccountKeyCreation + Deny Policy
Default SA に Editor 自動付与を止めるOrg Policy iam.automaticIamGrantsForDefaultServiceAccounts
外部ドメイン user 流入を防ぐOrg Policy iam.allowedPolicyMemberDomains
リソース作成可能リージョン制限(データ常駐)Org Policy gcp.resourceLocations
規制対応のフォルダ単位プロファイルAssured Workloads
Org Policy を本番適用前にテストDry Run mode(dryRunSpec)
「絶対に禁止」を IAM allow より優先Deny Policy
過去 90 日の利用から最小権限を提案IAM Recommender
誰が何にアクセスできるかを Org 横断で照会Policy Analyzer
「なぜ access できる/できない」逆引きPolicy Troubleshooter
時限・承認制の権限昇格Privileged Access Manager (PAM)
IaC の state 管理を GCP に任せるInfrastructure Manager
K8s で GCP リソースを宣言管理Config Connector
Google 推奨 module 集Cloud Foundation Toolkit (CFT)
opinionated な end-to-end blueprintCloud Foundation Fabric (FAST)
複数の GKE / Anthos cluster を論理単位として扱うGKE Fleet
Git → 複数 cluster へ K8s マニフェスト同期Config Sync
Platform チームが cluster 全体に baseline 配布RootSync
アプリチームが自 namespace を管理RepoSync
OPA Gatekeeper で K8s admission 制御Policy Controller
PCI-DSS / NIST のルール集を即適用Policy Controller の Policy Bundles
cluster 跨ぎ Service DiscoveryMulti-cluster Services (MCS)
複数 region cluster に global LBMulti-cluster Ingress (MCI) / Multi-cluster Gateway
cluster に kubectl したい(VPN 不要)Connect Gateway
金融・規制業界の保守的 GKE channelStable channel(または Extended で LTS)
blue-green node pool upgrade を選ぶ理由ステートフル、即時 rollback 要求
セール期間中の upgrade 抑止Maintenance Exclusion(最長 180 日)
ブラウザベース開発環境(VPC 内)Cloud Workstations
無料の軽量シェルCloud Shell(5GB 永続)
IDE 内 AI 補完Gemini Code Assist
Console 内クラウド運用 AIGemini Cloud Assist
ターミナルエージェントGemini CLI
Software Delivery Shield の傘下Cloud Workstations + Cloud Build (SLSA L3) + AR + Binary Auth + Cloud Deploy
Cloud Service Mesh の正体旧 Anthos Service Mesh(Istio ベース)

8.3 ベストプラクティス チェックリスト

✅ 組織 / IAM

・Folder 構造を Application-centric or Environment-centric で統一
命名規則を Custom Constraint で enforce(cost-center label 必須)
・Basic Role 禁止、Group ベース付与
SA Key を作らない(Org Policy + Deny Policy)
・automaticIamGrantsForDefaultServiceAccounts を disable
・allowedPolicyMemberDomains で外部 user 流入防止
・PAM で JIT 権限昇格

✅ ネットワーク

同一 Org 内集中管理 → Shared VPC
マネージドサービス接続 → PSC
・複数 VPN / Interconnect → NCC で hub-spoke
・subnet は /16 で広く確保、後で広げられない
・Cross-Org は HA VPN / Cross-Cloud Interconnect

✅ IaC

・State は Infrastructure Manager または GCS + CMEK + Object Versioning
・State を 4 layer 分割(bootstrap / org / env / project)
・本番 apply は 必ず承認 workflow
prevent_destroy = true lifecycle
Policy Simulator で事前テスト
Cloud Foundation Toolkit / Fabric から始める

✅ WIF / CI-CD

SA Key を完全廃止 → WIF
・attribute condition で repository_owner_id 必須
・GitHub Environment Protection と連携(attribute.environment)
・WIF Pool / Provider は IaC + Deny Policy で delete 禁止
・SA は最小権限、責務別に分割

✅ GKE / Fleet

・Fleet は 環境ごとに分離(blast radius)
Team Scopes + namespace prefix 強制(Sameness の事故防止)
・Config Sync の drift policy を force に
・Policy Controller の Policy Bundles を dryrun → deny
PDB 必須化(Policy Controller)
・Stable channel + Maintenance Exclusion(セール期間)

✅ Workstations / Gemini

Private Cluster + CMEK + VPC SC で配布
・persistent_directories に /workspace を追加、idle timeout を 1-2h
・カスタムイメージは dev→stage→prod の段階リリース+ smoke test
・Gemini Code Assist Enterprise で zero data retention
Gemini CLI の --yolo は dev sandbox のみ、本番は read-only SA

8.4 トラブルシュート意思決定フロー

💡 「Bootstrap 領域で何かおかしい」時の切り分け順序
  1. Cloud Audit Logs を見る:誰がいつ何を呼んだか。Resource Manager / IAM / Org Policy / WIF / Config Connector は全て Audit Logs に記録
  2. エラーメッセージで層を特定permission denied→IAM、policy violation→Org Policy、audience mismatch→WIF、quota exceeded→quota
  3. Policy Troubleshooter:「なぜ access できない」を逆引き
  4. Org Policy の effective policygcloud org-policies describe で確認
  5. WIF なら token を decode(jwt.io)して claim を確認、attribute condition と照合
  6. Shared VPC なら Host で IAM networkUser が付いているか、subnet が許可されているか
  7. Config Sync / Connector なら controller pod のログを確認、reconcile error を見る
  8. 最近の変更:直近 24h の Org Policy / IAM / Terraform / Config Connector CRD の diff

8.5 次のステップ