有効期限 2021年4月6日

2021年4月6日、ワイルドカードTLS証明書が予期せず期限切れになりました。証明書が期限切れになってしまうことは恥ずべき事ですが、今回私たちが学んだことをここで共有することで、誰かのシステムを改善する手助けになればと考えました。個人であれ組織であれ、証明書のモニタリングを使用している場合は、それらのシステムのギャップを確認することが非常に重要です。

期限切れとなった証明書は、Epicの数多くの社内向けサービスで使用されていました。当社は常に証明書の有効期限をモニタリングするよう最善を尽くしていましたが、証明書が使用されているすべてのエリアを完全に監視することができませんでした。証明書の期限切れと更新に続いて、一連の予期せぬ出来事が発生し、それにより停止期間が延長されました。これらについての詳細も、本記事にてお知らせいたします。

身分証明や認証システムといった中核的な構成要素が影響を受け、その結果、当社のエコシステム全体の多くのサービスに影響が及びました。以下の影響が確認、または報告されています:

  • 『フォートナイト』、『ロケットリーグ』、『Houseparty』、Epic Online ServicesまたはEpic Games Storeを含む、この認証形式を使用する製品からのEpicアカウントへのログインの失敗
  • 全プラットフォームでのライブゲームプレイまたはサービスからの切断
  • Epic Games Launcherからのアイテム購入の失敗
  • コンテンツの読み込みやオフラインモードでの不備など、Epic Games Launcherで予期せぬ動作が発生
  • Unreal Engineサイトを含むEpic Games製品やマーケティングウェブサイトが利用不可、または機能が低下
  • Epicの従業員が問題を解決または管理する能力に影響を与える複数の内部ツールの問題

この記事は、何が起こり、当社が何を学んだのか、そして今後取り組んでいく措置についての詳細な洞察を提供することを目的としています。


一体何が起きたのでしょうか?


一連の重大な3つの出来事が発生しました:

  1. 証明書が期限切れとなり、内部バックエンドでのサービス間の通信や内部管理ツールの大部分で機能停止が発生
  2. Epic Games Launcherへのアクセス量が予想外に急増し、Epic Games Launcherへのサービスおよびコンテンツ配信機能が中断
  3. 無効なアーティファクトやアセットを参照する誤ったバージョンのEpic Games Storeウェブサイトが自動スケーリングの一環として表示され、Epic Games Store体験を劣化

 

1) 証明書の期限切れ

4月6日午後12時00分(協定世界時)、TLS証明書が期限切れになりました。この証明書は、Epicのバックエンドプラットフォーム間の内部専用通信の大部分で使用されていました。当社は、クロスサービスAPI通信や内部管理ツール用に、バックエンド間でTLS暗号化を使用しています。本証明書は内部DNSゾーン向けのものであり、公衆向けのものではありません。

午後12時00分(協定世界時)、バックエンドシステム間での転送が事実上停止。6分後の午後12時06分(協定世界時)、本事象が報告され、当社の事故処理が開始。多くの警報が発生していましたが、当社従業員たちは、通常通り広く影響を与えている問題についてすべて報告するように通達が行われました。当社の24時間体制のLive Opsチームによってそれぞれの事象の行動順位決定が行われ、インシデント管理処理が開始されました。最初の内部報告書が到着すると、当社のインシデント管理ツールおよびプロセスがSlackチャンネルを自動的に作成し、関連チームを事故へ招集、または呼び出しました。

午後12時12分(協定世界時)、当社は証明書が期限切れであることを確認し、これが問題の根源である可能性が高いと見なし、更新処理を開始。午後12時37分(協定世界時)、証明書が発行され、更新済みの証明書がバックエンドサービスに提供を開始。その後5分~15分の間でロードバランサが新しい証明書の内部エンドポイントへの自動配置を開始し、当社のサービス間HTTPS通信、および管理インターフェースが復旧しました。

この事故の行動順位決定を行った当社のLive Opsチームは、この時点までに従業員へ通達を行い、適切な人員の関与を誘導。午後12時38分(協定世界時)にSlackで提携していた人員を統合するためにZoom通信を開始しました。Slackは優れたコミュニケーションツールですが、こういった緊急事態の中では、音声または動画を通してリアルタイムで行える、ライブの通信方法に勝るものはありません。本事故についての近況報告は当社のツールとプロセスを通して内部出資者へ定期的に送信され、発生している事象についての最新情報を全員が把握できるように対処されました。この時点で25人以上の人員が直接関与し、さらに、プレイヤーサポート、コミュニティ、エンジニアリングの他、当社の製品やチームの多くに携わるプロダクションの人員が見守る中、本事故への対処が行われました。

証明書切れによるドロップおよび完全復旧時の増加が示された、単一マイクロサービスに対する1分あたりのリクエスト数のグラフ。

 

要因


この内部サービス間通信のためのDNSゾーンは当社の証明書モニタリングサービスによって常に監視されておらず、これが当社にとっての重大な過失となりました。当社の証明書モニタリングサービスは個々のエンドポイントや証明書ではなく、DNSネームスペース全体を調節するものであり、当該内部ゾーンでの設定が欠落していました。その後、当該ゾーンは、このギャップに対処できる新たなモニタリングソリューションへと移行されました。本事象の発生前、当社は多くのアカウントにおいてグローバルにAWS Configを有効化、および設定するためのプロジェクトを開始していました。この設定をグローバルに行うことで、AWS Configルールを容易に追加し、証明書の有効期限に関する多層防御レベルで警告の有効化を図ることが可能になります。

この内部証明書に対する自動更新が有効化されておらず、これを達成するために必要な作業は、今年初めに特定された際に優先視されていませんでした。自動更新を円滑に進めるための適切なシステムとサービスは用意されていましたが、これらの機能を使用するための移行は、この事故の前に完了していませんでした。当社の既存のモニタリングシステムがあることで、証明書の有効期限切れによる危険性から、我々は実際よりも保護されていると確信していました。今後当社では、この証明書やその他の証明書を自動更新へ移行する作業を行っていく予定です。その間に、すべての証明書の手動監査は既に完了しています。

使用されていたサービス間のワイルドカード証明書が何百にも上る異なる運用サービスでインストールされていたため、このように大規模な影響が及んだ結果となりました。当社ではこの証明書の管理にAWS ACM(AWS Certificate Manager)を使用しており、数百の運用サービスにおいて数分ですばやく証明書の更新、適用が可能になっていました。有効期限の問題はAWS ACM自体とは関係なく、当社独自の証明書の管理と関係がありました。今後当社では、証明書が影響を及ぼす範囲の分離に取り組み、その一環としてAWS ACMで証明書を使用するプロセスを更新する予定です。

 

2) Epic Games Launcherサービスへのトラフィックが大幅に増加

ほとんどのサービスは、証明書の更新直後に回復しましたが、Epic Games Launcherサービスは事実上利用ができない状態のままでした。

午後12時46分(協定世界時)、証明書の発行に続いて、リクエスト率の急増がEpic Games Launcherクライアントをサポートする主要なバックエンドサービスであるEpic Games Launcherサービスを圧倒しました。リクエスト率の増加は、クライアントにおける予期しない再試行ロジックが原因で発生しました。これは、障害のシナリオでのみ見られます。Epic Games Launcherでは長年にわたり数々の回復作業を行ってきましたが、このリクエストの増大は予想外のものでした。接続の追跡の制限がホストに適用され、フリート全体でパケットがドロップしたため、バックエンドアプリケーションフリートを250%拡張したにもかかわらず、回復はかなり困難になりました。Epic Games Launcherサービスでは連鎖障害と完全停止が発生し、回復には、バックエンドへのトラフィックを制限し、システムへのトラフィックを段階的に戻しながら、同時に接続追跡の制限を増やす必要がありました。

Epic Games Launcherクライアントの莫大なフットプリントは、Epic Games Launcherバックエンドサービスへの数千万の接続を試み、Epic Games Launcherのシステムコンポーネントはこの負荷により劣化しました。これを回復するには、バックエンドへのトラフィックを移行する必要がありました。通常、このサービスではバーストキャパシティを使用できますが、停止状態の開始時に観測された28倍の負荷にさえ対処できませんでした。

Epic Games Launcherバックエンドのロードバランサへのリクエスト数(毎分)のグラフ。当初、トラフィックは通常の28倍でしたが、午後3時12分(協定世界時)時点の最終ピークは通常の40倍にまで上昇しました。


リクエスト数は通常の28倍を超えていましたが、Epic Games Launcherバックエンドサービスへの膨大な接続数により、利用可能な接続の追跡スペースが完全に消費され、その結果パケットロスが生じ、最終的にバックエンドノードからの接続が低下しました。バックエンド接続負荷は、通常レートの3200倍にまで増加しました。TCP接続の増加は、リクエスト数よりもはるかに高くなりました。

Epic Games Launcherバックエンドのロードバランサへの新規接続数(毎分)のグラフ。通常のピークと比較して、接続数が3200倍に増加。

 

要因


有効期限が切れたTLS証明書により停止が発生し、それがLauncherクライアントで予期しない動作を引き起こしました。調査の結果、クライアントの再試行では、予想した指数バックオフではなく、線形の再試行ロジックが使用されていたことが判明しました。さらに予期しないバグにより、Epic Games Launcherクライアントからの何百万ものリクエストパターンが、正常な応答が受信されるまで連続的かつ無限に再試行される原因となりました。クライアントのインストールベース全体に及ぶこれらの2点のバグにより、意図しない不測の呼び出しパターンが作成されました。DDoS処理はクライアントによって効果的に行われました。また、Epic Games Launcherのアップデートで早急にこれらのバグの修正に取り組んでいます。

この現象のこの部分における興味深い要因は、初期の停止期間の長さです。停止が長引くほど、より多くのクライアントが機能しない再試行ロジックを利用し、バックエンドを継続的に呼び出す可能性が高くなります。最初の停止時間が短かければ、システムの負荷を高めるクライアントによる継続的な呼び出しの再試行が蓄積しなかった可能性があり、この停止期間だけがこのケースを引き起こしたことになります。この件については、通信パターンを変更することで解決する予定です。

接続追跡の警告が十分把握されていませんでした。この警告は、Epic Games Launcherサービスの事故の最中に発生しました。この警告の意味に精通しているチームも複数いますが、警告の説明と通知は十分に明確ではなく、この状態が内部のRedisクラスターへの接続性を含む、ホストの接続へのパケットロスを引き起こすことになるとは理解されていませんでした。これは、Redisクラスターへの接続が低下したときに何が起こっているのかを調査するチームにとって、ストレスの多いものでした。当社のキャッシュメカニズムが一因ではないかと考えられました。これは後に、接続追跡テーブルがいっぱいになり、使用中の数十万に及ぶ接続によるパケットロスが原因であることが判明しました。事故の後半では、接続追跡の制限をノードあたり100万を超えるまで引き上げましたが、インフラストラクチャーでの接続追跡の増加は瞬時に実装されず、時間がかかりました。当社では、この問題が解決されるまで、ネットワークの重大な問題が発生することをより明確にするために、警告のアップデートに取り組んでいきます。

スケールアップにより、新規のノードが即座に接続追跡の制限に達しました。フリートが接続で過負荷になり、深刻なパケットロスが発生したため、フリートへの全体的なトラフィックを減らし、許容内のトラフィックを徐々に増やす必要がありました。私たちがまず試したのは、AWS WAF(Web Application Firewall)を使用してインバウンドトラフィックのサブセットに制限することでした。しかし、構成により十分なトラフィックを制限できませんでした。これはAWS WAFに起因するものではなく、当社独自のルールセットの問題でした。次に時間の都合上、AWSロードバランサの目標値を使用して一部のトラフィックを移動しました。これは、接続追跡制限の増加とともに、最終的に成功しました。このシナリオでWAFを使用したことにより、Epic Games Launcherサービスの回復が遅れましたが、AWSに起因するものではありません。AWS WAF、ロードバランサの目標値、またはその他のAWSテクノロジーを使用して、このような重大な状況でフィルターをかけたトラフィックを緊急に読み込みができる標準プロセスを開発する予定です。

 

3) Epic Games Storeウェブサイトの無効なアセット

午後3時12分(協定世界時)、証明書が更新され、Epic Games Launcherサービスが回復したため、Epic Games Storeを呼び出す全クライアントのブロックを解除しました。停止期間が長かったため、Epic Games Storeにコンテンツをリクエストするクライアントが通常よりも大幅に増え、当然の結果としてスケールアップが始まりました。午後3時30分(協定世界時)頃、残りの影響に関する見積もりを開始。

当初はすべて正常に見えましたが、Epic Games Storeでのレイアウトの問題やエラーに関する内部報告を受け取り始め、その点に関しては確認と再現ができました。詳しく調査したところ、Webクライアント(epicgames.comの閲覧ユーザーがEpic Games Storeと関わる方法)が、CDNに存在しない固有アセットIDを取得しようとしていることが判明しました。フリート全体に配置されたすべてのコンテナバージョンを確認したところ、それらはすべて同じでした。しかし、それが事実なら、同じアプリケーションバージョンが異なる静的アセット値に戻る可能性はありません。

何かが正常ではありませんでした。これは事故で非常に混乱した期間であり、最終的に、利用可能な信号の多く(展開されたバージョンなど)は誤った信号であることが判明しました。Epic Games StoreのバックエンドのスケーリングをCDNの403の増加と関連づけることができたため、新しい事例をより詳細に調査する道が開かれました。新たな事例においてコンテンツをローカルでcurlを使用して転送すると、戻って来るコンテンツが無効であることがわかりました。これにより、前日に作成された新しいCI/CDワークフローへの予期しないコンテナプッシュにまでさかのぼることができました。それ以外の点は、この事故中に遭遇したものとはまったく関係がありませんでした。それでも、これらの結果は驚くべきものでしたが、最終的にこれを発見した後、コンテナバージョンを迅速に巻き戻し、無効なインスタンスを終了し、トラフィックを回復することができました。

この問題は、この期間に有効になった大規模なスケールアップの際に発生した可能性もありましたが、通常はフリート全体に十分な余裕があるため、Epic Games Launcherのトラフィックが原因でEpic Games Storeで大幅なスケールアップが発生されるまで、この問題は明らかにならなかったのです。

 

要因


証明書の停止によりEpic Games Launcherの問題が発生し、復旧するとEpic Games Storeへのリクエストが殺到したため、その結果、Epic Games Storeシステムがスケールアップしました。これは予測対応の想定内です。

アプリケーションフリート全体のバージョン状態に関する信号とデータは、フリートの展開が均一であるという誤解を生みました。今後こういった診断の誤りを防ぐため、バージョン管理スキームを変更しました。

Epic Games StoreのCI/CDパイプラインへの最近の変更には、アプリケーションアーティファクトを予期せず更新する構成ミスがありました。これに関しては、CI/CDパイプラインを変更して修正され、予期しない変更が元に戻されました。再び発生した場合は、バージョン管理スキームの変更によって保護されます。


時系列

  • 午後12時00分(協定世界時) - 内部証明書の有効期限の失効
  • 午後12時06分(協定世界時) - 事故が報告され、インシデント管理を開始
  • 午後12時15分(協定世界時) - 顧客向けの最初のメッセージを作成
  • 午後12時21分(協定世界時) - 複数のチームにより大規模なサービス障害を確認
  • 午後12時25分(協定世界時) - 証明書の再発行プロセスが開始されたことを確認
  • 午後12時37分(協定世界時) - 証明書の再発行を確認
  • 午後12時46分(協定世界時) - 一部のサービスの復旧を確認
  • 午後12時54分(協定世界時) - 接続の追跡がEpic Games Launcherサービスの問題であることが発覚
  • 午後1時41分(協定世界時) - Epic Games Launcherサービスノードを再起動
  • 午後3時05分(協定世界時) - Epic Games Launcherサービスの接続の追跡制限を増加
  • 午後3時12分(協定世界時) - Epic Games Launcherサービス復旧の最初の兆候
  • 午後3時34分(協定世界時) - Epic Games Storeウェブサービスのスケールアップ
  • 午後3時59分(協定世界時) - Epic Games Storeでアセット不足の最初の報告
  • 午後4時57分(協定世界時) - Epic Games Storeウェブサービスのバージョンの不一致に関する問題を検出
  • 午後5時22分(協定世界時) - Epic Games Storeウェブサービスのバージョンを修正
  • 午後5時35分(協定世界時) - 完全復旧


今後の取り組み

上記のセクションでは、4月6日の突発的な出来事が最終的にはサービスの停止に陥った工程について説明しました。要因と次のステップについて説明しましたが、ここでも要約しておきます。

これらの問題の根本的な原因は1つではありません。技術的また組織的な無数の要因が、この出来事をエスカレートさせる結果になりました。停止状況の影響範囲と期間は、システムの詳細なバグ(修正に取り組む予定です)を発見するだけでなく、一部の内部プロセス、特に証明書管理のプロセスにおける、以前は疑問視すらされていなかった思い込みに気づくことに役立ちました。

当社では、速やかに新しい証明書モニタリングシステムでこの領域を補完できるようにし、既存既知の証明書すべてを監査しました。同時に、証明書モニタリングのギャップをさらに詳しく調べ、 AWS ACMに関わる証明書すべてをモニタリングするAWS Configを追加するなど将来に備えていく予定です。また、特定の証明書の影響範囲を減少させるよう取り組む計画です。

Epic Games Launcherのクライアントの呼び出しパターンを詳しく調べ、その際に特定したバグのいくつかは早急に修正するとともに、トラフィックが大幅に増加した状況への対応能力を向上させます。このフリートの接続追跡テーブルの恒久的な増加により、大きなパケットロスを引き起こすことなく同様量の負荷を処理できると考えています。大規模なフリートを実行している場合は、接続追跡テーブルの制限を確認し、このネットフィルター機能を利用している場合は警告を確認することをお勧めします。また、クライアントの再試行ロジック、特に長期間の停止後にクライアント全体がどのように動作するかを確認するための教訓としていただければ幸いです。

Epic Games Storeでは、ライブアプリケーションオブジェクトの変更を防ぐための修正を導入しました。その過程で、アセット生成のバグについて習得・修正しました。

この事故報告書で、4月6日に起きたことについて詳細を知っていただければと考えています。また、これらの詳細を提供することで、当社が学び改善した点を明らかにし、外部で同様の問題が発生した際に回避するために役立つことを願っています。


参加しませんか!

この投稿は、ここEpicの素晴らしい多くのエンジニアリングチームから多大な支援を得て、Reliability Engineeringチームによって作成されました。

こういった問題に興味がありますか?ゲームやゲームサービスに情熱を持っていますか?Epicは常に優秀な人材を求め、世界中からあらゆる専門分野の技術者を採用しています。当社で現在募集中の職種を検索する場合は、採用情報(Epic Games Careerハブ)にアクセスしてください。

この投稿は役に立ちましたか、または面白いと感じましたか?public-incident-response@epicgames.comまでご意見をお寄せください。