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

US-East-1リージョンにおけるAmazon DynamoDBサービス障害の概要

概要

2025年10月19日から20日にかけて、 N. Virginia (us-east-1) Region でAWSの複数サービスが障害を発生。 主な影響は DynamoDB、EC2、NLB の3サービスに分かれる。 障害はDNS管理システムの レースコンディション が発端。 復旧には手動対応や内部ツールの修復が必要。 各サービスの障害と対応策を詳細に解説。

2025年10月 N. Virginia (us-east-1) 障害の全体像

  • 発生期間: 2025年10月19日 23:48 PDT10月20日 14:20 PDT
  • 影響範囲: Amazon DynamoDB、EC2、Network Load Balancer (NLB)
  • 3つの主要な影響期間
    • DynamoDB :10月19日 23:48 ~ 10月20日 2:40
    • NLB :10月20日 5:30 ~ 14:09
    • EC2 :10月20日 2:25 ~ 13:50
  • 原因: DynamoDBのDNS管理システムの潜在的な不具合 によるエンドポイント解決失敗

DynamoDB 障害の詳細

  • 影響期間: 10月19日 23:48 ~ 10月20日 2:40
  • 影響内容: APIエラー率増加、新規接続不可
  • 原因: 自動DNS管理システムのレースコンディション
    • DNS PlannerとDNS Enactorの2つの独立コンポーネントから成るアーキテクチャ
    • DNS Enactor間の競合により、古いDNSプランが新しいプランを上書き
    • その後、DNSプランの削除処理が誤って実行され、エンドポイントのIPアドレスが全削除
    • 以降、DNS情報の更新ができなくなり、手動復旧が必要に
  • 影響範囲
    • DynamoDBエンドポイント への接続不可
    • AWS内部サービスも影響
    • Global Tables 利用者は他リージョンでアクセス可能だが、N. Virginiaとのレプリケーション遅延発生
  • 復旧手順
    • 0:38:DNS障害箇所を特定
    • 1:15:一部内部サービスの接続回復
    • 2:25:DNS情報を完全復旧
    • 2:32:Global Tablesのレプリカ同期完了
    • 2:40:全顧客の接続復旧

EC2 障害の詳細

  • 影響期間: 10月19日 23:48 ~ 10月20日 13:50
  • 影響内容
    • APIエラー率増加
    • インスタンス起動失敗
    • 既存インスタンスには影響なし
  • 原因
    • DropletWorkflow Manager (DWFM) による物理サーバ管理
      • DWFMと各サーバ(droplet)の間でリース管理
      • DynamoDB障害によりリース更新失敗、起動不可状態に
      • リース未確立のdropletは新規インスタンス起動候補外
    • Network Manager によるネットワーク設定伝播も遅延
  • 対応策
    • 2:25:DynamoDB復旧後、DWFMがリース再確立開始
    • 4:14:DWFMホストの選択的再起動、キュークリア
    • 5:28:全dropletとリース再確立、新規起動再開
    • 12:01:完全復旧開始
    • 13:50:全復旧完了

Network Load Balancer (NLB) 障害の詳細

  • 影響期間: 10月20日 5:30 ~ 14:09
  • 影響内容: 一部NLBで接続エラー増加
  • 原因: NLBフリートのヘルスチェック失敗
    • DynamoDB障害の影響で内部依存サービスの不調発生
  • 復旧: ヘルスチェック修正後、順次接続エラー解消

今後の対策・教訓

  • DNS管理自動化システムの堅牢性強化
    • レースコンディション発生時の保護ロジック追加
  • DWFMの復旧手順整備
    • 大規模障害時でも自動回復可能な設計へ
  • 内部ツールの冗長化と監視強化
    • 依存関係の可視化と迅速な影響範囲特定体制

まとめ

  • AWSの 基盤サービス間の深い依存関係 が露呈
  • DNS等の 自動化システムの設計と運用の重要性
  • 復旧手順の標準化と訓練 の必要性
  • 顧客・サービス間の 障害情報の迅速共有 の徹底

関連情報:

Hackerたちの意見

つまり、根本的な原因はレースコンディション101の古い読み取りってこと?

レースコンディションと不適切なデータ検証。

この状況には確立された運用回復手順がなかったので、エンジニアたちはさらなる問題を引き起こさないようにDWFMでの解決に注意を払ったんだ。面白いね。

エンドポイントごとのプランバージョンにCASがないことや、2PCやエンドポイントごとのシングルライタリースを使って古い書き込みを拒否するパターンにはちょっと驚いた。痛い経験だけど、いい学びになったし、AWSがこんなに透明で詳細に説明してくれてるのは素晴らしいね :hugops:

https://news.ycombinator.com/item?id=45681136 を見て。実際のDNS変異APIは、実質的にCASを行っている。彼らは論理的な制約や変更の順序なしに競争する複数の非同期ライターを持っていた。あまり考えずに、彼らはゾーンシリアルを更新するか、常にChangeRRSetsに影響を与えるラベル/ゾーンのために使われる別の「センチネルレコード」を通じて、ベクトルのようなものを実装できたかもしれない。例えば、シリアライズされた変更セット番号や古い状態と新しい状態の「チェックサム」を含むTXTレコードのように。おそらく「プラン」の側面はそれをスキップして、単に意図した状態を適用していたんだろう。最後の書き込みが勝ち、でもそれがうまくいかないこともある。

DNSレコードが「古いなら更新が必要」っていうのは、基本的に「コンピュータサイエンスの2つの難しいこと - キャッシュの無効化」のバリエーションだった。長い段落からの抜粋: > [...] このイベントが始まる直前に、あるDNSエネクターが異常に高い遅延に見舞われて、いくつかのDNSエンドポイントでの更新を再試行する必要があった。エンドポイントをゆっくりと処理している間に、他にもいくつかのことが起こっていた。まず、DNSプランナーは動き続けていて、多くの新しいプランを生成していた。次に、別のDNSエネクターがその新しいプランの1つを適用し始め、すべてのエンドポイントを急速に進めていった。これらのイベントのタイミングが潜在的なレースコンディションを引き起こした。2番目のエネクター(最新のプランを適用する)がエンドポイントの更新を完了すると、プランのクリーンアッププロセスを呼び出し、適用したプランよりもかなり古いプランを特定して削除する。このクリーンアッププロセスが呼び出された時、最初のエネクター(異常に遅延していた)がずっと古いプランを地域のDDBエンドポイントに適用し、新しいプランを上書きした。プラン適用プロセスの開始時に行われたチェックは、プランが以前に適用されたプランよりも新しいことを確認するもので、この時点ではエネクターの処理の異常な遅延のために古くなっていた。 [...] いくつかのメカニズムを説明しているけど、なぜ「エネクターの処理に異常な遅延があったのか」という満足のいく説明がないから、まだ「根本原因分析」じゃないと思う人もいるかも。ハードウェアの問題?!人為的な設定ミスでエネクターの動作に意図しない遅延を引き起こしたのか?!それとも、その前の一連の出来事が重要視されていないのか、アマゾンがエネクターの予測不可能な動作の原因をまだ調査中なのか。

あと、見逃したのかもしれないけど、異常な遅延が再発した場合のアウトageを防ぐための対策は何も確立されてないの?

これは問題の全体像を説明するための公のメッセージだよ。事故後の分析ってわけじゃない。アクティブなインシデントが「解決」される前に、再発の可能性を評価するんだ。通常、再発に迅速に対応するための潜在的な緩和策や回復の手順も用意してる。すぐに解決されたと見なされる前に、開いているリスクを積極的に緩和する作業が行われるよ。それには、最適な緩和策がわかっているなら、24時間体制で開発チームが働くことも含まれる。次に、「再発のリスク」に対する可能性のある道筋は、開発チームの最優先事項になる(営業時間内)まで、アクションアイテムが完了してデプロイされるまで続く。これには、同じようなDIY DNS管理をしている他のチームや、影響が少ないキュー深度の問題を抱えていたチーム、または似たような「ニアミス」の発見が含まれるかもしれない。サービスチームの技術者やビジネスオーナー(PE、シニアPE、GM、VP)は、解決されるまで進捗を毎日追跡するよ。それから数週間後、組織やAWSレベルでの「オペレーションミーティング」では、インシデント、対応、根本的な問題などについて深く議論される予定だ。目標は組織の学びと、得られた教訓やアクションアイテム、ベストプラクティスの広範な普及だね。

「DNSプランナー」と「DNSエナクター」が分かれているのはなぜ?もし一つのものだったら、このレースコンディションは作業している人たちにとってもっと明確だったんじゃない?これは、マイクロサービスアーキテクチャの過剰使用による複雑さの爆発が原因なのかな?

俺の結論は、レースコンディションが根本的な原因だったってこと。あのバグを取り除けば、処理の遅延があっても、突然インシデントは起こらなくなる。

UTC以外のタイムゾーンを使ったレポートは犯罪だと思う。

エポックの失敗?

私の推測では、PTが選ばれたのは、ほとんどの対応しているオペレーションの人たちにとって真夜中に起こったことを強調するためだと思う。(ここでは何も知らないけど、その選択がなぜなされたのかを考えてみた)

確固たるトランザクショナル保証がない操作に「Route53トランザクション」というフレーズを使うのは面白いね。特に、トランザクショナルな更新がなかったことがアウトageの原因になったわけだし…

君は失敗ケースを誤解してると思う。ChangeResourceRecordSetはトランザクショナルだよ(私がそのサービスに関わっていたときはそうだった)。https://docs.aws.amazon.com/Route53/latest/APIReference/API_.... 問題は、異なる目標状態を持つ二つのクライアントがいたことだ。- 一つの(「古い」)DNSエナクターは、DNSエンドポイントのいくつかで更新を再試行する必要があって、異常に高い遅延を経験した。- DNSプランナーは動き続けて、新しいプランの世代をたくさん作り出した。[注:これが重要。望ましい状態の「プラン」を生成しているが、以前の状態や変化を含む完全なトランザクションではない。] - その後、別の(「新しい」)DNSエナクターが新しいプランの一つを適用し始めた。- そして(「新しい」)プランのクリーンアッププロセスを呼び出し、適用したプランよりもかなり古いプランを特定して削除する。[注:ここに重要なレースが暗示されている。「古い」エナクターは現在の状態を読み取っていて、それは「新しい」エナクターの出力で、望ましい「古い」状態を上に適用している。この不一致は、プランナーとエナクターがチェーンやベクトルクロック、シリアライズされた変更セット番号などを使っていないために起こっている。] - 同時に最初の(「古い」)エナクターが、地域のDDBエンドポイントにかなり古いプランを適用して、新しいプランを上書きした。[注:ここで「古い」エナクターが有効なChangeRRSets呼び出しを作成し、「新しい」を「古い」に置き換えている。] - プラン適用プロセスの最初に行われたチェックは、プランが以前に適用されたプランよりも新しいことを確認するもので、これがこの時点で古くなっていた。[注:おっと!] - 二番目のエナクターのクリーンアッププロセスは、この古いプランを削除した。なぜなら、それは適用したプランよりも何世代も古かったから。皮肉なことに、Route 53はAPI変更の強力なトランザクションを持っていて、シリアライズもされていて、すべてのデータプレーンホストで変更セットを検証するクローズドループオブザーバーもある。その他のAWSサービスもそうだし、こういったレプリケーションや変更セットチェーンを構築するための内部プリミティブもある。でも、これは面倒で、たくさんの作業が必要で、失敗するとグローバルデッドロックが発生して、DNS変更が反映されないことで顧客が本当に不満を持つことになる。

DynamoDBのようなサービスは、各リージョンで非常に大きな異種のロードバランサーフリートを運営するために、何十万ものDNSレコードを維持している。 それって、dynamodb.us-east-1.amazonaws.comのDNSクエリが何十万ものIPアドレスの一つに解決されるってこと?それはクレイジーだ!しかもroute53の限界を超えてる。彼らは常にroute53を小さなサブセットのレコードで更新して、低TTLを使ってこれをある程度回避してるのかな。

DNSベースのCDNって、実際にはこういうことだよね。システムの使用状況やパケットロス、レイテンシーなどのメトリクスをデータストアから集めて、視聴者ネットワークと優先PoPのテーブルを計算する。残念ながら、詳しいドキュメントを提供するのは難しいけど、これが俺が以前働いていたところのCDNの仕組みだった。他にも同じことをもっとおしゃれな言葉で説明しているCDNがあるよ。[1] https://bunny.net/network/smartedge/

DynamoDBはEC2などのハード依存関係として今後も続くみたいだね。少なくとも透明性があって、彼らの内部システムの名前を聞けるのはありがたいよ。

AWSはそろそろカーテンを少し開けて、各AWSサービスの内部サービス依存関係のリストを示すJSONドキュメントを公開するべきだと思う。

俺の理解では、根本的な原因はDynamoDBのDNS管理システムに潜んでいたレースコンディションで、古いDNSプランが現在のものを上書きしてしまい、地域エンドポイントのDNSレコードが空になったってことだよね。合ってる?

DynamoがAWSスタック全体とこんなに絡んでるなんて、全然知らなかった。