PCD 合格対策

セクション1:クラウドネイティブアプリの設計

公式試験ガイド 042426版(2026年4月改訂) — Section 1: Designing highly scalable, secure, and reliable cloud-native applications

32%
出題比重
★最重要
優先度
3
サブトピック
~16問
想定問数
🎯 このセクションの核心 アプリ設計の上流工程。PCD は「アプリ開発者目線」の試験なので、正解は常に「Google が推奨するベストプラクティス」+ 「最小権限」+ 「マネージドを優先」。問題文に出てくる要件キーワード(「ステートレス」「スケール 0」「グローバル分散」「コード変更なし」など)から正解の選択肢を即座にマッピングできるレベルが必要。

1.1 高性能なアプリケーションと API の設計

公式ガイドのキー項目は 15項目(プラットフォーム選定、コンテナデプロイ、地理的分散、ロードバランサ、セッションアフィニティ、キャッシュ、API、レート制限、非同期統合、リソース要件、コスト最適化、データレプリケーション、トラフィック分割、オーケストレーション)。1.1 だけでこのセクション内の半数近くを占める想定。

コンピュート 3 種の使い分け(最頻出)

高抽象(マネージド) 低抽象(自由度) Cloud Run コンテナ + HTTP 0〜数千スケール リクエスト課金 ⭐ 第1選択 GKE Kubernetes Pod 細粒度制御 ノード VM 課金 GPU / StatefulSet Compute Engine VM (IaaS) フル制御 VM 時間課金 最終手段
図1: GCP コンピュートの抽象化スペクトル。左に行くほど運用負荷が低く、右に行くほど自由度が高い。

GKE Autopilot / Standard

  • 抽象度: 中(Pod / Service / Ingress)
  • スケール: Pod 単位で細かく制御
  • StatefulSet: ✅ 対応
  • GPU: ✅(Standard)
  • 課金: Pod requests (Autopilot) / ノード VM (Standard)
Pod 細粒度制御、特殊な DaemonSet、GPU が必要、ステートフル要件がある時。

Compute Engine

  • 抽象度: 低(OS レベル)
  • スケール: MIG で VM 単位
  • カーネル制御: ✅ フル
  • 永続接続: ✅(長時間接続)
  • 課金: VM 時間 + ディスク + ネット
特殊なカーネル要件・レガシー移行・永続接続。Cloud Run / GKE で不可能な場合のみ。

選定フローチャート(暗記推奨)

Q1: アプリは HTTP/gRPC でリクエスト駆動か?
YES → Q2 へ
NO(バッチ・常時稼働サービス)→ 用途で分岐
バッチ(HTTP 不要、< 24h) → Cloud Run Jobs
常時稼働ステートフル / Kafka 等 → GKE
Q2: ステートレス・スケール 0 OK?
YES → Cloud Run(第1選択)
NO → Q3 へ
Q3: GPU / 特殊 DaemonSet / Pod 細粒度制御が必要?
YES → GKE Standard
NO(だが Cloud Run で不可能)→ Q4 へ
Q4: 永続接続 / カーネル制御 / レガシー OS 必須?
YES → Compute Engine
NO → GKE Autopilot
よくある罠:「GKE が万能」という誤解
  • 「Kubernetes 経験者がいる」だけで GKE を選ぶと、運用負荷(コントロールプレーン、ノードアップグレード、IAM 設計、ネットワーク)が積み上がる
  • シンプルな HTTP API なら Cloud Run の方が 運用負荷も TCO も低い ことが多い
  • PCD の選択肢では「Kubernetes 経験者がいない」「運用負荷を最小化」というキーワードがあれば Cloud Run が正解

Cloud Run のオートスケーリング深掘り

Cloud Run のスケーリング挙動は試験でも実務でも最頻出。公式ドキュメントから3つの主要フラグを正しく理解しましょう。

--min-instances(最小インスタンス数)

  • デフォルト: 0。トラフィックがない場合は完全に 0 までスケールダウン
  • 1以上に設定すると、そのインスタンス数を常時 warm に保つ(idle 状態でも CPU は割当てられる)
  • コールドスタートを実質ゼロに(min-instances=1 でも)
  • バックグラウンドタスク(リクエスト処理外で動くスレッド)がある場合、公式が 1以上を必須 としている
gcloud run deploy my-service \
  --image=us-central1-docker.pkg.dev/PROJECT/repo/app:v1 \
  --min-instances=1 \
  --max-instances=100 \
  --concurrency=80 \
  --region=us-central1
注意:min-instances は idle でも課金される min-instances=1 にすると、トラフィックがなくても 1 インスタンス分のメモリ × アイドル CPU が課金される。コスト試算は (min-instances) × (idle CPU 単価) × 月時間 をベースに。

--max-instances(最大インスタンス数)

  • 明示的にデフォルト値はないが、すべてのサービスに暗黙の上限が割当てられている
  • 上限超過時のリクエストは 最大10秒 または スタートアップ時間の 3.5倍 までキュー待機。それを超えるとエラー (429 / 503)
  • 「max-instances=100」と設定しても、突発的なスパイクでは 最大2倍程度(200)まで超過することがある(保証値ではない)
  • 主目的:バックエンド(Cloud SQL の接続数上限、Apigee のクォータ)の保護
推奨設定 バックエンド DB の最大接続数 ÷ 1インスタンスあたりの接続数 = max-instances の目安。例:Cloud SQL の max_connections=100、1インスタンスで 10接続 → max-instances=10。

--concurrency(1インスタンスあたりの同時リクエスト)

  • デフォルト: 80(同時に最大 80 リクエストを処理)
  • I/O バウンド(DB 待ち、外部 API 待ち多め)→ 高めに(80〜1000)
  • CPU バウンド(画像処理、暗号、ML 推論)→ 低めに(1〜10)
  • concurrency=1 にすると、リクエストごとにインスタンスが必要 → コールドスタート頻発のリスク
アプリ特性推奨 concurrency理由
シンプルな REST API(CRUD)80(デフォルト)I/O 待ちが主、CPU 余裕
外部 API 集約(Backend-for-Frontend)200〜500I/O バウンド、CPU 軽量
画像/動画変換1〜4CPU 重い、メモリ枯渇リスク
ML 推論(CPU)1〜21リクエストで CPU 100% 使う

インスタンスのライフサイクル

  1. 起動: リクエスト到着 → コンテナ pull → アプリ起動 → ポート 8080 で listen 開始
  2. サービング: HTTP リクエストを受付、concurrency まで並列処理
  3. アイドル: リクエストが終わっても 最大 15分(GPU は10分)は idle で残る。すぐ次のリクエストが来ればコールドスタートを回避
  4. 終了 - グループA: 1分窓で利用率 < 10% のインスタンス群を即座にシャットダウン
  5. 終了 - グループB: 残りは 15分のアイドル timeout で順次シャットダウン
アイドル中も DB コネクションは生きている アイドルインスタンスでもオープン中の DB 接続は保持される。コネクションプールのアイドルタイムアウトを Cloud SQL の wait_timeout より短くしないと、サーバ側で切断 → 次リクエストで失敗する。

Cloud Run のスケーリングシーケンス

時間 → 1 3 5 7 7 5 3 1 朝 8時 12時(ピーク) 深夜 2時(min=1で warm 維持) サービング中 起動中
図2: トラフィック変動に応じた Cloud Run のインスタンス数遷移(min-instances=1 設定時)
出題されがちな誤解パターン
  1. 「メモリ使用率でスケールできる」 → ❌ Cloud Run は CPU 使用率と concurrency のみで判断。メモリ枯渇は OOM Kill になる
  2. 「max-instances は厳密な上限」 → ❌ 突発スパイクで2倍程度超過する可能性
  3. 「concurrency=1 で安定する」 → ❌ 逆にコールドスタートを頻発させ、レイテンシが悪化する
  4. 「Single-thread のアプリは concurrency 高くしてよい」 → ❌ CPU バウンドで遅延爆発

ロードバランサ — 5種類の使い分け

HTTP(S) Load Balancing

  • L7(アプリケーション層)、HTTP/HTTPS
  • グローバル:1つの Anycast IP で世界中
  • Cloud CDN 連携、SSL 終端、URL Map
  • Cloud Run / GKE / App Engine の 標準前段
グローバル Web 配信ならこれ一択

TCP/SSL Proxy LB

  • L4、TCP/SSL の終端
  • グローバル、HTTP 以外の任意プロトコル
  • MQTT、PostgreSQL 等のグローバル終端
非 HTTP の地球規模公開

Network LB

  • L4、TCP/UDP(プロキシしない pass-through)
  • リージョナル
  • クライアント IP がそのままバックエンドに見える
送信元 IP 保持、UDP 必要

Internal HTTP(S) LB

  • L7、VPC 内のみ
  • マイクロサービス間のロードバランシング
  • Cloud Service Mesh と組み合わせ
バックエンドサービス間

Internal TCP/UDP LB

  • L4、VPC 内のみ
  • 非 HTTP(DB、Redis 等)
VPC 内 L4 サービス

Cloud Run / GKE への LB 接続

クライアント

HTTP リクエスト

HTTP(S) LB

SSL 終端、URL Map、Cloud CDN

HTTP(S) LB

バックエンドサービス

Serverless NEG

Cloud Run / Cloud Functions / App Engine

HTTP(S) LB

バックエンドサービス

NEG / Instance Group

GKE Pod / Compute Engine VM

非同期 / イベント駆動 — 4種の使い分け

PCD で最頻出のひっかけポイント。各サービスの「本来の役割」をペアで対比して覚えるのが攻略の鍵。

Pub/Sub

  • 目的: 1-to-N ファンアウト
  • スループット: 毎秒数百万メッセージ
  • 配信保証: at-least-once(Pull は Exactly-once 可)
  • 順序: Ordering Keys でパーティション内順序
「複数 Subscriber に同じイベントを配る」

Cloud Tasks

  • 目的: 個別タスクのキュー処理
  • スケジュール: 最大 30日先まで delayed
  • リトライ: 細粒度(最大回数、間隔、ジッター)
  • レート制御: Queue 単位
「1タスク = 1回確実に処理」

Eventarc

  • 目的: GCP リソースイベント駆動
  • イベントソース: 130+(GCS, BigQuery, Audit Logs, Pub/Sub, Direct)
  • 受信先: Cloud Run, GKE, Workflows
  • 標準: CloudEvents 準拠
「GCP の何かが起きたら処理」

Workflows

  • 目的: 多サービスのオーケストレーション
  • 記述: YAML 宣言、条件分岐、並列実行
  • ステート: 各ステップの結果を保持
  • 呼出先: GCP API / 外部 HTTP API
「複数ステップを連結し、エラー処理を中央化」

判断軸チートシート(即答できるようにする)

キーワード正解サービス誤答の罠
「複数の Subscriber にイベントを配信」「ファンアウト」Pub/SubCloud Tasks(1対1)を選ぶ罠
「N分後に実行」「指数バックオフでリトライ」「特定キューにレート制限」Cloud TasksPub/Sub(順序遅延の制御性低い)
「GCS にファイル up されたら処理」「BigQuery にジョブ完了したら」EventarcCloud Scheduler でポーリング(非効率)
「5サービスを順番に呼び、エラー時にロールバック」Workflows各サービスに直接連鎖(複雑)
「毎日 2時にバッチ起動」Cloud Scheduler + Pub/Sub / Cloud Runk8s CronJob(運用負荷高)

Pub/Sub Exactly-once delivery の詳細(深掘り)

📖 Exactly-once delivery の仕組みと制約

仕組み: メッセージ ID に基づいて Pub/Sub が「確認応答済み」を追跡し、確認応答デッドライン内に成功した場合は再配信しない。

制約:

  • Pull subscription のみ対応。Push は at-least-once のみ(理由:Push は HTTP レスポンスで確認応答するが、Pub/Sub が受信したかどうか曖昧)
  • スループット上限:毎秒約 1,000 メッセージ程度(at-least-once より約 1桁低い)
  • publish-to-subscribe レイテンシが 大幅に増加

重複が発生しうるケース:

  • パブリッシャー側で同じデータを別のメッセージ ID で送った場合(Exactly-once でも防げない)
  • 確認応答デッドラインを超えた処理(タイムアウトしたメッセージは再配信)
gcloud pubsub subscriptions create my-sub \
  --topic=my-topic \
  --enable-exactly-once-delivery
出題のひっかけ 「Pub/Sub で Exactly-once を実現したい」と聞かれたら、選択肢に Push subscription があれば不正解(Pull のみ対応)。Push を選ばせる罠が頻出。

トラフィック分割(Canary / Blue-Green / A/B)

Cloud Run のリビジョン管理 + traffic splitting は試験必須トピック。

段階的リリースの実装フロー

Step 1 --no-traffic --tag=canary Step 2 --to-tags= canary=10 Step 3 (monitor) Cloud Monitoring error rate, p99 Step 4 canary=100 (全展開) 異常検知 → 即ロールバック gcloud run services update-traffic --to-revisions=PREVIOUS=100
図3: Cloud Run の canary リリースシーケンス。tag-based routing で固定 URL からテスト、% 配信で段階展開、異常検知で瞬時にロールバック。

実装コード(コピペ可)

# Step 1: 新リビジョンを 0% でデプロイ + canary タグ
gcloud run deploy my-service \
  --image=us-central1-docker.pkg.dev/PROJECT/repo/app:v2 \
  --no-traffic --tag=canary --region=us-central1
# → https://canary---my-service-xxx.a.run.app でテスト可能

# Step 2: 10% に振る(タグ指定)
gcloud run services update-traffic my-service \
  --to-tags=canary=10 --region=us-central1

# Step 3: 監視(Cloud Monitoring の error rate, p99 latency を観察)
# 異常があれば↓
gcloud run services update-traffic my-service \
  --to-revisions=LATEST=0 --region=us-central1
# 旧リビジョンに 100% 戻る

# Step 4: 段階的に拡大
gcloud run services update-traffic my-service \
  --to-tags=canary=50 --region=us-central1
gcloud run services update-traffic my-service \
  --to-tags=canary=100 --region=us-central1
本番運用のヒント Cloud Build で --no-traffic --tag=canary でデプロイ → Cloud Monitoring のアラート(error rate > 1% で 5分継続)で update-traffic --to-revisions=PREVIOUS=100 を自動実行する仕組みを組めば、無人ロールバックが実現する。

1.2 セキュアなアプリケーションの設計

認証パターン — 5シナリオ別の正解

🔑 シナリオ A:GCP サービスから GCP API を呼ぶ(同一プロジェクト内)

正解: Application Default Credentials (ADC) + サービスアカウント

Cloud Run / GKE / Cloud Functions / Compute Engine では、サービスに割り当てた SA から メタデータサーバ経由で自動取得。コード変更不要。

from google.cloud import storage
client = storage.Client()  # ADC で自動認証
bucket = client.bucket("my-bucket")

避けるべき: SA Key を Cloud Run の環境変数や Secret に注入する(不要かつ漏洩リスク)

🔑 シナリオ B:GKE Pod から GCP API を呼ぶ

正解: Workload Identity(GKE Workload Identity)

Kubernetes ServiceAccount に annotation で GCP SA を紐付け、iam.workloadIdentityUser ロールで借用を許可。Pod は SA Key 配布なしで GCP API を呼べる。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-ksa
  namespace: default
  annotations:
    iam.gke.io/gcp-service-account: my-gsa@PROJECT.iam.gserviceaccount.com
gcloud iam service-accounts add-iam-policy-binding \
  my-gsa@PROJECT.iam.gserviceaccount.com \
  --role=roles/iam.workloadIdentityUser \
  --member="serviceAccount:PROJECT.svc.id.goog[default/my-ksa]"
🔑 シナリオ C:GCP 外部から GCP API を呼ぶ(GitHub Actions / AWS / Okta 等)

正解: Workload Identity Federation (WIF)

詳細は次の WIF 深掘り セクションへ。

🔑 シナリオ D:既存 Web アプリに Google アカウント認証を追加

正解: Identity-Aware Proxy (IAP)

HTTP(S) LB の前段で認証を強制、アプリのコード変更不要。詳細は IAP 深掘り へ。

🔑 シナリオ E:ユーザー認証付き SaaS(メール/パスワード、SAML、ソーシャル)

正解: Identity Platform(または Firebase Authentication)

  • メール/パスワード、Google/Facebook/Apple/GitHub OAuth、SAML 2.0、OIDC をすべてサポート
  • MFA(SMS、TOTP)対応
  • JWT を発行 → クライアント → バックエンドが検証
🔑 シナリオ F(特殊):マイクロサービス間の mTLS

正解: Cloud Service Mesh(旧 Anthos Service Mesh)

PeerAuthentication: STRICT ポリシーで mTLS を強制。証明書は Mesh が自動ローテーション。

Workload Identity Federation(WIF)深掘り

2026改訂で 強化された頻出トピック。「Service Account Key を発行しない」現代的なクラウド外連携の標準。

外部 IdP GitHub Actions / AWS Okta / Azure / GitLab OIDC トークン発行 OIDC ID Token Workload Identity Pool Provider が IdP との関係を定義 attribute mapping で claims を変換 attribute condition で許可範囲を絞る フェデレーショントークン (STS) Service Account 借用(オプション) roles/iam.serviceAccountTokenCreator で借用許可 GCP リソース Cloud Run / GCS / BigQuery Cloud Build / Secret Manager 等 直接 IAM 付与可 principal://iam.googleapis.com /projects/.../subject/... または SA 経由
図4: WIF のアーキテクチャ。外部 IdP の OIDC トークン → Pool/Provider で検証 → STS フェデレーショントークン → 直接 IAM か SA 借用で GCP リソースアクセス。

WIF の構成手順(GitHub Actions の例)

# Pool 作成
gcloud iam workload-identity-pools create github-pool \
  --location=global \
  --display-name="GitHub Actions Pool"

# Provider 作成(GitHub の OIDC)
gcloud iam workload-identity-pools providers create-oidc github-provider \
  --location=global \
  --workload-identity-pool=github-pool \
  --issuer-uri="https://token.actions.githubusercontent.com" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository" \
  --attribute-condition="assertion.repository=='my-org/my-repo'"
attribute-condition は必須! attribute-condition を 付け忘れると、すべての GitHub リポジトリから Pool にアクセス可能になる(Confused Deputy)。本番では特定 repo / org に必ず絞る。
# Service Account 借用許可(SA 経由パターン)
gcloud iam service-accounts add-iam-policy-binding \
  my-sa@PROJECT.iam.gserviceaccount.com \
  --role=roles/iam.workloadIdentityUser \
  --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/attribute.repository/my-org/my-repo"

# またはリソースに直接 IAM(直接アクセスパターン)
gcloud projects add-iam-policy-binding PROJECT_ID \
  --role=roles/run.developer \
  --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/attribute.repository/my-org/my-repo"
PROJECT_ID と PROJECT_NUMBER の混同 外部 IdP からの IAM バインドでは PROJECT_NUMBER(数字)を使う。PROJECT_ID(文字列)だと動かない。
# .github/workflows/deploy.yml
name: Deploy to Cloud Run
on:
  push:
    branches: [main]

permissions:
  contents: read
  id-token: write    # ← OIDC トークン要求のため必須

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - id: auth
        uses: google-github-actions/auth@v2
        with:
          workload_identity_provider: projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/github-pool/providers/github-provider
          service_account: my-sa@PROJECT.iam.gserviceaccount.com
      - run: gcloud run deploy my-service --source=. --region=us-central1
WIF の代表的な落とし穴
  1. attribute-condition 未設定 → 他人のリポジトリから攻撃可能(Confused Deputy)
  2. PROJECT_NUMBER と PROJECT_ID の混同 → 動かないが症状がわかりにくい
  3. roles/iam.workloadIdentityUser が SA レベルで必要 → プロジェクトレベルではダメ
  4. 環境ごとに別 Pool を作るのが推奨。dev/staging/prod を同じ Pool で扱うと境界が緩む
  5. id-token: write 権限を GitHub Actions の workflow に与え忘れて 401 になる
SA Key 完全排除のロードマップ
  1. 監査: gcloud iam service-accounts keys list で全 SA Key を棚卸し
  2. 用途分類: GitHub Actions / AWS / Okta / オンプレ ごとに分類
  3. WIF 構築: 各環境向けに Pool/Provider を作成
  4. 切替: アプリ/パイプラインを WIF に切替
  5. SA Key 削除: 切替後、SA Key を削除し Organization Policy constraints/iam.disableServiceAccountKeyCreation で新規発行も禁止

Secret Manager 深掘り

Secret Manager は単なる「環境変数の代替」ではなく、バージョン管理・IAM・CMEK・自動ローテーションを一体化したシークレット基盤。

Secret Manager の3つのアクセスパターン

② Cloud Run secret-as-volume

  • Cloud Run のフラグで --update-secrets=/secrets/key=SECRET:latest
  • ファイルとしてマウント
  • コードは open("/secrets/key") で読むだけ
既存アプリで設定ファイル想定なら

③ Cloud Run secret-as-env

  • Cloud Run のフラグで --update-secrets=KEY=SECRET:latest
  • 環境変数として注入
注意:gcloud run services describe でも値は隠蔽されるが、プロセス環境変数として読める

ランタイム取得の実装例

from google.cloud import secretmanager

def get_secret(secret_id: str, version: str = "latest") -> str:
    client = secretmanager.SecretManagerServiceClient()
    name = f"projects/PROJECT_ID/secrets/{secret_id}/versions/{version}"
    response = client.access_secret_version(request={"name": name})
    return response.payload.data.decode("UTF-8")

# 起動時に1回だけ取得(毎リクエストで取得しない)
DB_PASSWORD = get_secret("db-password")
API_KEY = get_secret("third-party-api-key")
Secret Manager のアンチパターン
  1. 毎リクエストで access_secret_version を呼ぶ → コスト・レイテンシ・API クォータ問題。起動時に1回だけ取得しメモリにキャッシュが正解
  2. 環境変数経由で Cloud Build からビルド時に注入 → ビルドログに残るリスク。ランタイム取得が安全
  3. シークレットをコードリポジトリに encrypted/ フォルダで管理 → Secret Manager に移行すべき
  4. ローテーション戦略がない → 漏洩時のリスクが時間とともに増大。少なくとも 90日に1回のローテーションを CI で自動化
ローテーション自動化パターン
  1. Cloud Scheduler が定期的に Pub/Sub に publish
  2. Pub/Sub が Cloud Function を起動
  3. Cloud Function が新シークレット生成 + DB のパスワードを変更 + Secret Manager の新バージョンを add
  4. アプリは latest 参照なので次回起動から自動で新バージョンを使う
  5. Secret Manager の rotation policy で次回ローテーション時刻を Pub/Sub に通知させる

Identity-Aware Proxy(IAP)深掘り

「既存のアプリにコード変更なしで認証を追加する」シナリオの定番解答

ユーザー Google アカウント HTTP(S) LB + IAP 有効化 未認証 → ログイン画面 認証成功 → IAM 確認 バックエンド Cloud Run / GKE Compute Engine App Engine / オンプレ JWT ヘッダ アプリで検証 X-Goog-IAP- JWT-Assertion 公開鍵で検証 IAM: roles/iap.httpsResourceAccessor が必要
図5: IAP の認証フロー。HTTP(S) LB の前段で Google アカウント認証 + IAM チェック、バックエンドには JWT で渡る。

IAP のサポート対象

IAM ロール

# ユーザーに IAP アクセスを許可
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:alice@example.com" \
  --role="roles/iap.httpsResourceAccessor"

# グループに付与(推奨)
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="group:engineers@example.com" \
  --role="roles/iap.httpsResourceAccessor"

# Service Account からの呼び出しを許可(Cloud Tasks 等から)
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:caller@project.iam.gserviceaccount.com" \
  --role="roles/iap.httpsResourceAccessor"

バックエンドでの JWT 検証

from google.auth.transport import requests
from google.oauth2 import id_token

EXPECTED_AUDIENCE = "/projects/PROJECT_NUMBER/global/backendServices/BACKEND_ID"

def verify_iap_jwt(request):
    jwt = request.headers.get("X-Goog-IAP-JWT-Assertion")
    if not jwt:
        raise ValueError("Missing IAP JWT")
    payload = id_token.verify_token(
        jwt,
        requests.Request(),
        audience=EXPECTED_AUDIENCE,
        certs_url="https://www.gstatic.com/iap/verify/public_key",
    )
    return payload["email"]  # 認証済みユーザーのメール
IAP の致命的な落とし穴
  1. バックエンドが LB をバイパスして直接アクセス可能だと、IAP が無意味になる。VPC Firewall で LB の Google IP からのみ許可、または Cloud Run なら --ingress=internal-and-cloud-load-balancing を設定
  2. Compute Engine の同一 VM 内からのアクセスは IAP を通らない(localhost 経由)
  3. JWT 検証なしでヘッダのメールを信用すると、ヘッダ偽装で他人になりすませる。必ず verify_token を実装
  4. IAP 有効化前に IAM を付与しないと自分も入れない。先に roles/iap.httpsResourceAccessor を自分に付与
公式リファレンス IAP concepts / Signed headers verification

Binary Authorization 深掘り

サプライチェーン攻撃対策として 2026改訂で重要度が上昇。attestor / attestation / provenance の関係を正確に理解する。

① Cloud Build イメージビルド provenance 生成 SLSA L3 相当 ② Artifact Analysis 脆弱性スキャン HIGH/CRITICAL チェック ③ Attestation 作成 attestor 署名 Cloud KMS 鍵 ④ Artifact Registry イメージ + 署名 保存 ⑤ デプロイ要求 Cloud Run / GKE ⑥ Binary Auth 検証 attestation OK? ⑦ デプロイ許可 未署名 → BLOCK
図6: Binary Authorization の全フロー。Cloud Build の provenance → Artifact Analysis スキャン → attestor 署名 → デプロイ時に検証。

用語の正確な意味

用語定義例え
Attestor署名する権威主体(KMS 鍵 + Container Analysis Note)身分証発行機関
Attestation「このイメージは検証済み」という署名付きステートメント身分証カード
Provenance「誰が・どのソースから・どのビルダーで作った」の証跡(SLSA)製品の製造記録
NoteContainer Analysis の attestation スキーマ定義身分証の様式定義

ポリシーの構成要素

# Binary Authorization Policy (gcloud で apply)
defaultAdmissionRule:
  evaluationMode: REQUIRE_ATTESTATION
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
  requireAttestationsBy:
    - projects/PROJECT_ID/attestors/prod-attestor

clusterAdmissionRules:
  "us-central1.prod-cluster":
    evaluationMode: REQUIRE_ATTESTATION
    enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    requireAttestationsBy:
      - projects/PROJECT_ID/attestors/prod-attestor
      - projects/PROJECT_ID/attestors/vulnerability-attestor

# 開発環境は緩く
istioServiceIdentityAdmissionRules:
  "us-central1.dev-cluster":
    evaluationMode: ALWAYS_ALLOW
    enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG

enforcementMode の3モード

ENFORCED_BLOCK_AND_AUDIT_LOG

違反時はデプロイ拒否 + 監査ログ記録。本番推奨

DRYRUN_AUDIT_LOG_ONLY

違反でもデプロイは許可、監査ログだけ記録。導入時の検証で使う

ALWAYS_ALLOW / ALWAYS_DENY

固定挙動。テスト用、または攻撃時のロックダウン

break-glass(緊急 bypass) 本番障害時にどうしても未署名イメージをデプロイする必要がある場合、Pod アノテーション alpha.image-policy.k8s.io/break-glass: "true" で一時的に bypass 可能(GKE)。ただし監査ログに 明確に記録されるので、運用ルールで承認フローを定義しておく。
Binary Authorization の落とし穴
  1. 導入時にいきなり ENFORCED にすると、既存ワークロードがデプロイ不能になる。必ず DRYRUN_AUDIT_LOG_ONLY から始めて、すべての違反を解消してから ENFORCED に
  2. attestor を作っただけでは署名されない。Cloud Build のステップで明示的に gcloud container binauthz attestations sign-and-create を実行する必要がある
  3. Artifact Registry のリージョン跨ぎで attestation が見つからなくなることがある(同一プロジェクト内なら問題ない)
  4. Cloud Run と GKE で構成方法が異なる(Cloud Run はサービス単位、GKE はクラスター単位)
公式リファレンス Binary Authorization overview / SLSA levels

1.3 データの保存とアクセス

ストレージ意思決定ツリー(最頻出)

PCD の選択肢で最も問われる「ストレージの選定」。下のツリーを声に出して即答できるレベルが必要。

Q1: 構造化データか?
YES(テーブル形式)→ Q2 へ
NO(非構造化)→ Q5 へ
Q2: トランザクション(ACID)必要?
YES → Q3 へ
NO(OLAP)→ BigQuery
Q3: グローバル分散・強整合(外部一貫性)必要?
YES → Spanner 一択
NO(リージョナルでOK)→ Q4 へ
Q4: PostgreSQL 互換 + 高性能 + AI/ML 拡張が必要?
YES → AlloyDB
NO(MySQL/PG/SQL Server で普通の OLTP)→ Cloud SQL
Q5: アクセスパターンは?
ドキュメント・モバイル/Web 同期 → Firestore
ペタバイト・時系列・低レイテンシ → Bigtable
BLOB・静的アセット・バックアップ → Cloud Storage
キャッシュ・セッション → Memorystore

各サービスの詳細比較

サービス整合性スケールレイテンシ典型単価感キーワード
Cloud SQL強(リージョナル)垂直 + Read Replica低(数 ms)低〜中MySQL / PG / SQL Server
AlloyDB強(リージョナル)垂直 + 列指向 Read低(< 数 ms)中〜高PG 互換、4倍性能、AI/ML
Spanner強(グローバル、外部一貫性)水平(無限)10〜数十 msグローバル、TrueTime、無停止
Firestore強(単一文書)自動水平従量ドキュメント、リアルタイム同期
Bigtable結果整合水平(ペタバイト)ミリ秒中〜高ワイドカラム、時系列、IoT
Cloud Storage強(書き込み後 read)無限数十〜百 msBLOB、ストレージクラス
BigQuery強(クエリ)無限(サーバーレス)秒〜分クエリ + ストレージOLAP、SQL、ML
Memorystore垂直(HA)サブミリ秒キャッシュ、Redis/Memcached
出題されがちな誤選択
  1. 「グローバル分散の RDB」→ Cloud SQL Multi-region と答える罠(リージョナル)。正解は Spanner
  2. 「ペタバイトの IoT 時系列」→ BigQuery と答える罠(OLAP で書き込みスループット不足)。正解は Bigtable
  3. 「リアルタイムチャット」→ Cloud SQL と答える罠(同期通信オーバーヘッド)。正解は Firestore
  4. 「PostgreSQL 互換で高性能」→ Cloud SQL と答える罠(標準性能)。正解は AlloyDB

Signed URL 深掘り

Cloud Storage への 一時的なアクセス権を URL に焼き込む機能。IAM 設定変更なしでアクセス委譲できる。

V2 vs V4 の違い

V2(旧)

  • HMAC-SHA1 ベース
  • 有効期限の指定が複雑
  • 新規利用は非推奨

署名に使う鍵

標準的なパターン。Cloud Storage Client Library が自動で SA の private key を使って署名。

from google.cloud import storage
from datetime import timedelta

client = storage.Client()
bucket = client.bucket("my-bucket")
blob = bucket.blob("uploads/file.bin")

url = blob.generate_signed_url(
    version="v4",
    expiration=timedelta(minutes=15),
    method="PUT",   # アップロード用
    content_type="application/octet-stream",
)
# url を返す → クライアントが直接 PUT
SA 鍵の制約 Cloud Run / Cloud Functions 等のサーバーレスでは SA の private key を直接持っていない。impersonate_service_account または iam.serviceAccounts.signBlob 権限を持つ SA を介して署名する必要がある。

HMAC キーは「ユーザーアカウント」または「Service Account」に紐付くアクセスキー + 秘密鍵のペア。AWS の Access Key と概念は同じ。

  • 主に AWS S3 互換クライアント(boto3 等)から GCS にアクセスする時に使う
  • Signed URL の独自実装には可能だが、通常は SA 鍵パターンの方が安全

HTTP メソッド対応

ユースケース

① Direct Upload

モバイルアプリから直接 GCS にアップロード(バックエンドの帯域節約)

② 限定公開ダウンロード

「24時間有効な PDF ダウンロードリンク」

③ 一時的 API 連携

パートナー企業に特定オブジェクトへの一時アクセスを付与

Signed URL の落とし穴
  1. 有効期限の最大は 7日(604,800 秒)。それ以上は IAM で恒久付与する
  2. サーバの時刻ずれで署名が「未来時刻」または「期限切れ」と扱われる。NTP 同期必須
  3. URL 自体が権限を持つため、URL を公開してはいけない(HTTPS で配信、ログに残さない)
  4. 署名する SA に対象オブジェクトへの IAM 権限がないと、URL は発行できても 403 で失敗する
  5. X-Goog-* ヘッダの偽装防止のため SignedHeaders に Content-Type 等を含めるのが安全
公式リファレンス Cloud Storage Signed URLs / V4 signing details

🚨 事故ケース集(postmortem 形式)

設計フェーズで犯した誤りは本番で重大事故に発展します。ここでは Section 1 で扱う各サービス(Cloud Run / GKE / WIF / IAM / Secret Manager / IAP / Binary Authorization / Spanner / Bigtable / Memorystore / Signed URL)について、「症状 → 原因 → 影響 → 復旧 → 予防」の postmortem 形式で典型事故パターンを整理します。試験では「なぜそれがダメか」を問う問題の素材になります。
CASE 1.1 Cloud Run SEV-HIGH

min-instances=0 のままバックグラウンド処理を設計 → メモリ内キャッシュが消えてキャッシュヒット率激減

▼ 症状

本番リリース後、レイテンシ p99 が 200ms → 2,000ms に悪化。Cloud SQL の負荷が 3倍に。ユーザーから「画面表示が遅い」「タイムアウトする」の苦情が殺到。

▼ 原因
  • アプリは「起動時に DB から設定をロードしメモリに保持」する設計
  • min-instances=0 のため、トラフィックが少ない時間帯に全インスタンスが終了
  • 新リクエストでコールドスタート → 起動毎に DB クエリ + キャッシュ再構築
  • 結果、キャッシュヒット率が 95% → 30% に低下、DB が過負荷
▼ 影響

4時間にわたって SLO 違反(可用性 99.5% → 88.2%)。Cloud SQL の追加コスト約 $300/日。エンジニアリングチーム5名が緊急対応。

▼ 復旧手順
  1. 緊急で gcloud run services update --min-instances=3
  2. Cloud Monitoring でレイテンシ回復を確認(15分)
  3. Memorystore でアプリ外キャッシュに切り替え(恒久対応)
▼ 予防策
  • 公式ガイドの「バックグラウンドタスクがある場合は min-instances ≥ 1」を遵守
  • 状態は外部キャッシュ(Memorystore)に外出し
  • 負荷試験で「コールドスタート時の p99」を本番条件で測定
  • SLO アラート(p99 latency 閾値超過)を設定し早期検知
CASE 1.2 Cloud Run SEV-CRITICAL

concurrency=80 のままで CPU 重い処理を実装 → メモリ枯渇で OOM 連鎖、サービス全停止

▼ 症状

新機能(PDF 生成)リリース後、サービスが応答しなくなった。Cloud Logging で "Container terminated due to OOM" が連発。max-instances 上限まで増えても応答せず。

▼ 原因
  • concurrency=80(デフォルト)のまま PDF 生成(1リクエストで 300MB メモリ消費)を実装
  • 1インスタンスで 80並列 = 24GB 要求だが、メモリ 1GB しか設定していない
  • OOM Killer がコンテナを殺す → 別インスタンスに振り分け → そこも OOM の連鎖
  • Cloud Run はメモリ使用率ではスケールしないため、いくらインスタンスが増えても解消しない
▼ 影響

サービス全停止 45分。注文処理停止により売上機会損失 約 $50K。SLA 違反で顧客への補償発生。

▼ 復旧手順
  1. PDF 生成エンドポイントを別の Cloud Run Service に分離
  2. 分離したサービスを --concurrency=1 --memory=2Gi で再デプロイ
  3. 本体サービスは元の concurrency=80 で動作確認
▼ 予防策
  • CPU/メモリの重い処理は別 Cloud Run Service に分離(concurrency=1〜4)
  • 負荷試験でメモリプロファイル測定、最大同時消費 × concurrency < memory limit を確認
  • Cloud Run の OOM メトリクスにアラート(短期間で複数回 OOM)
  • あるいはバッチ処理に切り出して Cloud Run Jobs で実行
CASE 1.3 Workload Identity Federation SEV-CRITICAL

WIF の attribute-condition 未設定 → 任意の GitHub リポジトリから GCP 本番にアクセス可能

▼ 症状

セキュリティチームの監査で「GitHub Actions の OIDC Pool が任意のリポジトリから利用可能」と指摘。Cloud Audit Logs を調査すると、過去2週間で外部の不審な GitHub Actions(パブリックリポジトリ)から GCP の Secret Manager に複数回アクセス試行があった(成功は未確認)。

▼ 原因
  • Workload Identity Provider 作成時に --attribute-condition を指定しなかった
  • 結果、GitHub の OIDC トークンを発行できる世界中のすべてのリポジトリがこの Pool 経由で SA を借用できる状態
  • 攻撃者は自分のリポジトリで GitHub Actions を実行し、その OIDC トークンで Pool に認証可能
  • Confused Deputy Problem の典型例
▼ 影響

幸い実際のアクセスは未遂で済んだが、SA に roles/secretmanager.secretAccessor が付与されていたため、悪用されれば全シークレットが漏洩していた。インシデントレスポンスとフォレンジック調査に 1週間。

▼ 復旧手順
  1. Provider に --attribute-condition="assertion.repository=='my-org/my-repo'" を即時追加
  2. 過去のシークレットを全ローテーション
  3. Cloud Audit Logs を全期間スキャンし、不審アクセスを特定
▼ 予防策
  • WIF Provider 作成時に 必ず attribute-condition で repo / org に制限
  • 環境ごと(dev / staging / prod)に別 Pool を作成
  • Terraform / IaC モジュールで Pool/Provider を作成し、attribute-condition を必須化
  • Security Command Center で Workload Identity Federation の構成不備を継続監視
CASE 1.4 IAM / Service Account SEV-CRITICAL

サービスアカウントキー JSON を GitHub Public リポジトリに誤コミット → 暗号資産マイニング攻撃

▼ 症状

朝起きたら GCP 請求額が前日比 5倍。Compute Engine で見覚えのない VM が数十台稼働中。CPU が 100% で gpu インスタンスも複数。

▼ 原因
  • 新人エンジニアが SA Key JSON を config/ ディレクトリに置き、誤って Public リポジトリに push
  • GitHub 公開後 12分でクローラー bot が Key を発見(公開鍵スキャナ)
  • SA に roles/compute.admin が付与されていた → Compute Engine 起動権限
  • 暗号資産マイニング目的で大量の VM を起動された
▼ 影響

1日で約 $15,000 の不正課金。GCP の Billing Alert が遅れて発見が翌朝に。Google Cloud サポートに不正利用申告し、最終的に課金は免除されたが、対応期間中の他業務停止コストは回収不能。

▼ 復旧手順
  1. 即時: 漏洩 Key を gcloud iam service-accounts keys delete で無効化
  2. 該当 SA を一旦完全削除
  3. 不正な VM を停止 + ファイアウォール強化
  4. GitHub の git history から Key を完全消去(BFG Repo-Cleaner)
  5. Cloud Support に不正利用申告
▼ 予防策
  • SA Key を発行しない運用に切り替え:WIF / Workload Identity / ADC を使う
  • Organization Policy constraints/iam.disableServiceAccountKeyCreation で SA Key 発行を禁止
  • pre-commit hook(gitleaks / truffleHog)でシークレット混入を検知
  • GitHub Push Protection(secret scanning)を有効化
  • Billing Budget Alert を実額/予測の両方で設定(閾値 $100 / 日)
CASE 1.5 Secret Manager SEV-MEDIUM

毎リクエストで access_secret_version を呼び続け、Quota Exhausted で 503 多発

▼ 症状

負荷試験中に Cloud Run が 503 を返し始める。Cloud Logging に Quota exceeded: secretmanager.googleapis.com/access_requests が大量出力。

▼ 原因
  • DB パスワードを毎リクエストで Secret Manager から取得するコード
  • 負荷試験で 6,000 RPS → 同時に 6,000 req/s の access_secret_version
  • Secret Manager の Quota(プロジェクト全体で毎分 6,000 read)を瞬時に枯渇
  • Quota exhausted → 503 でサービス全停止
▼ 影響

負荷試験環境で発見できたため本番影響なし。だが、本番でセール時のスパイクで同じ事象を起こす可能性が判明。

▼ 復旧手順
  1. アプリ起動時に1回だけ Secret を取得 → メモリに保持
  2. ローテーション対応として、SIGHUP シグナルで再読込
▼ 予防策
  • Secret Manager は起動時に1回だけ取得しメモリ保持
  • または Cloud Run の --update-secrets でランタイム注入(環境変数 or ボリューム)
  • ローテーション時はインスタンス再起動で対応
  • Secret Manager のaccess quota メトリクスに監視を設定
CASE 1.6 IAP / Cloud Load Balancing SEV-CRITICAL

IAP の前段 LB をバイパスして直接 Cloud Run に到達可能 → 認証回避された

▼ 症状

ペンテスターから「IAP の保護を完全にバイパスできた」と報告。Cloud Run の *.run.app ドメインに直接アクセスすれば、IAP の認証を通らず内部 API が叩けた。

▼ 原因
  • Cloud Run の --ingress=all(デフォルト)のまま IAP を構成
  • HTTP(S) LB + IAP を前段に置いたが、Cloud Run のデフォルト *.run.app URL は誰でもアクセス可能のまま
  • 「URL は公開されていないから安全」という Security through Obscurity に依存
  • URL は Cloud Run の API でリストアップ可能 + Subdomain Enumeration で発見される
▼ 影響

本番リリース前にペンテストで発見できたため実害なし。ただし本番で発生していれば内部 API が完全に晒される構成だった。

▼ 復旧手順
  1. Cloud Run を --ingress=internal-and-cloud-load-balancing に変更
  2. 結果として LB 経由でなければ到達不能になる
  3. 追加で Cloud Run service の IAM で roles/run.invoker を LB の SA のみに付与
▼ 予防策
  • IAP を構成する Cloud Run は必ず --ingress=internal-and-cloud-load-balancing
  • Cloud Run の IAM で --no-allow-unauthenticated も併用(多層防御)
  • Compute Engine の場合は VPC Firewall で LB の Google IP からのみ ingress 許可
  • 定期的なペネトレーションテストで bypass 可能性を検証
CASE 1.7 Spanner SEV-HIGH

連番 ID を主キーに使用 → 書き込みが1ノードに集中、Spanner の本来の性能が出ない

▼ 症状

Spanner を導入したが、書き込み TPS が想定の 10% しか出ない。クエリの p99 が 500ms に悪化。Spanner Studio の Hot Spotter で「特定 split が 80% のトラフィックを処理」を確認。

▼ 原因
  • テーブル主キーに BIGINT AUTO_INCREMENT 的な単調増加 ID を採用
  • 新規挿入が常に「最大 ID の次」 → 同一 split(ノード)に集中
  • Spanner はキー範囲で自動シャーディングするが、連番 ID では分散できない
  • 結果、Spanner の本来の水平スケール性能が出ない
▼ 影響

移行プロジェクト全体の見直し。3週間の追加工数。本番リリース延期。

▼ 復旧手順
  1. 主キーを UUID v4 または hash(timestamp + entity_id) に変更
  2. 必要なら hash(...)|original_id の複合キーで「ハッシュプレフィックス」を導入
  3. データ移行スクリプトを書き直し再ロード
▼ 予防策
  • Spanner の主キーは常に分散的な値(UUID, ハッシュプレフィックス, リバースタイムスタンプ)
  • 連番 ID は禁忌(RDB から移行時の最頻出ミス)
  • Spanner Studio の Hot Spotter で定期的に分散状況をチェック
  • 負荷試験でホットスポット発生を検出
CASE 1.8 Bigtable SEV-HIGH

IoT センサーのタイムスタンプをそのまま行キーに → 書き込みが1タブレットに集中

▼ 症状

IoT データ取り込み中、書き込みエラー RESOURCE_EXHAUSTED が発生。Bigtable の CPU が一部ノードで 100%、他は 5% という不均衡。

▼ 原因
  • 行キーを {timestamp} のままにした("2026-05-28T12:00:00Z...")
  • 最新時刻への書き込みが常に「最後のタブレット」に集中
  • Bigtable は行キー順でタブレット分散するため、単調増加キーは典型的ホットスポット
▼ 影響

IoT データの 30% が書き込みエラー → デッドレターキューに溜まる。後追いで再投入したが、リアルタイム集計の遅延発生。

▼ 復旧手順
  1. 行キーを {device_id_hash_4byte}#{reverse_timestamp}#{device_id} に変更
  2. 新スキーマでテーブル再作成 + データ再投入
  3. Key Visualizer で分散確認
▼ 予防策
  • Bigtable は行キー設計が 90%。設計前に Google の Designing your schema ガイドを必読
  • タイムスタンプをキーに含める時はReverse Timestamp + Salting
  • Bigtable Key Visualizer で常にホットスポット監視
  • 本番投入前に実データに近い負荷で分散テスト
CASE 1.9 Memorystore (Redis) SEV-HIGH

キャッシュ TTL 満了の瞬間に DB 殺到(Cache Stampede / Thundering Herd)

▼ 症状

毎日 12:00 ちょうどに Cloud SQL の CPU が 100% に張り付き、5分間 API が応答停止。Cloud Logging に「DB connection timeout」が大量。

▼ 原因
  • 朝 11:00 に全データを一括キャッシュ(TTL=3600s = 1時間)
  • 12:00 ちょうどに同時に全キャッシュが Expire
  • その瞬間、数千の Cloud Run インスタンスが一斉に DB へ問い合わせ(Thundering Herd)
  • Cloud SQL の max_connections に到達 → 新規接続拒否 → サービス停止
▼ 影響

毎日 12:00 - 12:05 まで API が 503 を返す再発障害として 2週間継続。発見が遅れたのは「営業時間内だが利用ピーク前」の時間帯だったため。

▼ 復旧手順
  1. 各キーの TTL にランダムジッターを追加(TTL = base + random(0, 600))
  2. Probabilistic Early Expiration を実装(XFetch アルゴリズム)
  3. 緊急時用に Stale-While-Revalidate パターン(古いデータを返しつつ非同期更新)
▼ 予防策
  • キャッシュ TTL は必ずジッター追加(同時 Expire を避ける)
  • 大量同時 Miss 対策に Lock + Refresh パターン(1プロセスだけが DB を叩く)
  • Memorystore の maxmemory-policyallkeys-lru に設定し、突発負荷でも安全に
  • 負荷試験で「TTL Expire 直後」のシナリオも含める
CASE 1.10 Cloud Storage / Signed URL SEV-HIGH

有効期限 7日の Signed URL を Slack で共有 → ログから抽出されて社外流出

▼ 症状

顧客から「他社の社内資料っぽい PDF が、社外サイトに公開されている」と通報。調査すると、自社の GCS バケットへの Signed URL が GitHub の Public Gist にコピーされていた。

▼ 原因
  • 営業担当が機密 PDF を Signed URL(有効期限 7日)で生成し、Slack で取引先に共有
  • 取引先がその URL を、無関係なツールの動作確認のためにテストとして GitHub Gist に貼り付け(Public)
  • Signed URL はURL そのものが権限。IAM 不要でアクセス可能
  • クローラ bot が Gist を発見 → ダウンロード → 公開サイトに転載
▼ 影響

機密文書1件の社外流出。法務対応 + 顧客への謝罪。情報漏洩インシデントとして個人情報保護委員会への報告検討。

▼ 復旧手順
  1. 該当オブジェクトを Cloud Storage から削除(既存 Signed URL も無効化)
  2. 署名に使った SA の Key を rotation
  3. Cloud Logging で過去アクセスを調査、外部からの DL 元 IP を特定
▼ 予防策
  • Signed URL の有効期限を最小化(数時間 → 15分など)
  • 機密度の高いオブジェクトは Signed URL ではなく IAM + 期間限定アクセス(Conditional IAM)
  • 共有経路を限定(社内 Drive / IAP 越しの専用ダウンロードポータル)
  • Signed URL アクセスログを Cloud Logging で全捕捉、異常な IP を監視
  • 機密文書には DLP(Data Loss Prevention)で透かしや分類タグ付与
🎯 セクション1 事故ケースの学び これらの事故はすべて「設計フェーズの判断ミス」が根本原因です。試験では「このシナリオで誤った設計選択は?」「このリスクを回避する仕組みは?」という形で問われます。事故パターンを覚えれば、誤った選択肢を即座に消去できます。

セクション1 試験戦略まとめ

🎯 32%を確実に取るためのポイント
  1. ストレージ意思決定ツリーを3秒で即答できるレベル
  2. Cloud Run vs GKE の判断軸(ステートレス / GPU / StatefulSet / 運用負荷)を言語化
  3. Pub/Sub vs Cloud Tasks vs Workflows vs Eventarc の使い分けキーワード
  4. 認証 5シナリオ(ADC / Workload Identity / WIF / IAP / Identity Platform)
  5. 「Service Account Key を発行する」選択肢は ほぼ常に不正解
  6. 「環境変数にシークレット」「`:latest` でデプロイ」「Owner ロール」はほぼ常に不正解
問題文の読み方のコツ 問題文は実務シナリオが書かれているので、キーワード抽出でほぼ正解にたどり着けます。
  • ステートレス」「運用負荷最小」「スケール 0」 → Cloud Run
  • GPU」「細粒度の Pod 制御」「StatefulSet」 → GKE
  • SA Key を発行したくない」「外部 IdP」 → WIF
  • 既存アプリにコード変更なし」「Google アカウント認証」 → IAP
  • グローバル分散」「強整合」 → Spanner
  • ペタバイト」「時系列」「ミリ秒」 → Bigtable
  • 未署名イメージのデプロイ阻止」 → Binary Authorization
📘 基礎 (MD) 🔧 応用 (MD) 🎯 要点と暗記 (MD)
← ホームへ セクション2 構築とテスト →