TT Lab
はじめる
学ぶ 学習パス コース

FDE総合演習:倉庫に同じ注文が3回届いた

インストールは成功したが、ポートはすでに他人のものだった

TT Labで続きを見る

一言でいうと

事前チェック(preflight)は、インストールの前に、顧客のホストが要件を満たしているかを、読み取りだけで判定し、その結果を、人ではなく次の段階の自動化が読める報告書と終了コードとして残すことです。

なぜ必要なのか

顧客の現場のインストールの時間枠は、たいてい一度きりです。木曜の夜22時にインフラチームが扉を開けてくれて、午前0時には閉まります。こうした場で、インストールのスクリプトが「完了」で終わったという事実は、ほとんど何も保証しません。ファイルは所定の場所にコピーされても、エージェントが使おうとしたポートは社内プロキシがすでに握っていて、起動した途端に落ちることがありますし、顧客が渡した証明書は、インストールの3週間前に期限が切れているかもしれません。どちらも、インストールのあとでログを調べてはじめてわかりますが、インストールの前なら、5分でわかる事実です。

FDEが顧客に引き渡すのは、コードではなく動作する結果です。そのため、インストールの手順の前に、「このホストで、インストールが成功する条件がそろっているか」を、別に尋ねる段階を置きます。この段階を人のチェックリストにすると、毎回誰かが抜かします。スクリプトにして結果をファイルに残せば、顧客に、「インストールを妨げるのはこの2つで、残りは警告です」と、根拠を添えて伝えられます。

どう動くのか

チェッカーは、要件の仕様を入力として受け取り、チェックごとに、pass・warn・failのどれかと観測値を出します。観測値が重要です。「ポート失敗」とだけ書かれた報告書は、反論できませんが、検証もできません。observed: in_useと、測ったパス・空きMiB・notAfterの時刻が一緒にあってはじめて、顧客の担当者が、自分の目で確認し直せます。

終了コードは、監視プラグインの慣例を借りると、説明しやすくなります。Monitoring Pluginsの開発ガイドラインは、0 OK、1 Warning、2 Critical、3 Unknownを使い、3は、引数が間違っていた場合や、チェッカー自身が動けなかった場合に限定しています。名前解決の失敗やソケットのタイムアウトのような、上位のエラーを、Unknownに上げないように書いている点が、注目に値します。ホスト名が解決できないのは「わからない」ではなく、インストールを妨げる事実だからです。

チェック1つ1つに、よくある落とし穴があります。

명세(spec.json) ──▶ preflight.py ──▶ report.json   (점검마다 status + observed)
                          │
                          └──▶ 종료 코드 0 · 1 · 2  (명세를 못 읽으면 3, 보고서 없음)

現場での姿

最もよく見る失敗は、チェッカーが直してしまうことです。データディレクトリがなければ作り、ポートを握っているプロセスを殺し、期限切れの証明書を自己署名のものに差し替えます。その瞬間、チェックの結果は、「もともとこのホストがどうだったか」を失います。そのうえ、ディレクトリの所有権、ポートを握っていた社内プロキシ、証明書の発行の手続きは、すべて顧客の組織の決定です。事前チェックは事実を明らかにし、直す作業は、担当者が合意した手続きで行います。今回の顧客メモにも、作業ディレクトリはインフラチームが作ってくれることになっていると書かれています。

2つ目は、警告と失敗を混ぜることです。空き容量が、サプライヤーの最小値は超えていても、運用チームの基準より少ないなら、インストールはできます。これを失敗にまで上げると、インストールの時間枠を無駄にし、まったく知らせなければ、2か月後にディスクが満杯になります。警告の等級を別に設ける理由です。

実務で本当に大切なこと

次のラボですること

顧客メモを仕様に移し、ポート・TIME_WAIT・ディスク・証明書・ファイル・ホスト・書き込みのチェックを、順に実装します。採点ツールは、毎回異なるポートと基準値、自分で作った期限間近・期限切れの証明書で、あなたのチェッカーを実行し、判定と観測値を照合します。最後に、顧客の仕様で実際の判定を下し、go / no-goの記録を残します。