本番運用で踏むパターン、コスト構造、肥大化、SRE が必ず設定すべきアラートを集約。LB は「動いて当たり前」と思われがちですが、設計次第で レイテンシ・コスト・障害伝播 が劇的に変わります。
状況: Global External Application LB を採用したが、backend MIG が asia-northeast1 のみ。当該リージョン障害で全リクエストが backend_connection_closed_before_data_sent_to_backend でエラー。
原因: Global LB の 「グローバル冗長」とは、フロントエンド(Anycast IP/エッジ) であってバックエンドではない という勘違い。
影響: SLA 計算上は GCP の "regional zonal outage" だが、ビジネスは全停止 (RTO/RPO 違反)。
復旧: 緊急で別リージョンに MIG を作り backend service に追加。LB は自動でフェイルオーバー。
再発防止:
locality_lb_policy を WATERFALL_BY_REGION 等で fail-open 設定状況: Application LB のヘルスチェックは /healthz で 200。しかし /api/v1/order へのリクエストは 502 Bad Gateway。
原因: HC エンドポイントは軽量で常に 200 を返すが、実 endpoint は DB 接続切れで失敗。HC は LB ↔ backend の到達性のみを検証するため、アプリ層の半分壊れ (broken middleware) を検出できない。
影響: ロード分散がガラガラの backend にも流れ続け、502 が急増。
復旧: HC を /healthz/deep に切替え、DB ping を含める。circuit breaker (envoyfilter) で半壊 backend を即遮断。
再発防止:
backend_5xx_rate > 1% で 5 分以内通知状況: Cloud Armor を有効化した翌朝、ログイン成功率が 60% → 12%に急落。Cloud Armor ログを見ると sqli-stable ルールが大量ヒット。
原因: ユーザ生成データ (パスワードリセットメール本文等) に SQL キーワード SELECT, OR 1=1 が含まれ、preconfigured rule (Sensitivity 4) が誤検知。
影響: 数時間で売上 1500 万円の損失、サポート問い合わせ急増。
復旧: Sensitivity を 4 → 2 に下げる + 当該 URL path を例外化 (request.path.matches('/account/.*'))。preview mode で 7 日間運転して評価する手順に。
再発防止:
--preview) で 7-14 日 観察してから enforce状況: Application LB の backend MIG (10 VMs) が、ピーク時 30% のリクエストで 502。各 VM の CPU は 40%、メモリは 50%。
原因: backend service の max_connections_per_endpoint=100 がデフォルト。実 RPS は VM あたり 600。connection pool 枯渇で LB が即 502 を返した。
影響: ピーク 1 時間で error budget の 4 週間分を一晩で消費。
復旧: max_connections_per_endpoint を 800 に拡張、balancing_mode=RATE + max_rate_per_endpoint=500 に変更。
再発防止:
backend_utilization > 80% でアラート状況: Google-managed SSL certificate を採用したが、ドメインの DNS A record が古い IP を指したまま。証明書のリフレッシュ時に Domain Validation (HTTP-01) が失敗、再発行されず期限切れ。
原因: Managed certificate は再発行時に ターゲットドメインが LB の VIP を解決できることが必須。DNS が古いと失敗する。
影響: 朝 6 時から HTTPS でアクセス不可、ユーザは TLS 警告画面。
復旧: DNS を修正 + 手動で managed cert 再発行コマンド。
再発防止:
certmanager.googleapis.com/certificate/expiration_seconds を 30/14/7 日でアラート状況: 認証済みユーザ向けに個別 dashboard を返す API を Cloud CDN 配下に。ある日「他人のデータが表示される」苦情多発。
原因: Backend が Cache-Control: public, max-age=3600 を返し、しかも Vary: Authorization が無かった。CDN が最初の応答 (ユーザ A のデータ) を全ユーザに配信。
影響: 個人情報漏洩、GDPR/個人情報保護法インシデント、IR レポート 30 ページ。
復旧: 緊急 cache invalidation (全パス) + Backend で Cache-Control: private, no-store 強制。
再発防止:
private + no-store状況: NVA (multi-NIC) の前段に Internal Passthrough LB を置き next-hop-ilb 指定。VM → NVA → DB の往路は通るが、復路 (DB → NVA → VM) が NVA を経由せず直接 VM に返り、TCP セッション切断。
原因: Passthrough LB は 送信元 IP を保持するため、DB は VM の IP を見て直接返す。NVA が non-stateful なら大丈夫だが、stateful FW として動かしているとセッション table mismatch で drop。
影響: HTTPS が時々切れる、TCP RST の嵐。
復旧: NVA で SNAT 有効化 (egress を NVA IP に書き換え)。または対称ルーティング設計 (DB 側からも next-hop-ilb 経由)。
再発防止:
connection.tcp.flags で非対称検出状況: gRPC で運用していたサービスで、Application LB から upstream_max_stream_duration_reached エラーが多発。
原因: HTTP/2 の SETTINGS_MAX_CONCURRENT_STREAMS がデフォルト 100。長時間ストリーミング gRPC で枯渇。
影響: Stream error で SLO 違反、SRE が backend を疑って3時間ロス。
復旧: backend service の max_stream_duration を伸ばし、connection を 5 分ごとに再生成する設計に。
再発防止:
https/backend_connection/closed_after_partial_response を SLI に状況: External Passthrough NLB を構築。Test 環境では動いていたが、本番化後にアジア圏のユーザだけ到達不可。
原因: Network Tier を STANDARD で作成したため、Anycast ではなく リージョン限定 (us-central1) の IP。アジアユーザは Public Internet 経由でレイテンシ + パケロス。
影響: p99 latency が 100ms → 800ms、SLO 違反。
復旧: Premium Tier で再作成 (IP も変わるため DNS TTL 短縮の事前準備が必要)。
再発防止:
https/latencies を地域別に export状況: Application LB + Serverless NEG (Cloud Run) 構成。ピーク時に LB が 502 を返す。Cloud Run のメトリクスは concurrency 80, CPU 50%。
原因: Cloud Run の max_instances がデフォルト 100、concurrency=80 のため、最大 8000 リクエスト/秒。これを超えると 429 を返し、LB が 502 に変換。
影響: エラー率 8%、20 分間継続。
復旧: max_instances=500 に緩和、min_instances=10 で cold start 削減。
再発防止:
request_count{response_code_class="4xx"} も SLI にLB は「データ転送 + ルールデータ処理 + 転送料」の 3 階建て。サービスを跨ぐ請求項目で混乱が生まれやすいので、メンタルモデルを固める。
| 項目 | 単位 | 目安単価 (us, 2026 想定) | 注意点 |
|---|---|---|---|
| Forwarding rule (External, first 5) | per hour | $0.025/hour ($18/月) × N | 5 rule 超過分は per-rule で増加 |
| Inbound data processing | per GB | $0.008 - $0.012/GB | backend へ送られるデータ全量 |
| Network Egress (Internet) | per GB | 地域差 $0.08〜$0.23/GB | Premium Tier で高、Standard Tier で安 |
| Cloud Armor (per policy) | per policy + per request | $5/policy/月 + $0.75/1M req | Managed protection plus は別料金 (org 単位 $3000/月〜) |
| Cloud CDN cache fill | per GB (egress to cache) | $0.04 - $0.20/GB | cache miss 多いと無駄高 (high cache hit ratio が重要) |
| SSL Cert (Managed) | 無料 | $0 | Certificate Manager の数量上限に注意 |
Forwarding rule × 3 $54
Data processing (300TB inbound) $2,400
Egress (100TB Premium Tier, mixed regions) $11,000 ← 81%
Cloud Armor (1 policy, 500M req) $380
Cloud CDN (60TB cache egress) $4,800
SSL cert (managed, 5 ドメイン) $0
─────────────────────────────────────────────────
合計 ~$18,634/月
過去の A/B test や、削除予定のサービスの rule が残存。月$18 × 30個 = $540 を払い続ける。「使われていない rule」検出は手動でしか無理。
対策: Network Analyzer の "Unused resources" を月次で確認、Tags で owner を付与し orphan を排除。
内部バッチ (BigQuery export 等) の egress も Premium で出ている。Standard Tier なら 30-50% コスト減。
対策: 内部バッチは Standard Tier LB or PSC 経由に。compute.googleapis.com/network_tier を Org Policy で強制も可。
URL パラメータ (e.g., ?ts=...) や Vary ヘッダの過剰使用で cache miss が 80% 超。cache fill ばかり走り、CDN コストが直接配信より高くつく。
対策: cache key 設計を見直し、include_query_string=false に。Cloud Logging で jsonPayload.cacheStatus 分析。
Global LB 採用で「ユーザは最寄りリージョンに行く」と思ったら、実は backend が us-central1 しか無く、東京ユーザのレイテンシ + リージョン間 egress (これも課金) が大量発生。
対策: backend を地理分散 + locality_lb_policy 設定 + preferred_backend 設定。
WAF を preview で運用して enforce せず、誤検知だけログに溜まり、Logging コストが月 $5000 に。Cloud Armor 自体の rule cost も増。
対策: preview は 14 日でリミット、不採用ルールは削除。Logging の sampling rate 設定。
テスト用に作った Google-managed 証明書が 200個。Cert Manager の上限に当たり、本番 cert 発行できない事故も。
対策: Certificate Manager で集約管理、Terraform で lifecycle 制御、未使用 cert は 30 日で削除。
consecutive_errors=5, interval=30s 設定で半壊 backend を eject。max_connections / max_pending_requests / max_requests / max_retries を明示、cascading failure を抑制。connectionDraining.drainingTimeoutSec=300 を明示、デプロイ時の 502 を撲滅。preview → enforce パイプラインで自動化、DDoS 対応を 5 分以内に。| SLI | 定義 | SLO 目安 |
|---|---|---|
| Availability | 2xx-3xx / (2xx-3xx + 5xx) | 99.95% |
| Latency (p99) | backend_latencies (request_method=GET) | < 500ms |
| Saturation | backend_utilization (mean) | < 70% |
| Error budget burn rate | (1 - availability) / (1 - SLO) | 1x baseline |
# Fast burn: 1時間で 月予算の 2% を消費
- burn_rate >= 14.4 over 1h AND 5m → PagerDuty Page (Sev2)
# Medium burn: 6時間で 月予算の 5% を消費
- burn_rate >= 6 over 6h AND 30m → Slack #network-sre (Sev3)
# Slow burn: 3日で 月予算の 10% を消費
- burn_rate >= 1 over 3d AND 6h → Issue 起票 (Sev4)
| シグナル | メトリック | 閾値 |
|---|---|---|
| 5xx burst | https/request_count{response_code_class="500"} | > 1% for 5m |
| p99 latency | https/backend_latencies | > 1s for 10m |
| backend utilization | https/backend_request_count / target_size | > 85% for 5m |
| HC failure | backend_health/unhealthy_count | >= 1 for 2m |
| SSL cert expiry | certmanager.googleapis.com/.../expiration_seconds | < 30 days |
| Cloud Armor block rate | armor.googleapis.com/.../denied_requests | > 2× baseline |
| CDN hit ratio drop | https/frontend_tcp_rtt + cache hit metric | < 80% for 30m |
| QUIC handshake failure | https/frontend_tcp_rtt | > 200ms p99 for 10m |
| Forwarding rule count | resource count | quota 80% |
| Connection drops | https/backend_connection_closed_before_data_sent_to_backend | > 0.1% for 5m |
1. Cloud Monitoring で対象 backend service を特定 (3 min)
2. Network Topology / Connectivity Tests で backend 到達性確認 (5 min)
3. Cloud Logging で 5xx の "statusDetails" を分析:
- backend_connection_closed_before_data_sent_to_backend → backend down
- response_sent_by_backend → backend がエラーを返している
- backend_timeout → backend が遅い (scale up / HC 確認)
- failed_to_pick_backend → HC 全滅 (firewall? backend service config?)
4. 並行して Cloud Armor logs に "denied" 急増がないか確認 (WAF FP の可能性)
5. 緊急対処:
- 全 backend HC 失敗 → backend 再起動 or LB の HC 検証 endpoint 確認
- 特定 backend のみ → backend を drain (capacity_scaler=0 で一時退去)
- WAF FP → 該当 rule を preview mode に戻す
6. Post-mortem:
- 障害時間、エラー予算消費、根本原因、再発防止策をテンプレに沿って