世界を動かす技術を、日本語で。

Google Cloud インシデントレポート – 2025年6月13日

概要

  • 2025年6月12日、Google CloudおよびGoogle WorkspaceのAPIで 大規模な障害 が発生
  • 外部APIリクエスト で503エラーが増加し、グローバルに影響
  • 原因は Service Controlの新機能 におけるエラーハンドリング不足
  • us-central1 など一部リージョンでは復旧に時間を要した
  • Googleは 再発防止策 と詳細なインシデントレポートの公開を約束

2025年6月12日 Google Cloud 障害インシデント概要

  • 発生日時 :2025年6月12日 10:49 PDT
  • 影響範囲 :Google Cloud、Google Workspace、Google Security Operationsの多くのプロダクト
  • 主な症状 :外部APIリクエストでの 503エラー増加、一部サービスのUIアクセス障害
  • 影響地域 :グローバル(特にus-central1で長引く影響)

インシデントの原因

  • Service Control に新機能追加時、 適切なエラーハンドリングフィーチャーフラグ が不十分
  • 無効なポリシーデータ (空欄フィールド含む)がSpannerテーブルに挿入され、グローバルに即時複製
  • nullポインタ例外 によりService Controlバイナリがクラッシュループ
  • エンジニアが2分以内にトリアージ、10分で原因特定、25分で「レッドボタン」による回避策展開
  • 復旧の遅れ :us-central1ではService Control再起動による「ハード効果」でインフラ過負荷、完全復旧まで約2時間40分

影響サービス一覧(一部抜粋)

  • Google Cloud :IAM, Cloud Build, KMS, Cloud Storage, BigQuery, Cloud Spanner, Cloud Functions, Cloud SQL, Cloud Logging, Cloud Monitoring, Vertex AI, Dataproc, Cloud Run, Cloud DNS, Cloud Pub/Sub, Cloud Composerなど
  • Google Workspace :Gmail, Google Drive, Google Calendar, Google Meet, Google Docs, Google Chat, Google Voice, AppSheet, Google Tasks, Google Cloud Search
  • Google Security Operations :全般

復旧状況と顧客影響

  • 既存のIaaS・ストリーミングリソース には影響なし
  • 大半のリージョンは 2時間以内に回復、us-central1は最大3時間
  • 一部サービスでは 1時間程度の残留影響、ごく一部はそれ以上

障害の技術的詳細

  • Service Control は各APIリクエストの認可・ポリシーチェック・クォータ確認を担当
  • 新機能追加 時のコードパスはローリングアウト中に発火せず、 本番ポリシー変更時に初めて障害発生
  • フィーチャーフラグ未活用エラーハンドリング未実装 が主因
  • ランダム化指数バックオフ 未実装により、再起動時にインフラ過負荷

今後の対応策

  • Service Controlのアーキテクチャをモジュール化 し、障害時もAPIリクエストをサービス可能に
  • グローバル複製データを消費する全システムの監査、段階的なレプリケーションと検証体制の強化
  • 重要バイナリのフィーチャーフラグ保護 とデフォルト無効化の徹底
  • 静的解析・テストの強化、エラー時はフェイルオープン設計へ
  • 指数バックオフの全システム適用、負荷集中の防止
  • 外部コミュニケーション体制の改善、主要な監視・通知基盤の冗長化

コミュニケーションと今後のレポート

  • Cloud Service Health への初報は障害発生約1時間後(自身の障害のため遅延)
  • 一部顧客の監視インフラも障害でダウン、インシデント認知遅延
  • 詳細なインシデントレポート を数日内に公開予定
  • 顧客は Google Cloud Support または Google Workspace Support 経由で個別問い合わせ可能

まとめと再発防止への誓約

  • 信頼回復と再発防止策の徹底
  • API管理基盤の堅牢化、異常データによるサービス停止の防止
  • メタデータのグローバル伝播前の検証・監視強化
  • 包括的なエラーハンドリングとテスト の拡充

Vertex AI Online Prediction 障害状況

  • 復旧完了 :2025年6月12日 18:18 PDT時点で完全復旧
  • 一部リージョン(europe-west1, asia-southeast1) では復旧遅延、19:45 PDTまでに正常化見込み
  • 影響 :Model Gardenの一部モデルで 5xxエラー増加
  • エンジニアによる段階的な復旧作業、残る影響はごく一部

Personalized Service Health/Cloud Dataflow 障害状況

  • Personalized Service Health :復旧済み
  • Cloud Dataflow :us-central1でのみバックログ遅延発生、順次解消中

顧客へのメッセージ

  • Google Cloudを信頼いただく全ての顧客 への深い謝罪
  • 今後数日以内に詳細な根本原因・対応策を公開
  • 影響が記載内容以外にも及ぶ場合 はサポート窓口へ連絡推奨

Hackerたちの意見

適切なエラーハンドリングがなかったせいで、ヌルポインタが原因でバイナリがクラッシュしたんだ。今頃はもう兆ドルのミスになってるよね?

今年のためにどれだけのSLAを作ったんだろうね。

そんなことを防げる言語があればいいのにね /s

グーグルのポストモーテムは本当に驚かされる。社内から外部まで見てきたけど、詳細さがすごいんだよね。問題は、彼らは絶対に同じミスを繰り返さないってこと。学んで、正しいプロトコルやエラーハンドリングを導入して、さらに堅牢なシステムを作るんだ。でも、グーグルの規模だと、常に何かがうまくいかないことがある。大事なのは、それが顧客やユーザー、他のシステムに影響を与えないようにどう対処するかってこと。正直、これは内部にいないと見えないし、チームごとに見るものが全然違うこともある。宇宙の中で最も複雑なシステムに近づいているかもしれない。人間としてはこれ以上のものは作れないから。もしかしたらAGIはできるかもしれないけど、私たちには無理だね。

私の理解では、ダウンタイムは数回のミスによって引き起こされたんだ。1) 同時に全ての場所で行われたグローバルな機能リリース 2) ヌルポインタの逆参照 3) サンダリングハード問題を引き起こした適切なリトライポリシーの欠如 これらは業界で働いている人なら誰でも何度も見たことがある、絶対に標準的なミスだよ。新しいことは何もないし、変な分散システムのロジックもない、グーグルのスケールでもない、ただのルーキーのミスばかりだね。

でも、これは一連のジュニアレベルのミスだね。

  • nullデータを適切に扱ってない
  • 適切にテストしてない
  • 新しいものがテストされていることを示すテストカバレッジがない
  • デプロイ後に本番環境のサブセットで動作確認をしてないから、全体に押し出す前にちゃんと動くか確認できてない この業界の基準は年々下がってるけど、ここまでひどいとは。10年前にGoogleの顧客として、もっと重要じゃないものをやってたら、向こうの人たちはみんなニヤニヤしながら笑ってたと思うよ、正当な理由でね。

そうだね、いくつかには当てはまるけど、これは違う。これは大きな恥だよ。マウンテンビューのアマチュアの時間だね。

このエラーは、キャッチされていないヌルポインタの問題だった。Googleのような規模と品質の会社が、この手のエラーで大部分のシステムをダウンさせるっていうのは、深刻な問題の後に適切な対策を実施していないことを示唆してるよね。

彼らは二度と同じミスを繰り返さないだろう。機能フラグなしで変更を展開して、クライアントに指数バックオフを実装せず、サーバーに負荷分散も実装しなかった。これは、何年も前のGoogle SRE本に書いてあることだよ。

これは文字通り、何度も繰り返されてきた同じミスだよ。もちろん、また繰り返されるだろう。「新機能は慎重に展開されるが、新しいデータによって引き起こされるまで潜在的なバグが残る」というのが、ほとんどのグローバルな障害を要約できる。要するに、完璧な人間なんていないってこと。もちろん、FAANGの障害についてのスレッドでのアームチェアHNコメント者を除いてね。

これは本当にアマチュアレベルの話だね。NPE、エラーハンドリングなし、指数バックオフなし、テストカバレッジなし、ステージングでのテストなし、段階的なロールアウトなし、致命的な失敗。彼らのSRE本を読んだけど、こういうことは全部書いてあるよね。https://sre.google/sre-book/table-of-contents/ https://google.github.io/building-secure-and-reliable-system... 基準が緩んだのか、それとも本はただのマーケティングだったのか。

誰か金曜日にプロダクションにプッシュしたのか?

外部の人間としての私のざっくりした推測だけど、解雇が続いてCEOがみんなを怠け者扱いした後、スピードや見かけの成果に重きを置くようになったんじゃないかな。しばらくすると文化が変わって、そういうことを阻止すると問題視されて排除されるようになる。

彼らのウェブページでいくつかLighthouseの測定を試してみて。最高のエンジニアリング基準を維持してないのがわかるよ。

もっと詳細を共有してほしいな。君の意見は完全には正しくないよ。テストはあったけど、悪い入力(ポリシーの空白フィールド)に対してはしてなかっただけ。ステージングでテストがなかったとは言ってないし、フラグがあればキャッチできたって言ってたよ。意見は私のものだからね。

…危険な器具に常に接していると、最初の注意を失ってしまう。だから、指導のために定められたルールが不必要に厳しいと思うようになってしまう。1864年のエリスでの火薬庫の爆発に関する報告。

  • 彼らのAZが同じデータセンターのファイアウォールだって知ってる?
  • ECCなしのマシンを使って、そのせいでインデックスが壊れたって?恥ずかしがってIBMの古参から教訓を得る代わりに、論文を発表したの?
  • Google+の崩壊を加速させたのは、APIの問題で何百万ものユーザーのプライベートプロフィールフィールドが収集できてしまったことで、それを数ヶ月隠してたからだよ…心配しないで、最高の人しか雇わない国から、もっと多くの障害が来るから。

Googleのほぼすべてのグローバル障害は、こんな感じだったよ。つまり、グローバルに設定を迅速に展開する特注システムが悪い設定を受け取る。バイナリのロールアウトや設定プッシュのための標準ツールは、通常何らかの段階的なロールアウトを行う。ある意味、Google Cloudは多くのグローバルシステムが地域化され、より信頼性が高くなることを強制されたので、状況を大いに改善した。Googleは昔、短いグローバル障害があっても公に言及されなかった(当時、Googleに接続できなかったら、自分のISPが壊れてると思ってたから)、だからこのイベントは思っているほど珍しくはなかったよ。全体的に、悪化の傾向はないと思うけど、誰かがそれを証明するインシデントのスプレッドシートを持っていない限りね。[数年前にGoogleでSREをやってた]

Googleの規模で、基準がそんなに高くなければ、こういう事故は毎日起こってるはずだよ。たまにしか起こらないってことは、彼らがそのプロセスや安全策に対して本当に細心の注意を払ってるってことだね。

あの本は、私が数年前に辞めたときの40%のエンジニアで書かれたんだ(今はレイオフでどれくらい残ってるかわからないけど)。その新しく雇われた人たちはまだ読んでないんじゃないかな。だから、基準が緩んでるように感じるよ。

個人的には、どんな防御も人間でも自動化でも完璧じゃないし、人生はトレードオフの連続だと思う。ユニットテストをいくら書いても、サンプルデータでシステムが期待通りに動くかを確認する統合テストをしても、目に見えて危険なことをしていると警告する静的解析をしても、夜間ビルドから本番環境への段階的展開をしても、結局、大規模になるとその安全対策の隙間を見つけることになる。運が悪ければ、それがすべて同時に起こることもある。そういう本に書いてある理由と同じで、次の9を得るのは前のものよりもずっと多くの作業を伴う。結局、数ヶ月前の安定したビルドを実行するスタックの完全なコピーを設定して、すべてのトラフィックを再生する必要が出てくるから、バックアップがそれをサポートするまで新機能を展開できない。サービスが大きくなればなるほど、誰もそのコスト/利益を払えない。OpenZFSに取り組んでいるとき、いくつかのバグは「このコードは孤立していると期待通りに動くけど、10年前に書かれたデータのエッジケースが出てきた」とか、「3つ前のRed Hatリリースのこの範囲のカーネルにはバグがあって、最新のリリースのカーネルでテストしていたから見逃してしまった」とかから来ている。最終的に、システムに十分な複雑さがあれば、知っているすべてのバリエーションをテストするのは現実的ではないから、コストに対して十分な利益が得られるものに基づいてトレードオフをすることになる。(私はGoogleのSREだけど、このインシデントに関連するチームではない。すべての意見は非公式で私自身のもの。)

このポリシーデータには意図しない空白フィールドが含まれていた。サービスコントロールは、各地域のデータストアでポリシーに対して地域ごとにクォーターチェックを行った。これがそれぞれのポリシー変更に対して空白フィールドを引き込み、nullポインタに当たってバイナリがクラッシュループに入るコードパスを実行した。これはホアの「10億ドルのミス」の別の例だね。

  • なぜ意図しない「空白フィールド」(null)が挿入可能なのか?設定には意図しないnullを許さないスキーマタイプが必要だよ。残念ながら、Spanner自体はSQLライクで、フィールドは明示的にNOT NULLと宣言しなければならない。デフォルトはnullableフィールドだ。
  • それでも、これらのポリシーを管理するプログラムには独自の型システムがあり、設定用のアプリケーションレベルのスキーマ言語がある可能性がある。これも無効な状態を表現できないようにするチャンスだね。
  • それからサービスコントロールでは、データストアからアプリケーションオブジェクトにポリシーをデシリアライズする際に「スキーマオンリード」を証明する機会がある。プログラミング言語の型やアプリケーションレベルのスキーマを使って、データレイヤーを出る前にポリシー行が期待される形を持っているか検証できる。もしかしたらnullポインタエラーはこのレイヤーで発生したかもしれないけど、新しいコードパスで問題が起きたから、無効なデータがデータレイヤーを抜けてアプリケーションコードに入った可能性が高いね。
  • 最後に、サービスコントロールアプリケーションはnullポインタ参照を許す言語で書かれている。もし私がこのシステムのメンテナンスをしていたら、最小限の侵襲で考えるのは、ポリシーライターとポリシーリーダーに「タグ付き列挙型」や「ユニオン型」、「和型」を使ってnullを表現できないポリシーを表すアプリケーションレベルのスキーマを導入することだね。理想的には、新しい種類のポリシーはユニオン型に追加される新しいバリアントとして表現できる。これをアプリコードに追加することはできるけど、プログラム全体を安全な言語に書き直す必要はない。残念ながら、プロト3、Googleの通常のスキーマ言語にはこの制約がないみたい。これがあるものの例:https://github.com/stepchowfun/typical

私はクラウドの仕事をしてるけど、このサービスではないんだ。一般的に言うと: - すべてのコードにはユニットテストと統合テストがある - バイナリや設定ファイルの変更は、通常数日かけて、仕事ごと、地域ごとに徐々に展開される。カナリア分析でこのスローな展開を確認する。 - パニックロールバックも、状況を悪化させないように比較的ゆっくり行われる。例えば、ジョブの再起動でデータベースが過負荷になるのを避けるためにね。40分のダウンタイムは4時間のダウンタイムよりマシだ。今回の件についての内部情報はないけど、PMの見解としては、コードはテストされたけど、このエッジケースはテストされてなかったって感じ。クォータポリシーの設定は設定ファイルとして展開されるんじゃなくて、データベースを更新することで行われる。データベースはレプリケーション用に設定されていて、そのため変更が数秒で全データベースに反映されたんだ。バイナリや設定ファイルの変更のように、仕事ごと、地域ごとに適用されるわけじゃなかった。ヌルポインタに対するフラストレーションには同意するけど、もしエンジニアたちがこれを不可能だと思っていたなら、他の言語でのassert()が原因でリクエストがポリシーチェックに失敗する可能性もあっただろうね。この重要なサービスを別の言語で書き直すのは、すべてのポリシーチェックがフラグでガードされていること、すべてのクォータポリシーチェックがオープンに失敗すること、データベースの変更が地域ごとにゆっくり展開されることを確認するよりも、リスクが高いと思う。免責事項:これはすべて非公式で、私の個人的な意見です。

コードはテストされたけど、このエッジケースはテストされてなかった。つまり…テストされてなかったってことだね。

他の言語でのassert()が原因だった可能性もある。アサートはポリシーで禁止するのがずっと簡単だよね。

データベースの変更で、バイナリや設定じゃないからって、それがどうして大丈夫になるの?変更は変更だし、一度にどこでもグローバルに変更するのは災害の元だよ。どんな種類の変更でも関係ない。これは二度目のCrowdstrikeだね。

こんな重要なサービスを別の言語で書き直すのは、ポリシーチェックをフラグで守るよりリスクが高い気がするんだけど。つまり、要件が不明なの?それともこのサービスは移行を慎重に行うほど重要じゃないの?

(関連チームにいたことがあるから捨てアカ)サービスコントロール(Chemist)は、ちょっと古いサービスで、約10年前からあって、GCPの多くのAPIにとって認証、認可、監査、クォータなどで重要なんだ。Cloudではほぼ必須。ほとんどのGCP APIの経路にプロキシがあって、バックエンドにリクエストを転送する前にChemistを呼び出すんだ。(だから、ポストモーテムで言われてるfail openの緩和策は機能しないと思う)ChemistとプロキシはどちらもC++で書かれていて、長年にわたってたくさんのレガシーなゴミが蓄積されてきた。チームは広範な静的分析やテスト、段階的な展開、フィーチャーフラグ、赤ボタン、強力な監視/アラートシステムを整えている。特にSREたちはすごいよ。ChemistはIAMやクォータなどのポリシーチェックをたくさん扱っているから、その分野に関わる他のチームもコードベースに貢献してきた。時間が経つにつれて、ショートカットが取られて、そういうチームはすべての変更に対してChemistの承認を得る必要がなくなった。しかし、ここ数年で、組織は多くの変動やオフショアリングを経験してきた。これが、L8/L9が主導する派手で新しいプロジェクトに焦点を当てることに繋がり、品質やメンテナンス、信頼性を優先する代わりに人員を正当化する方向に進んでしまった。このシフトが品質基準の低下や、より早く物を出すプレッシャーの増加に寄与していて(私がCloudを辞めた理由の一つでもある)、Googleで一般的なサーバー/サービスのベストプラクティスがここではあまり一般的ではないんだ。それでも、この特定のケースでは、問題は冴えないコードやコードレビューにあるように思える。(確か、いくつかの失敗があったのにコードがマージされたはず)。Spannerを通じて設定変更を即座に行うのは、さらに悪化させたね。

私は内部の人間だから、捨てアカウントを使ってる。今回のインシデントの根本原因は、リーダーシップが手を抜いてスピードを求めたことだよ。これが何年も続いて、最終的には崖から落ちた。具体的な失敗モードは「死のクエリ」として知られている。クエリが既存のバグを引き起こしてサーバーがクラッシュするんだ。C++サーバーでは避けられない。サービスコントロールはC++で動いていて、死のクエリや他の失敗モードを最小限に抑えるための包括的なエンジニアリングガイドラインを使ってる。今回のインシデントの前には、過去10年間で大きなインシデントはなかった。このインシデントは新しいグローバルクオータポリシーに関連していて、リーダーシップの圧力のもとで急いで作られた。こういう機能は、別のサービスで作るべきだし、少なくとも確立されたエンジニアリングガイドラインに従うべきだよ。報告書に書かれているアクションアイテムについては、確立されたエンジニアリングガイドラインの方がはるかに優れている。チームはできる限りその基準を守ってきた。

これを完全にリーダーシップのせいにするのは無理があるね。極端なレベルの精査なしにグローバルなブラス半径のデプロイを許可するのは、エンジニアリング文化の失敗だよ。少なくとも、地域サービスの制御デプロイの前にグローバルポリシーを展開するべきだったね。

インシデントレポートは興味深いね。SREチームの反応が早かった(2分)、その後「赤いボタン」の展開。でも「私たちの大きな地域のいくつか、例えばus-central-1では、サービスコントロールのタスクが再起動する際に、依存している基盤インフラに群れ効果を生み出し(つまり、そのSpannerテーブル)、インフラを過負荷にした。」っていうのがあった。サービスコントロールはこれを避けるための適切なランダム化指数バックオフを実装していなかった。us-central-1では、影響を最小限に抑えるためにタスク作成を制限し、負荷を減らすためにマルチリージョンデータベースにトラフィックをルーティングした結果、完全に解決するのに最大で約2時間40分かかった。私の経験では、こういうことはよくある。特に多くのノードのクオータを回復するような特異な状況では、通常の運用では意味のあるクオータがすぐに超えてしまって、別の失敗シナリオに突入することになる。基盤インフラが耐えられる限り、クオータを一時的に無効にできるのは良いことだし、自然に時間がかかる回復操作を制限するのもいい。

エクスポネンシャルバックオフについては誤解があるね。サーバーの起動時に重要なデータを読み込むけど、意図的にリトライしないからバックオフもないんだ。もっといい解決策は、既存のバックアップデータベースに負荷を素早く分散させることだよ。他にも選択肢はあるけどね。

他人にダウンタイムが起こると、みんな「これはジュニアレベルのミスだ」とか批判するのに、自分に降りかかると、避けられなかったとか予測できなかった理由をつけるのが便利だよね。実際、人間はミスをするし、期待が高すぎる。実店舗のビジネスが予期せず閉店しなければならないとき、ドアにサインを貼って謝罪するだけで済む。でもテクノロジーの世界では、年間数時間のダウンタイムにこんなにストレスを感じるのはおかしいと思う。みんなもう少しリラックスしてほしいな。

マルチリージョンがレジリエンスや可用性のメカニズムとしてよく語られるのは面白いけど、実際には大手クラウドプロバイダーはこういう障害時に地域を超えて絶望的に絡み合っているように見える。

マルチリージョンのデプロイがインシデントを防いだケースを理解しないと、結論を出すのは難しいと思うよ。

そこにある「未知の未知」に気をつけて。地域やゾーンのシャーディングのおかげで、発生しなかった「こういう障害」については気づいていないかもしれないよ。

これはGCPに特有の問題で、他のプロバイダーとは地域の扱いが全然違うんだ。レジリエンスの観点から見ると、GCPはゾーンがたくさんある単一のリージョンとして扱うのがベストだよ。