プロンプトとスコープ
このシステムデザインの設問は、プラットフォーム、クラウドインフラ、組み込みシステムの職種を対象としています。デバイスは何週間もオフラインになる可能性があり、ストレージが限られていたり、セルラー帯域幅にコストがかかったりすることがあります。不良イメージはフリート全体をオフラインにしてしまう恐れがあります。プラットフォームは、互換性のあるデバイスのみが署名済みパッケージをインストールすること、ロールアウトを一時停止できること、そしてデバイスが回復するか以前のバージョンに戻れることを保証しなければなりません。
デバイス数は100万台、1日あたりのダウンロード数は最大100,000回、アップデートサイズは20 MiBと仮定します。デバイスはモデル、ハードウェアリビジョン、リージョン、現在のバージョンによってグループ化されます。回答にAWSは必須ではありません。クラウド製品はコントロールプレーンとデータプレーンの境界を具体化するのに役立つだけです。
面接官が評価するポイント
- パッケージの完全性、発行元の認証、デバイスの認可、互換性チェックを分離しているか。
- 単にダウンロード用のバケットを描くだけでなく、コントロールプレーンとデバイスのデータプレーンの状態遷移マシンを設計しているか。
- 帯域幅、並行性、中断しきい値を計算し、一時停止、再試行、ロールバック、および人間によるエスカレーションを説明できるか。
優れた回答では、「ロールアウトの成功」をCDNダウンロードの完了ではなく、デバイスの検証、インストール、再起動、およびヘルス確認として定義します。
回答前の明確化事項
- デバイスは2つのスロットから起動できますか? A/Bスロットを使用すると、非アクティブなスロットに書き込み、起動に失敗した後にフォールバックできます。シングルスロットのデバイスには、より保守的なブートローダーと現場での復旧パスが必要です。
- 安全性や地域に関する制約はありますか? ターゲティングには、単なるデバイスラベルだけでなく、モデル、ハードウェア、リージョン、証明書の状態、現在のバージョンを含める必要があります。
- アップデートの期限はいつですか? 期限によって、バッチサイズ、メンテナンスウィンドウ、オフラインでの再試行、強制インストールが許容されるかどうかが変わります。
- 障害はデバイスレベルですか、それともコホートレベルですか? 単一のデバイスは再試行できます。あるモデルで障害率が高い場合は、グローバルに展開するのではなく、そのコホートを一時停止する必要があります。
30秒での回答
「私はプラットフォームを、署名済みパッケージリポジトリ、リリースコントロールプレーン、デバイスエージェント、テレメトリに分割します。リリースポンプラインはモデル、ハードウェア、バージョン、依存関係、有効期限を含むマニフェストを作成し、管理された環境で署名し、インストール前にデバイスに署名、ダイジェスト、互換性を検証させます。コントロールプレーンは、カナリア、固定レート、または指数関数的ロールアウトでコホートをターゲットにし、冪等なジョブIDでデバイスごとの状態を保存します。デバイスは非アクティブスロットにチャンクを再開可能形式でダウンロードし、再起動し、ヘルスチェックに合格した後にのみコミットします。障害、ダウンロードエラー、ブートロールバック、またはセキュリティアラートの増加が発生した場合、コホートを一時停止し古いバージョンを維持します。オフラインデバイスはメンテナンスウィンドウで再試行し、すべてのアクションは監査可能かつ再生可能です。」
ステップバイステップの詳細な回答
ステップ1:主要なボトルネックを見積もる。
100万台のデバイスが20 MiBをダウンロードする場合、合計は約20 TiBになります。1日あたり100,000台のデバイスを完了するには、約2 TiB/日、平均で23.7 MiB/sになります。ピーク時には並行性と再試行のためのヘッドルームが必要です。オブジェクトストレージとCDNがパッケージを配信します。コントロールプレーンは、デバイスに大規模なデータベースをポーリングさせるのではなく、マニフェストと有効期限の短いダウンロード認可を送信します。
ステップ2:真正なパッケージとマニフェストを作成する。
ビルドパイプラインは不変バイト、ダイジェスト、マニフェストを生成します。署名キーは管理された署名サービス内に保持され、リリースには署名者のバージョンと承認が記録されます。デバイスはトラストルートを持ち、署名、パッケージダイジェスト、ターゲットモデル、最小ブートローダー、アンチロールバックカウンター、および有効期限を検証します。ダウンロードURLは転送メカニズムにすぎず、信頼の境界ではありません。
ステップ3:コントロールプレーンとデータプレーンを分離する。
コントロールプレーンはリリースの作成、ターゲットの解決、コホートとデバイスジョブの作成、一時停止コマンドの発行を行います。デバイスのデータプレーンはCDNからチャンクをダウンロードし、ジョブエンドポイントに状態をレポートします。各デバイスは(device_id, job_id)を冪等に更新するため、重複したレポートによって状態が誤って移行することはありません。状態にはQUEUED、DOWNLOADING、VERIFIED、INSTALLING、SUCCEEDED、FAILED、ROLLED_BACK、REJECTEDが含まれます。
ステップ4:安全なインストールとロールバックを設計する。
非アクティブスロットにパッケージを書き込み、各チャンクと最終マニフェストを検証してから、ブートスロットを切り替えます。ブートローダーは試行回数とブート確認の期限を記録します。アプリケーションはヘルスチェック、重要なセンサー、および通信が回復した後にのみ確認を行います。失敗が繰り返されると古いスロットが選択され、理由がレポートされます。シングルスロットデバイスにはリカバリイメージまたは現場対応が必要です。自動的にA/Bのアトミック性が得られるわけではありません。
ステップ5:ロールアウトを制御する。
社内デバイスと小規模なカナリアから開始し、モデルとリージョンごとに拡大します。固定レートまたは指数レートのどちらも有効ですが、すべてのコホートに最大並行数、メンテナンスウィンドウ、中断基準が必要です。コホートごとにしきい値を測定し、ダウンロード失敗、署名拒否、インストール失敗、ブートロールバック、ヘルスチェックタイムアウトを区別します。
ステップ6:オフラインデバイス、再試行、監査を処理する。
デバイスが再接続すると、期限切れでないジョブを取得します。チャンク単位のダウンロードは再開機能と指数バックオフを使用します。再試行では同じジョブとパッケージバージョンが再利用されます。期限を過ぎたデバイスは、成功としてマークされるのではなく、修復キューに入ります。コントロールプレーンは、再生とコンプライアンスのために、承認、マニフェスト、ターゲットスナップショット、状態遷移、実行者、一時停止の理由を保持します。
質の高い模範解答
「私はコントロールプレーン、パッケージリポジトリ/CDN、デバイスエージェント、テレメトリを分離します。リリースポンプラインは不変バイトと、ターゲットモデル、ハードウェアリビジョン、最小ブートローダー、バージョンカウンター、ダイジェストを含むマニフェストを作成します。管理された署名サービスがこれに署名し、デバイスは組み込みのトラストルートで検証します。ダウンロードURLはバイトを転送するだけです。
100万台のデバイスの場合、20 MiBのパッケージは約20 TiBになるため、CDNが配信を処理し、コントロールプレーンがリリースとデバイスごとのジョブ状態を保存します。デバイスはチャンクを非アクティブスロットにダウンロードし、ダイジェストを検証し、再起動し、ヘルス確認後にのみコミットします。失敗した場合は古いスロットを選択し、理由をレポートします。カナリアから開始し、モデルとリージョンごとに拡大します。各コホートには並行性、障害率、ロールバック率のしきい値があり、これを超えると不良イメージを拡散させる代わりにロールアウトを一時停止します。オフラインデバイスはメンテナンスウィンドウで同じジョブを取得し、再試行は再開され、承認、状態、バージョンは監査可能な状態に保たれます。」
よくある間違い
- HTTPSのみをチェックする → トランスポートセキュリティはパッケージやそのバイトを認証しない → デバイス上でマニフェスト署名とパッケージダイジェストを検証する。
- ダウンロード後に成功とマークする → インストール、起動、ヘルスチェックが失敗する可能性がある → ブート確認を最終的な成功条件にする。
- フリート全体に一括展開する → 1つの互換性の欠陥が全員に影響を与える可能性がある → カナリア、コホート、レート、中断基準を使用する。
- 再試行のたびに新しいジョブを作成する → 状態と監査履歴が断片化する → 冪等な
(device_id, job_id)状態を再利用する。 - 任意のダウングレードを許可する → 攻撃者が脆弱なイメージをリプレイできる → 署名付きバージョンカウンター、アンチロールバックポリシー、管理された例外リストを使用する。
フォローアップと回答
フォローアップ1:2%のロールアウト時点で、1つのモデルが4%のブートロールバック率に達しました。どうしますか?
成功したデバイスの観察を継続しながら、そのモデルとパッケージバージョンを直ちに一時停止します。ハードウェアリビジョン、ブートローダー、リージョン、ビルドごとにスライスして互換性の境界を特定し、必要に応じて検証済みの古いバージョンまたはリカバリコマンドを展開します。フリート全体の平均が低いからといって継続してはなりません。
フォローアップ2:ダウンロードが80%完了した時点でデバイスの電源が切れました。次の試行で最初からやり直すのを防ぐにはどうすればよいですか?
非アクティブスロットにチャンクを書き込み、パッケージバージョン、チャンクダイジェスト、確認済みオフセット、マニフェスト全体のダイジェストを永続化します。再起動後、ローカルチャンクとマニフェストを検証し、最後の連続した信頼できるチャンクからの範囲をリクエストします。パッケージまたは署名が変更された場合は、2つのバージョンを結合するのではなく、一時スロットを破棄します。
フォローアップ3:攻撃者が有効な古いパッケージをリプレイするのを防ぐにはどうすればよいですか?
マニフェストに単調増加バージョンカウンターまたはセキュリティバージョンを含め、承認された最大値をデバイスに永続化します。ブートローダーはより低い値を拒否します。緊急ロールバックには、管理された署名、明示的なコホート、監査に記録された期間限定の認可が必要であり、通常のダウンロードエンドポイントがアンチロールバックをバイパスすることはできません。