セクション3:デプロイ用クラウドネイティブアプリの構成
公式試験ガイド 042426版 — Section 3: Configuring cloud-native applications for deployment
3.1 Cloud Run へのデプロイ
Cloud Run の 3形態
Cloud Run Services
- HTTP/gRPC リクエスト駆動
- 常時稼働(min-instances 設定可)
- リビジョン管理、トラフィック分割
- HTTPS 自動付与(
*.a.run.app) - タイムアウト最大 60分
Cloud Run Jobs
- HTTP リクエスト不要
- バッチ実行(タスク数、並列数を指定)
- タイムアウト最大 24時間
- Cloud Scheduler / Workflows / Eventarc で起動
Cloud Run Functions
- 関数単位デプロイ(旧 Cloud Functions の後継)
- Cloud Run の基盤上で動作
- Eventarc / Pub/Sub / HTTP トリガ
Cloud Run リビジョン詳細
リビジョンとは
Cloud Run Service へのデプロイ・設定変更のたびに、イミュータブル(変更不可)なリビジョンが生成される。トラフィックを複数リビジョン間で分割できるため、canary / blue-green / A/B が標準機能で実現可能。
traffic split のシナリオ別コマンド
# Step 1: 新リビジョンを 0% でデプロイ + canary タグ
gcloud run deploy my-api \
--image=us-central1-docker.pkg.dev/PROJECT/repo/app:v2 \
--no-traffic --tag=canary --region=us-central1
# Step 2: 10% に振る
gcloud run services update-traffic my-api \
--to-tags=canary=10 --region=us-central1
# 監視 (Cloud Monitoring) で問題なければ拡大
gcloud run services update-traffic my-api --to-tags=canary=25 --region=us-central1
gcloud run services update-traffic my-api --to-tags=canary=50 --region=us-central1
gcloud run services update-traffic my-api --to-tags=canary=100 --region=us-central1
# canary=100 になると古いリビジョンは 0%、実質「全展開」完了
# 異常検知 → 即座に旧リビジョンに 100% 戻す
gcloud run services update-traffic my-api \
--to-revisions=my-api-00001-abc=100 \
--region=us-central1
# または LATEST タグで「直前」に戻す
gcloud run services update-traffic my-api \
--to-revisions=LATEST=0 \
--region=us-central1
# 任意の % 配分(複数リビジョン同時)
gcloud run services update-traffic my-api \
--to-revisions=my-api-00001-abc=50,my-api-00002-def=30,my-api-00003-ghi=20 \
--region=us-central1
# タグを付けると、固定 URL で特定リビジョンにアクセス可
gcloud run services update-traffic my-api \
--set-tags=canary=my-api-00003-ghi,prod=my-api-00002-def \
--region=us-central1
# 結果:
# - https://canary---my-api-xxx.a.run.app → リビジョン v3
# - https://prod---my-api-xxx.a.run.app → リビジョン v2
# トラフィック % とは独立した URL なので、A/B テスト用クライアントから明示的にどちらかにアクセス可能
- デプロイ: Cloud Build で
--no-traffic --tag=canaryでデプロイ - 段階展開: 10% → Cloud Monitoring で error rate / p99 latency を観察
- SLO アラート: 5分間 error rate > 1% で Cloud Function を起動
- 自動ロールバック: Cloud Function が
update-traffic --to-revisions=PREVIOUS_REV=100実行 - 通知: Slack / Pub/Sub に通知
- 1 Service あたり最大 1,000 リビジョン。超えると古いリビジョンが自動削除される
- トラフィックを受けるリビジョンは削除不可。0% に下げてから削除
- min-instances=1 でリビジョンを残すと idle 課金が発生し続ける
- 環境変数を更新すると新リビジョンが作られる。誤って 100% を新リビジョンに振らないよう注意
Eventarc / Pub/Sub Push トリガ
Eventarc から Cloud Run を起動
gcloud eventarc triggers create my-trigger \
--location=us-central1 \
--destination-run-service=my-service \
--destination-run-region=us-central1 \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=my-bucket" \
--service-account=eventarc-trigger-sa@PROJECT.iam.gserviceaccount.com
主要なイベントタイプ
| イベント | 用途 |
|---|---|
google.cloud.storage.object.v1.finalized | GCS にオブジェクトが置かれた |
google.cloud.storage.object.v1.deleted | GCS オブジェクト削除 |
google.cloud.pubsub.topic.v1.messagePublished | Pub/Sub publish 検知 |
google.cloud.audit.log.v1.written | Cloud Audit Log 任意(最も柔軟) |
google.cloud.firestore.document.v1.written | Firestore 書き込み |
Pub/Sub Push Subscription での起動
# 1. Cloud Run Service(認証必須)をデプロイ
gcloud run deploy my-handler --image=... --no-allow-unauthenticated --region=us-central1
# 2. Pub/Sub 用 SA 作成 + Cloud Run 呼び出し権限
gcloud iam service-accounts create cloud-run-pubsub-invoker
gcloud run services add-iam-policy-binding my-handler \
--member=serviceAccount:cloud-run-pubsub-invoker@PROJECT.iam.gserviceaccount.com \
--role=roles/run.invoker --region=us-central1
# 3. Pub/Sub サービスエージェントに Token 発行権限
PROJECT_NUMBER=$(gcloud projects describe PROJECT --format='value(projectNumber)')
gcloud projects add-iam-policy-binding PROJECT \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com \
--role=roles/iam.serviceAccountTokenCreator
# 4. Push Subscription 作成
SERVICE_URL=$(gcloud run services describe my-handler --region=us-central1 --format='value(status.url)')
gcloud pubsub subscriptions create my-sub \
--topic=my-topic \
--push-endpoint=${SERVICE_URL}/push \
--push-auth-service-account=cloud-run-pubsub-invoker@PROJECT.iam.gserviceaccount.com
- 2021/4/8 以前に作成されたプロジェクトでは、Pub/Sub サービスエージェントに
roles/iam.serviceAccountTokenCreatorを明示的に付与する必要がある - Cloud Run が 200/204 を返す前に処理を完了しないと再配信される
- Push subscription は at-least-once のみ。Exactly-once が必要なら Pull subscription に変更
- Cloud Run の HTTP timeout(最大 60分)を超える処理は Pub/Sub から再配信され続ける → 設計を見直す
- Push endpoint の URL に
?token=xxxのようなシークレットを URL に入れない(Pub/Sub のログに残る)
Cloud Run Jobs(バッチ処理)
HTTP リクエスト不要、最大 24時間、並列実行可能なバッチ実行環境。Cloud Run Service と同じ基盤だが用途が異なる。
# ジョブ定義
gcloud run jobs deploy my-batch \
--image=us-central1-docker.pkg.dev/PROJECT/repo/batch:v1 \
--region=us-central1 \
--task-count=100 \ # 100 並列タスク
--parallelism=10 \ # 同時実行は 10
--max-retries=3 \ # 失敗時のリトライ
--task-timeout=30m \ # 1タスクの最大時間
--service-account=batch-sa@PROJECT.iam.gserviceaccount.com
# 実行
gcloud run jobs execute my-batch --region=us-central1 --wait
# 実行履歴
gcloud run jobs executions list --job=my-batch --region=us-central1
タスク並列化(CLOUD_RUN_TASK_INDEX)
# 各タスクが受け取る環境変数
import os
task_index = int(os.environ["CLOUD_RUN_TASK_INDEX"]) # 0, 1, 2, ... task_count-1
task_count = int(os.environ["CLOUD_RUN_TASK_COUNT"]) # 全タスク数
attempt = int(os.environ["CLOUD_RUN_TASK_ATTEMPT"]) # リトライ回数
# 例: 1000件のファイルを 100タスクに分散
files = list_files()
chunk_size = len(files) // task_count
my_files = files[task_index * chunk_size : (task_index + 1) * chunk_size]
for f in my_files:
process(f)
Cloud Scheduler で定時起動
# 毎日深夜 2時に Cloud Run Job を起動
gcloud scheduler jobs create http my-nightly-batch \
--schedule='0 2 * * *' \
--time-zone='Asia/Tokyo' \
--uri="https://us-central1-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/PROJECT/jobs/my-batch:run" \
--http-method=POST \
--oauth-service-account-email=scheduler-sa@PROJECT.iam.gserviceaccount.com \
--oauth-token-scope=https://www.googleapis.com/auth/cloud-platform
Cloud Run Jobs を選ぶシーン
- 定時バッチ(日次集計、レポート生成)
- 並列処理(1万ファイル × 並列10)
- DB マイグレーション
- 処理時間 24h 以内
Cloud Run Service を選ぶシーン
- HTTP リクエストで起動
- 処理時間 60分以内
- 外部からのリクエストに応答
GKE CronJob を選ぶシーン
- StatefulSet が必要
- GPU 必須
- K8s 既存資産の活用
Apigee による API 管理
Cloud Run / GKE の前段に置く、エンタープライズ API 管理プラットフォーム。
| 機能 | Apigee | Cloud API Gateway(軽量版) |
|---|---|---|
| OAuth2 / API キー認証 | ✅ | ✅ |
| レート制限 / Quota | ✅ 細粒度 | ✅ 基本 |
| API バージョニング | ✅ | 限定 |
| API 収益化(Billing) | ✅ | ❌ |
| 開発者ポータル | ✅ | ❌ |
| Analytics ダッシュボード | ✅ | 限定 |
| 変換(Mediation) | ✅ XSLT、JS、Java callout | ❌ |
| 価格帯 | $$$ エンタープライズ | $ 安い |
| 典型ユースケース | BtoB API、API as a Product | シンプルな API ゲートウェイ |
- 「API を商品として売る」「開発者ポータル」「パートナーごとの収益化」 → Apigee
- 「軽量な API 認証 + ルーティング」「OpenAPI 仕様で運用」 → Cloud API Gateway
- 「HTTPS 終端 + Cloud Run」だけなら、HTTP(S) Load Balancing のみで十分
3.2 GKE へのデプロイ
GKE Autopilot vs Standard 完全比較
選択フローチャート
Deployment / Service / Ingress / HPA の組合せ
# Deployment + Service + Ingress 一式
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels: { app: my-app }
template:
metadata:
labels: { app: my-app }
spec:
serviceAccountName: my-ksa # Workload Identity 用
containers:
- name: app
image: us-central1-docker.pkg.dev/PROJECT/repo/app:v1
resources:
requests: { cpu: "100m", memory: "128Mi" }
limits: { cpu: "500m", memory: "256Mi" }
ports:
- containerPort: 8080
livenessProbe:
httpGet: { path: /healthz, port: 8080 }
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet: { path: /ready, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet: { path: /healthz, port: 8080 }
failureThreshold: 30
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
type: ClusterIP
selector: { app: my-app }
ports:
- port: 80
targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
kubernetes.io/ingress.class: "gce"
spec:
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service: { name: my-app, port: { number: 80 } }
ヘルスプローブ 3種 — 役割と挙動
liveness Probe
- 「Pod は生きているか?」
- 失敗 → Pod を再起動
- 過剰だと再起動ループ
/healthz 等の純粋な生存確認。外部依存を含めない。readiness Probe
- 「リクエストを受ける準備できた?」
- 失敗 → Service エンドポイントから除外(再起動しない)
- 初期化中・一時的な過負荷時の保護
/ready で外部依存(DB 接続)も確認startup Probe
- 「起動完了したか?」
- 成功するまで liveness/readiness 開始しない
- 重い初期化(JVM warm-up、ML モデル読み込み)に有用
failureThreshold × periodSeconds で起動時間を確保- liveness の path に DB 接続確認を入れる → DB 一時障害で Pod が全部再起動して連鎖障害
- readiness なし → 起動中の Pod にトラフィックが流れて 5xx 多発
- startup なしで initialDelaySeconds 長すぎ → liveness が成功するまで Pod が殺され続ける
- readiness の periodSeconds を長くしすぎ → 過負荷検知が遅れて雪崩
Horizontal Pod Autoscaler 深掘り
HPA のメトリクスタイプ
| タイプ | 説明 | 例 |
|---|---|---|
| Resource | CPU / メモリ使用率 | cpu: averageUtilization: 70 |
| Pods | Pod 内のカスタムメトリック | HTTP RPS(per pod) |
| Object | Kubernetes オブジェクトのメトリック | Ingress の RPS |
| External | クラスタ外メトリック | Pub/Sub backlog、Cloud Tasks queue |
Pub/Sub backlog で HPA(External Metric)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-worker-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-worker
minReplicas: 2
maxReplicas: 50
metrics:
- type: External
external:
metric:
name: pubsub.googleapis.com|subscription|num_undelivered_messages
selector:
matchLabels:
resource.labels.subscription_id: my-subscription
target:
type: AverageValue
averageValue: "100" # 1 Pod につき backlog 100 を目安
behavior:
scaleUp:
stabilizationWindowSeconds: 30
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 300 # 5分間 idle 確認してから縮小
複数メトリクスの挙動
- 複数メトリクス指定時、HPA は「最大値」を選択してスケール(最も Pod が必要な値)
- いずれかのメトリクスが取得不能 → スケールアップは実行、スケールダウンは停止(安全側)
- behavior で stabilizationWindowSeconds 設定 → 急激な変動を防ぐ
- HPA と VPA を CPU/メモリで併用しない(公式が明確に禁止)。Multidimensional Pod Autoscaling(beta)なら CPU=HPA / メモリ=VPA は可
- Pod の requests が未設定だと、Resource タイプの HPA が動かない
- DaemonSet は HPA 対象外(各ノードに1個固定)
- ReplicaSet ではなく Deployment に HPA を設定する
- External Metric の権限: GKE Workload Identity 経由で Cloud Monitoring API への読み取り権限が必要
GKE Workload Identity
GKE Pod から GCP API を呼ぶ標準パターン。Service Account Key の配布を不要にする。
設定手順(必須3ステップ)
# 1. クラスタで Workload Identity を有効化
gcloud container clusters update my-cluster \
--workload-pool=PROJECT_ID.svc.id.goog --region=us-central1
# 2. GCP SA 作成 + 権限付与
gcloud iam service-accounts create my-gsa
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:my-gsa@PROJECT_ID.iam.gserviceaccount.com \
--role=roles/storage.objectViewer
# 3. KSA 作成 + annotation + GSA 借用許可
kubectl create serviceaccount my-ksa
kubectl annotate serviceaccount my-ksa \
iam.gke.io/gcp-service-account=my-gsa@PROJECT_ID.iam.gserviceaccount.com
gcloud iam service-accounts add-iam-policy-binding \
my-gsa@PROJECT_ID.iam.gserviceaccount.com \
--role=roles/iam.workloadIdentityUser \
--member="serviceAccount:PROJECT_ID.svc.id.goog[default/my-ksa]"
Workload Identity vs Workload Identity Federation
Workload Identity(GKE 内)
- GKE Pod から GCP API を呼ぶ
- 同一プロジェクトの GKE と GSA
- annotation で KSA ↔ GSA
Workload Identity Federation(GCP 外)
- GitHub Actions / AWS / Okta から GCP API
- OIDC / SAML プロバイダから連携
- Pool / Provider / SA 借用
🚨 事故ケース集(postmortem 形式)
liveness probe で DB 接続チェック → Cloud SQL 一時障害で全 Pod が再起動ループ、サービス全停止
Cloud SQL の計画メンテナンス(30秒)が走った瞬間、サービス全体が応答不能に。自動復旧せず、メンテナンス終了後も復活しない。
- liveness probe のパスを
/healthにし、その中で「DB に SELECT 1 を投げる」実装 - Cloud SQL の一時障害で DB クエリ失敗 → liveness 失敗 → Pod 再起動
- すべての Pod が「DB 障害 → liveness 失敗 → 再起動 → またクエリ失敗」のループ
- DB が復旧しても、各 Pod の起動時にも「DB 確認 + 失敗」を繰り返し、ループから抜け出せない
本来 30秒で済むメンテナンスが、サービス全停止 22分に拡大。手動介入で復旧。
- 緊急で liveness probe を一時無効化(
kubectl setで patch) - すべての Pod が起動完了、Service エンドポイント復活
- liveness probe のパスを変更:DB 確認はreadiness probe に移し、liveness は純粋な生存確認のみ
- liveness probe は外部依存を含めない(プロセス内の純粋な「生きている」チェックのみ)
- DB 接続確認はreadiness probe で行う(失敗時は再起動せず、Service から除外のみ)
- readiness が長時間失敗する場合は、PDB と組み合わせて部分的に降格
- カオスエンジニアリングテストで「外部障害時の挙動」を事前検証
過去リビジョンに min-instances=5 が残り続け、idle で課金が膨れ続けた
Cloud Run の請求が想定の 3倍。Cost Explorer で見ると、稼働中の主要 Service ではなく「過去にデプロイしたテスト用 Service」が大きな割合を占めている。
- 負荷試験用に作成した Service で min-instances=5、メモリ 4Gi、CPU 2 を設定
- 負荷試験終了後、その Service を削除し忘れていた
- min-instances=5 のため、トラフィックが 0 でも 5インスタンスが永続稼働 → idle 課金
- 料金的に CPU always-on モードで、毎月約 $500 の浪費
3ヶ月で約 $1,500 の無駄な支出。発見が経理レビューで判明。
- 使用していない Service を
gcloud run services deleteで削除 - 残す Service は min-instances を見直し
- テスト・実験用 Service にラベル
environment=testを必須付与 - 定期的に「不要なリソース」レポートを生成(Cloud Asset Inventory + BigQuery)
- min-instances を高めに設定した Service はレビュー必須のガバナンス
- Cost Anomaly Detection の Cloud Billing アラート設定
- Service ごとにオーナーを定義し、四半期で棚卸し
HPA の maxReplicas を 1000 に設定 → DDoS 攻撃でリソース枯渇 + 大量課金
夜間に GKE クラスタが急成長、Pod 数が 1,000 に到達。Compute Engine の Quota が枯渇し新規 Pod が起動できない。Cloud Billing が前日比 8倍。
- HPA の maxReplicas=1000 と緩く設定
- 外部攻撃者が DDoS 攻撃 → CPU 使用率が急上昇
- HPA が「CPU 70%」をトリガーに Pod を増やし続け、上限の 1000 まで到達
- ノードプールも追従して拡張 → ノードコストも爆増
- Cloud Armor の WAF が前段に置かれていなかった
夜間の数時間で約 $8,000 の追加課金。Cloud Quota 枯渇により正常リクエストも処理できず、SLA 違反。
- HPA の maxReplicas を 50 に下げる
- Cloud Armor の WAF を Cloud Load Balancing 前段に設定
- レートリミットルール(IP ベース)と Bot 検出を有効化
- 不正利用申告で課金免除を交渉
- maxReplicas は過去ピーク負荷の 2〜3倍程度に現実的な上限
- 本番では必ず Cloud Armor で WAF + レート制限
- HPA の behavior でスケールアップ速度を制限(
policies.value=100, periodSeconds=60) - Pod のrequests を適切に設定し、Cluster Autoscaler 経由のノードコスト爆発を防ぐ
- Cloud Billing Budget Alert で前日比 2倍を検知
Cloud Run 処理が 60分超過 → Pub/Sub が再配信を続け、同じメッセージを無限処理
注文処理が「重複処理されている」というユーザー苦情。ログを確認すると、同じ Pub/Sub メッセージが 20回以上配信されていた。
- 注文の決済処理が外部 API の遅延で 80分かかった
- Cloud Run のリクエストタイムアウトはデフォルト 5分(最大 60分)
- Cloud Run が 60分でタイムアウト → Pub/Sub には 5xx 相当が返る → 自動再配信
- 再配信されたメッセージで同じ処理が再開(冪等でない実装) → 二重決済
- これが何度も繰り返され「20回以上の再配信」発生
顧客への二重課金 約 50件。返金処理 + 謝罪。CS 対応コスト数百万円。
- 長時間処理を Cloud Run Service から Cloud Run Jobs または Workflows に切り出し
- Cloud Run の HTTP ハンドラは「処理開始の記録」だけして即座に 200 を返す
- 処理の冪等性を確保(メッセージ ID または注文 ID で重複排除)
- Pub/Sub に Dead Letter Topic を設定し、再配信回数の上限を 5回に
- Pub/Sub Push の受信処理は必ず冪等に実装(メッセージ ID で重複検知)
- Cloud Run の HTTP timeout 内で完了しない処理は非同期化(Pub/Sub → Cloud Run Jobs / Workflows)
- Dead Letter Topic を必ず設定(再配信回数上限を超えたら別 Topic へ)
- Cloud Monitoring で「同一メッセージ ID の重複処理回数」のメトリックを監視
Workload Identity の annotation 設定漏れ → 「ノードのデフォルト SA」で動作し権限過多
セキュリティチームから「Pod が本来不要な権限(roles/editor)で GCS にアクセスしている」と指摘。
- Pod の
serviceAccountName: my-ksaを指定したが、Kubernetes ServiceAccount の annotation を忘れた - annotation
iam.gke.io/gcp-service-accountがないため、Workload Identity が機能しない - 結果、Pod はノードのデフォルト Compute Engine SAで動作(広い権限)
- 動作はするので気づきにくい
不要な権限による潜在的リスク。実害は未発生だが、規制要件の最小権限原則違反としてコンプライアンス指摘。
- KSA に annotation 追加:
iam.gke.io/gcp-service-account=my-gsa@... - GCP SA に
roles/iam.workloadIdentityUserをバインド - Pod 再起動 → ADC が GCP SA を使って動作することを確認
- ノードのデフォルト SA から不要な権限を剥奪
- Workload Identity の構成を Terraform / Helm で自動化(手作業を排除)
- Policy Controller / Gatekeeper で「KSA に annotation が必須」を強制
- ノードのデフォルト SA から不要な権限を剥奪(最小権限)
- Cloud Audit Logs で Pod 実行時の認証 SA を定期確認
Pod の resources.requests 未設定 → 1ノードに Pod が過密スケジュールされ OOM 連鎖
ピーク時間帯に Pod が次々と OOMKilled。kubectl describe では「memory pressure on node」のメッセージ。一部のノードに Pod が偏っている。
- Deployment の
resources.requestsを設定し忘れ - Kubernetes スケジューラは「Pod は無リソース要求」と解釈し、1ノードに過密配置
- 実際にはアプリは大量のメモリを使う → ノードのメモリが枯渇
- OOM Killer が Pod を殺す → 別ノードに再スケジュール → そこも過密 → OOM の連鎖
サービス不安定 3時間。スケジューラのリバランス機能で自然復旧。SLO 違反。
- Deployment の
resources.requestsとlimitsを適切に設定 - VPA の Recommend モードで実測値ベースの推奨を取得
- Pod の再展開でスケジューラが正常配置
- Kubernetes manifest の
resources.requestsを必須化(Policy Controller でガード) - VPA を Recommend モードで導入し、適切な requests/limits を継続的に最適化
- LimitRange を namespace に設定し、明示なし時のデフォルト値を強制
- Autopilot を使えば requests 未設定でも自動補完される(事故予防)
ノードプールの自動アップグレードで複数ノードが同時に drain → Pod 大量同時停止
ノードプールアップグレード中、サービスが間欠的に 503 を返す。複数ノードが同時に drain され、Pod が大量に同時 terminate していた。
- Pod Disruption Budget (PDB) を設定していなかった
- ノードアップグレードのデフォルト戦略は
SURGE_UPGRADEで、複数ノードを並列処理 - Deployment の replicas は 5 だったが、PDB なしのため複数 Pod が同時に terminate された
アップグレード中 8分間、可用性 30%。SLO 違反。
- 緊急で PDB を追加し、再アップグレード
- Deployment の RollingUpdate の maxUnavailable を 1 に明示
- すべての本番 Deployment に PDB を必須化(minAvailable=N-1)
- Deployment の
strategy.rollingUpdate.maxUnavailableを明示 - ノードアップグレードのメンテナンスウィンドウを設定(業務時間外)
- Surge upgrade の
maxSurge=1, maxUnavailable=0でゼロダウンタイム化
セクション3 試験戦略まとめ
- Cloud Run の 3形態: Services(HTTP)/ Jobs(バッチ)/ Functions(関数)
- リビジョン + traffic split:
--no-traffic --tag→update-traffic --to-tags - Eventarc: GCP イベント駆動の標準。
--event-filters="type=..." - Pub/Sub Push: push-auth-sa + Cloud Run が自動 JWT 検証
- Cloud Run Jobs: HTTP 不要バッチ、最大 24時間
- Autopilot vs Standard: 新規 = Autopilot、GPU/特殊 = Standard
- Probe 3種: liveness(再起動)/ readiness(除外)/ startup(遅延開始)
- HPA External Metric: Pub/Sub backlog でスケール
- Workload Identity: GKE Pod から GCP API、SA Key 配布禁止
- Apigee: API 商品化・収益化、Cloud API Gateway は軽量版
- 「10% トラフィック」「段階的にロールアウト」 → Cloud Run +
update-traffic --to-revisions=LATEST=10 - 「HTTP 不要」「2時間のバッチ」 → Cloud Run Jobs + Cloud Scheduler
- 「GCS にファイル up で起動」 → Eventarc
- 「Pod が準備中で 5xx」 → readiness probe
- 「Pub/Sub backlog で Pod スケール」 → HPA + External Metric
- 「GKE Pod から GCP API、SA Key 配布禁止」 → Workload Identity
- 「API 収益化・パートナーごとに課金」 → Apigee
- 「新規ワークロード、運用負荷最小」 → GKE Autopilot
- 「GPU 必須」 → GKE Standard