障害の発生を知らせる呼び出しをきっかけに過去のポストモーテムを検索し、症状の近い障害の原因・効いた暫定対処・再発防止策の進み具合を当番のエンジニアに示す
当番のエンジニアが障害で呼び出されたときに、過去のポストモーテムから症状の近い障害を探します。その原因、効いた暫定対処、再発防止策が終わっているかを、根拠の報告書付きで障害対応のチャンネルに並べます。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- EC/IT・SaaS/物流/金融
- 対象部門
- 情報システム
- 対象業務
- 情報検索/要約
- 主な課題
- 判断に時間がかかる/引き継ぎができていない/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 対応スピード向上/属人化解消/検索時間短縮
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 監視のアラートから PagerDuty が当番を呼び出す
- 当番が応答し、Slack に障害のチャンネルを作る
- 監視の画面でどのサービスに何が起きているかを見る
- 並行して、ポストモーテムの置き場をサービスの名前やエラーの言葉で探す
- それらしい報告書を開き、タイムラインと暫定対処を読む
- 見つからなければ、チャンネルでベテランに「前にこういうのあった?」と聞く
- 見つけた報告書の再発防止策のチケットを開き、終わっているかを確かめる
- 暫定対処を選び、障害の指揮者と相談して実行する
- 自動監視のアラートから PagerDuty が当番を呼び出す
- 自動呼び出しの発生をきっかけに、障害の題名・サービス・アラートの名前を受け取る
- 自動サービスとアラートの名前で絞り、症状の言葉で過去のポストモーテムを探す
- 自動当たった報告書ごとに、再発防止策のチケットの状況を引く
- 自動報告書の段落とチケットの状況を生成AIに渡し、原因・暫定対処・再発防止策の状況を引用付きで並べさせる
- 自動結果を障害のチャンネルにスレッドで投稿する
- 人当番のエンジニアが候補を読み、根拠の報告書を開いて確かめる
- 人当番が気づいたこと(監視で見えた症状)をメモに書くと、もう一度探し直す
- 人暫定対処を選び、障害の指揮者と相談して実行する
各工程の詳しい説明を読む
- 監視のアラートから PagerDuty が当番を呼び出す
- 当番が応答し、Slack に障害のチャンネルを作る
- 監視の画面でどのサービスに何が起きているかを見る
- 並行して、ポストモーテムの置き場をサービスの名前やエラーの言葉で探す
- それらしい報告書を開き、タイムラインと暫定対処を読む
- 見つからなければ、チャンネルでベテランに「前にこういうのあった?」と聞く
- 見つけた報告書の再発防止策のチケットを開き、終わっているかを確かめる
- 暫定対処を選び、障害の指揮者と相談して実行する
(a)探す言葉が合わない。 報告書の題名は「決済APIの応答遅延(2024年3月)」のように書かれ、アラートの名前や監視の指標の名前とは一致しません。 当番が見ている画面の言葉で探しても、報告書が出てきません。
(b)報告書のどこに止め方が書いてあるかが探しにくい。 タイムラインの中に「14:32 接続プールの上限を引き上げ、14:40 応答が回復」と書かれていても、長いタイムラインのどこかを読み当てるまで分かりません。
(c)再発防止策の状況を見に行く余裕が無い。 7番目は、障害の最中には省かれがちです。「直したはず」の再発防止策が実は止まっていたことは、障害が終わってから分かります。
(d)知っているのがベテランだけ。 6番目は早くて確実ですが、夜中に聞ける相手はいません。 当番に入ったばかりのエンジニアほど、聞くのをためらいます。
- 【自動】 監視のアラートから PagerDuty が当番を呼び出す
- 【自動】 呼び出しの発生をきっかけに、障害の題名・サービス・アラートの名前を受け取る
- 【自動】 サービスとアラートの名前で絞り、症状の言葉で過去のポストモーテムを探す
- 【自動】 当たった報告書ごとに、再発防止策のチケットの状況を引く
- 【自動】 報告書の段落とチケットの状況を生成AIに渡し、原因・暫定対処・再発防止策の状況を引用付きで並べさせる
- 【自動】 結果を障害のチャンネルにスレッドで投稿する
- 【人】 当番のエンジニアが候補を読み、根拠の報告書を開いて確かめる
- 【人】 当番が気づいたこと(監視で見えた症状)をメモに書くと、もう一度探し直す
- 【人】 暫定対処を選び、障害の指揮者と相談して実行する
7番目と9番目が、この設計の分かれ目です。 投稿は過去の報告書を並べたものであって、指示ではありません。似た症状の障害でも、今回の原因が同じとは限りません。 過去に効いた暫定対処が今回も安全かを決めるのは、当番と指揮者です。
4番目を機械で引いているのも、意図してのことです。 チケットが閉じているかどうかは、チケットの状態で確実に決まります。生成AIに報告書から「直ったか」を推測させると、予定として書かれた再発防止策を「済み」と読みます。
02今回想定するシステム構成
監視のアラート ▼ PagerDuty(当番の呼び出し) ▼【トリガー】Webhook(incident.triggered/incident.annotated) AWS Lambda ── 題名・サービス・アラートの名前・メモを取り出す ▼ Amazon OpenSearch Service(ポストモーテムの段落の索引) ├─ 絞り込み:サービス(関係するサービスを含む) ├─ 症状:アラートの名前は keyword で一致、症状の言葉は match(Sudachi) └─ 新しさ:function_score の gauss で発生日を重み付け ▼ AWS Lambda ── 報告書ごとに段落をまとめ、再発防止策のチケットの状態を引く ▼ Claude API ── 検索結果のブロックで渡し、原因・暫定対処・再発防止策を引用付きで並べる ▼ Slack(障害のチャンネルのスレッドに投稿)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(Sudachi、keyword の一致、function_score) | Azure AI Search、Vertex AI Search(Agent Search) |
| 生成AI | Claude API(検索結果のブロックを引用付きで並べる) | Gemini API、OpenAI API |
| 連携 | AWS Lambda(Webhook の受け取り、検索、チケットの照会、投稿) | AWS Step Functions |
| 呼び出し | 既存の PagerDuty | Opsgenie |
| 通知 | 既存の Slack | Microsoft Teams |
| 保管 | Amazon S3(索引に入れる前の報告書の写し、投稿の記録) | ― |
PagerDuty と Slack は新しく足すものではありません。 この構成が書き込むのは、障害のチャンネルへのスレッドの投稿だけです。障害の状態を変えたり、当番を呼び出し直したりはしません。
ポストモーテムが何を書くものかは、運用の前提として確かめておきます。 Google の SRE の本では、ポストモーテムは障害の記録、その影響、緩和や解決のために取った行動、根本原因、再発を防ぐためのフォローアップの行動を書いたものとされています。書く条件の例として、利用者に見える一定以上の停止や劣化、データの損失、当番の介入(ロールバックや通信の切り替えなど)、一定以上の復旧時間、監視の失敗が挙がっています。この見出しの分け方が、そのまま索引の段落の分け方になります。
日本語の本文は、Sudachi で語に分けます。 Amazon OpenSearch Service の対応プラグインの一覧では、Sudachi Analysis が日本語向けに推奨とされています。
03どうやって実装するのか
処理の起点を決める
PagerDuty の Webhook で、障害が新しく起きたことを受け取ります。 PagerDuty の Webhook(V3)は、サービス・チーム・アカウントのいずれかを範囲にして購読でき、triggered は障害が新しく作られたときに送られるとされています。購読は範囲ごとに10件までです。運用のチームの範囲で1つ購読すれば足ります。
当番がメモを書いたときにも、もう一度動かします。 annotated のイベントで、当番が障害に書いたメモを受け取ります。呼び出しの直後はアラートの名前しか分かりませんが、数分後には当番が「DBの接続数が上限」のような症状をメモに書きます。 その言葉で探し直すと、当たる報告書が変わります。2回目以降は、前の投稿のスレッドに返信する形にします。
Webhook の送り主は署名で確かめます。 V3 の購読は x-pagerduty-signature のヘッダーを付けて送り、購読を作ったときに検証用の秘密の値が渡されます。確かめない受け口は、誰からでも検索と投稿を動かせてしまいます。
索引の更新は別に動かします。 ポストモーテムが承認されたとき、その1件だけを索引に入れ直します。再発防止策のチケットの状態は索引に入れず、検索のたびに引きます。 索引に入れると、状態が古くなります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 障害の情報 | 題名、サービス、緊急度、アラートの名前、当番のメモ | PagerDuty の Webhook |
| ポストモーテム | 概要、影響、検知、タイムライン、暫定対処、根本原因、再発防止策、関係するサービス、発生日 | 社内の文書の置き場 |
| 再発防止策のチケット | チケットの番号、状態(未着手・対応中・完了・見送り)、担当チーム、完了日 | チケットの管理 |
| サービスの依存関係 | サービスごとに、依存する先と依存される元 | 自社で用意する一覧 |
質を決めるのは、ポストモーテムの「暫定対処」の書き方です。 タイムラインの中に埋もれていると、どの行が止め方なのかを機械で見分けられません。 ひな形に「暫定対処」の見出しを置き、何をしたか、いつしたか、効くまでに何分かかったかを書く決まりにします。
再発防止策には、チケットの番号を必ず書かせます。 番号の無い再発防止策は、状況を引けません。過去の報告書で番号の無いものは、最初の準備として書き足します。
データの取得方法を決める
ポストモーテムは、承認されたものだけを索引に入れます。 書きかけの報告書には、推測の原因や、あとで取り消された対処が残っています。承認の前は、検索の対象にしません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 障害の題名・サービス・アラートの名前 | PagerDuty の Webhook | 絞り込みと検索の言葉 |
| 当番のメモ | 同じ Webhook の annotated | 症状の言葉で探し直す |
| 報告書の段落 | 文書の置き場(承認済み) | 検索の対象と引用の元 |
| 再発防止策の状態 | チケットの管理の API | 「完了」「未完了」「見送り」を付ける |
| 依存関係 | サービスの一覧 | 依存する先のサービスまで絞り込みを広げる |
サービスの絞り込みは、依存する先まで広げます。 決済のサービスで応答が遅れていても、原因はその下のデータベースや認証のサービスにあることが多くあります。障害のサービスだけで絞ると、原因の側のサービスで書かれた報告書が出ません。
新しさは、絞り込みではなく点数で効かせます。 OpenSearch の function_score は、返す文書を変えずに順位を変えるものです。その中の減衰関数(gauss・exp・linear)は、数値・日付・位置の項目について、起点からの距離で点数を下げます。 日付の項目では起点を省くと now になり、offset の内側は点数1、scale と offset を足した距離で点数が decay(既定0.5)になります。
| 設定 | 値 | 意味 |
|---|---|---|
| 項目 | 発生日 | 報告書の障害の発生日 |
origin | 省略(now) | いまからの距離で測る |
offset | 365d | 1年以内は下げない |
scale | 730d | 3年前で点数が半分になる |
古い報告書を消さずに下げるのは、構成が変わっても原因の型は残るからです。 5年前の報告書の「接続プールの枯渇」は、いまの構成でも起きえます。
減衰関数には注意が1つあります。 公式のドキュメントでは、その項目が無い文書には点数1が返るとされています。発生日を入れ忘れた報告書は、新しさで下がらず、いちばん新しい報告書と同じ扱いになります。取り込みのときに発生日の無い報告書を止めます。
AIへ渡す前に整形する
- 見出しで段落に分ける … 概要、影響、検知、タイムライン、暫定対処、根本原因、再発防止策で分け、段落ごとに種類を付けます
- アラートの名前を取り出す … 報告書の「検知」の段落から、監視のアラートの名前を取り出し、keyword の項目に入れます
- タイムラインから止め方を拾う … 「暫定対処」の見出しが無い古い報告書は、タイムラインの中の「回復」「復旧」の直前の行を暫定対処の候補として印を付けます
- 数値と識別子を外す … ホスト名、IPアドレス、利用者のIDは、索引に入れる前に消します
- 障害の側の言葉をそろえる … PagerDuty の題名に入る監視の定型の文言(しきい値や時刻)を外し、アラートの名前とサービスだけを残します
2番目を軽く見ないでください。 当番が最初に持っている情報は、アラートの名前だけのことが多くあります。報告書の本文は人の言葉で書かれ、アラートの名前はほとんど出てきません。「検知」の段落からアラートの名前を取り出して完全一致で探せるようにすると、最初の数分で当たる報告書が増えます。
AIに処理させる
検索そのものは OpenSearch が行います。 問い合わせは、たとえば次の形になります。
{
"query": {
"function_score": {
"query": {
"bool": {
"filter": [
{ "terms": { "services": ["{障害のサービス}", "{依存する先のサービス}"] } }
],
"should": [
{ "terms": { "alert_names": ["{アラートの名前}"], "boost": 3 } },
{ "match": { "text": "{題名と当番のメモ}" } }
],
"minimum_should_match": 1
}
},
"functions": [
{ "gauss": { "occurred_on": { "offset": "365d", "scale": "730d", "decay": 0.5 } } }
]
}
}
}
アラートの名前の一致を、言葉の一致より重く置きます。 アラートの名前が同じなら、監視が同じ壊れ方を同じ場所で見つけたということで、言葉が似ているより強い手がかりです。言葉の一致は、アラートの名前が当たらない障害の受け皿にします。
当たった段落は、報告書ごとにまとめてから渡します。 同じ報告書の「根本原因」と「暫定対処」が別々に当たったら、1つの報告書として扱い、再発防止策の段落も必ず添えます。 渡すのは点数の上位5件の報告書までで、その中から生成AIに3件まで選ばせます。
生成AIにさせるのは、当たった報告書ごとに4つの見出しで並べることだけです。
| 見出し | 中身 |
|---|---|
| 原因 | 根本原因の段落から、何が起きていたかを1〜2文で |
| 止め方 | 暫定対処の段落から、何をして、効くまでに何分かかったか |
| その後 | 再発防止策と、渡したチケットの状態 |
| 今回との違い | 当番のメモや障害の情報と、報告書の症状の違い |
| させないこと | 理由 |
|---|---|
| 今回の原因の断定 | 似た症状でも原因が違うことは多い。決めるのは当番 |
| 実行するコマンドや手順を書くこと | 手順書の役割。過去の止め方は「何をしたか」までにする |
| 再発防止策の状態の推測 | チケットの状態を渡し、そのまま使わせる |
| 根拠に無い対処の提案 | 報告書に無い止め方を作らない |
2行目が、この構成の線引きです。 過去に効いた対処を、いまの環境でそのまま打てる手順のように書くと、当番は確かめずに実行します。 報告書が書かれた後に構成が変わっていれば、同じ操作が別の結果を招きます。手順は手順書の側に任せ、ここでは「何をしたか」までにします。
指示内容を固定する
あなたはSREチームで、いま起きている障害に近い過去のポストモーテムを、
当番のエンジニアのために整理する立場です。
渡した検索結果(報告書の段落)だけを根拠にしてください。
【いまの障害】題名:{title}/サービス:{services}/アラート:{alerts}
【当番のメモ】{notes}
【再発防止策の状態】報告書ごとに、チケットの状態を渡します。
done ......... 完了
open ......... 未着手または対応中
wont_do ...... 見送り
【やること】
報告書ごとに、次の4つを短く書いてください。
1. 原因:根本原因の段落から、何が起きていたか
2. 止め方:暫定対処の段落から、何をして、効くまでに何分かかったか
3. その後:再発防止策と、渡した状態
4. 今回との違い:いまの障害の情報と、報告書の症状の違い
【厳守事項】
- 検索結果に書かれていないことを書かないでください。
効くまでの時間が書かれていなければ「記載なし」としてください。
- 再発防止策の状態は、渡した値をそのまま使ってください。
報告書の文面から完了したかどうかを判断しないでください。
- 実行するコマンドや設定の値を書かないでください。
「接続プールの上限を引き上げた」のように、何をしたかまでにしてください。
- 今回の原因がどれかを断定しないでください。
- 近くない報告書は、無理に関連付けず「関連が薄い」と書いてください。
- 全体で、最も近い報告書から順に3件までにしてください。
「渡した値をそのまま使う」を明記しないと、報告書の文面から状態を推測します。 報告書の再発防止策は「〜を導入する」と書かれ、生成AIはこれを済んだことのように読みます。 状態はチケットから引いた値だけを使わせます。
「3件まで」にしているのは、障害の最中に読まれるからです。 10件並べても、当番は上の2〜3件しか読みません。読まれない候補で投稿を長くしないことが、そのまま速さになります。
出力形式を固定する
生成AIへは、検索結果のブロックで渡します。 公式のドキュメントでは、search_result のブロックに source・title・content を入れると、自社の文書を引用付きで答えます。 source に報告書のURL、title に障害の題名と発生日、content に段落を1つずつのテキストブロックで入れます。引用はテキストブロックの単位で付き、引用の設定はリクエストの中のすべての検索結果でそろえる必要があります。
返った文章と引用から、Slack に投稿する前に次の形に組み立てます。
{
"incident_id": "",
"matches": [
{
"postmortem_url": "",
"title": "",
"occurred_on": "",
"services": [],
"cause": { "text": "", "cited_text": "" },
"mitigation": { "text": "", "minutes_to_effect": null, "cited_text": "" },
"followups": [
{ "ticket": "", "status": "done | open | wont_do", "summary": "" }
],
"difference": ""
}
],
"searched_with": { "services": [], "alerts": [], "notes_used": true }
}
1つ目の理由は、followups の状態を見出しにできることです。 open の再発防止策がある報告書は、投稿の先頭に「未完了の再発防止策あり」と出します。 今回の障害がその続きである可能性を、当番が最初に見ます。
2つ目は、searched_with で何を使って探したかを残せることです。 当番は「アラートの名前だけで探した結果」か「メモの症状まで使った結果」かを見分けられます。
Slack への投稿は、障害のチャンネルのスレッドにします。chat.postMessage で、親の投稿の ts を thread_ts に入れると返信になります。 本文は text を4,000文字以内に収めます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| PagerDuty | Webhook(V3)の受け取り | triggered・annotated を受け、署名を確かめる |
| Amazon OpenSearch Service | 検索 | 段落の索引から探す |
| チケットの管理 | API の読み取り | 再発防止策の状態を引く |
| Claude API | API呼び出し | 検索結果のブロックで並べる |
| Slack | chat.postMessage | 障害のチャンネルのスレッドに投稿 |
Slack へは、障害ごとに投稿の数を絞ります。 chat.postMessage には特別な流量の制限があり、1つのチャンネルにはおおむね1秒に1件とされています。メモのたびに新しい投稿を重ねず、同じスレッドへの返信にまとめます。
チケットへは書き込みません。 再発防止策が止まっていると分かっても、優先度を上げるかは障害の後の振り返りで決めます。
人が確認する
- 根拠の確認(当番) … 投稿の引用から報告書を開き、原因と止め方の段落を確かめます
- 今回との違いの確認(当番) … 「今回との違い」に書かれた点を、監視の画面で確かめます
- 対処の判断(当番と指揮者) … 過去の止め方を参考に、今回の対処を決めます。手順は手順書で確かめます
- 当たり外れの記録(当番) … 障害の後、投稿の候補が役に立ったかをスレッドに印で残します
目安は、1件あたり12分です。 根拠の報告書を2件ほど開き、止め方の段落を読み、監視の画面と比べる時間です。全部の候補を読む必要はありません。
4番目を省かないでください。 当たり外れの印は、検索の重みとアラートの名前の取り出しを直す材料になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 近い報告書が1件も無い | 「近い報告書なし」と1行だけ投稿する。無理に並べない |
| Webhook の署名が合わない | 処理せず記録だけ残す |
同じ障害で annotated が続けて届く | 直前の検索から数分は束ねて1回にする |
| チケットの管理が応答しない | 状態を「取得できず」として投稿する。完了と見なさない |
| 発生日の無い報告書 | 索引に入れない(減衰関数で点数1になるため) |
| 報告書の「暫定対処」の見出しが無い | タイムラインから拾った候補に「推定」の印を付ける |
| 生成AIの応答が遅い | 検索の結果(報告書の題名とURL)だけを先に投稿し、整理は後から返信する |
最後の行が、障害の最中には大事です。 整理を待つより、題名とURLだけでも先に出るほうが当番の役に立ちます。
記録を残す
- 受け取った Webhook の内容と、署名の確認の結果
- 検索に使ったサービス・アラートの名前・メモ、返した報告書と点数
- 引いたチケットの状態と、引いた時刻
- 投稿した本文と引用、当番が付けた当たり外れの印
- 障害の後のポストモーテムで、この投稿の候補が原因と同じだったか
チケットの状態を引いた時刻を残すのは、後で状態が変わるからです。 障害の最中に「未完了」だったものが翌日に閉じられても、当時どう見えていたかを振り返りで確かめられます。
最後の行は、次の改善の材料になります。 当たった候補と原因が一致した割合を、四半期ごとに数えます。
04実装レベルの3段階
最小構成では、障害の最中に使えません。 貼り付ける時間がかかるので、確かめるための段階です。 半自動化で、1件30分が20分程度になります。 報告書は探しやすくなりますが、当番が検索の画面を開くこと、止め方を読み取ること、チケットを見に行くことが残ります。本格構成で12分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化で1か月回すと、暫定対処の見出しが無い報告書と、チケットの番号が無い再発防止策が分かります。そこを直してから投稿まで進むほうが、当番に信頼されます。
05工数削減シミュレーション
導入後 120件 × 12分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 自社のサービスを24時間動かしていて、障害のたびにポストモーテムを書く運用が数年続き、報告書が数百件たまっているSREや運用のチーム。当番の交代が多く、「前にも同じ壊れ方をした」の記憶がベテランにしか無い場合。PagerDuty で当番を呼び出し、Slack に障害ごとのチャンネルを作って対応している場合。再発防止策をチケットで管理しているが、障害の最中にその進み具合まで確かめられていない場合。
- ポストモーテムを書く運用がまだ無いか、数十件しかない場合(似た障害を探す元がありません)。報告書が「原因:設定ミス」の一行で終わっていて、検知・暫定対処・再発防止策が書かれていない場合(先にひな形をそろえるのが先です)。障害の大半が外部のクラウドの障害で、自社の原因分析をほとんどしない場合。なお、どの対処をいつ実行するかは当番のエンジニアと障害の指揮者が決め、この構成はそれを代わりに行いません。
07最小構成で試す方法
- 先月の障害から10件を選び、その障害の後に書かれたポストモーテムを用意する
- それぞれの障害より前に承認されていたポストモーテムから、同じサービスのものを20件ずつ選ぶ
- 手元のAIサービスの画面に、障害の題名・アラートの名前と、20件の報告書の「暫定対処」「根本原因」「再発防止策」の段落を貼り付ける
- 「いまの障害に近い報告書を3件まで選び、原因・止め方・再発防止策を書き出してください。書かれていないことは記載なしとし、コマンドは書かないでください」と指示する
- その障害の実際の原因と比べる
最小構成で確かめたいのは、報告書の中身で止め方が取り出せるかです。 探すのはまだ人が選んだ20件の中だけです。
| 出てきた内容 | 判断 |
|---|---|
| 実際の原因に近い報告書と止め方が出た | 索引と Webhook の仕組みに進む |
| 再発防止策を済んだことのように書いた | 状態を別に渡す設計で直る。構成は有効 |
| 報告書に止め方や効くまでの時間が書かれていない | ひな形を直すのが先。 AIの問題ではない |
3行目が出ることは珍しくありません。 止め方が書かれていない報告書は、人が読んでも障害の最中には使えません。ひな形に「暫定対処」の見出しを足すだけで、次の障害から変わります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| アラートの名前で探しても報告書が当たらない | 「検知」の段落からアラートの名前を取り出し、完全一致で探す |
| 障害のサービスだけで絞り、原因の側の報告書が出ない | 依存する先のサービスまで絞り込みを広げる |
| 再発防止策を済んだことのように書く | チケットの状態を別に引いて渡し、そのまま使わせる |
| 発生日の無い報告書がいつも上に来る | 減衰関数は項目が無いと点数1。取り込みで止める |
| 過去の止め方を手順のように書く | コマンドや設定の値を書かせない |
| 書きかけの報告書の推測の原因が出る | 承認済みのものだけを索引に入れる |
| メモのたびに投稿が増える | 同じスレッドへの返信にまとめ、続けて届いたものは束ねる |
| 生成AIの応答待ちで投稿が遅れる | 題名とURLだけを先に投稿する |
| 署名を確かめずに受け付ける | x-pagerduty-signature を確かめる |
| 候補が多すぎて読まれない | 3件までにする |
上の2行が、この構成の失敗のほとんどです。 どちらも、当番が持っている言葉と報告書の言葉がずれていることから来ています。アラートの名前とサービスの依存関係でつなげるかどうかで、最初の数分に当たるかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 障害の情報、ポストモーテムの本文、再発防止策のチケットです。報告書には、システムの構成や弱いところが詳しく書かれています。
- 索引に入れる前に識別子を外す … ホスト名、IPアドレス、利用者のIDは、探すのに要りません。外してから索引と生成AIに渡します
- 投稿先を障害のチャンネルに限る … 報告書の内容は社内でも見せる範囲が決まっていることがあります。投稿は当番と対応者が入るチャンネルだけにします
- 生成AIの入力の扱いを確かめる … APIの利用条件とデータの保持を、社内の基準で確かめてから使います
- Webhook の受け口を守る … 署名を確かめ、確かめられない呼び出しは処理しません
- 対処の判断を代替させない … 投稿は過去の報告書の整理までです。どの対処を実行するかは当番と指揮者が決めます
- ポストモーテムの文化を壊さない … Google の SRE の本は、ポストモーテムを誰が悪いかではなく、原因の仕組みに焦点を当てて書くものとしています。投稿に個人の名前を出さず、何が起きたかだけを並べます
誤りが起きた場合のリスクは、似ているだけの報告書の止め方を今回も効くと思い込むことと、止まったままの再発防止策を済んだものと見誤ることの2つです。 前者は「今回との違い」と人の確認で、後者はチケットの状態を機械で引くことで防ぎます。
10まず何から始めるか
1週目:ひな形に2つの決まりを足す
ポストモーテムのひな形に、「暫定対処」の見出しと、再発防止策ごとのチケットの番号を足します。暫定対処には、何をしたか、いつしたか、効くまでに何分かかったかを書く決まりにします。
2週目:10件で試す
先月の障害10件について、それより前の報告書20件ずつを手元のAIサービスに貼り、原因と止め方を並べさせます。再発防止策を済んだことのように書いていないかを最優先で見ます。
3週目:直近2年の報告書を索引に入れる
承認済みの報告書を見出しで段落に分け、「検知」の段落からアラートの名前を取り出します。暫定対処の見出しが無い報告書と、発生日の無い報告書を数えます。
4週目:Webhook と検索をつなぐ
PagerDuty の triggered を受け取り、索引を探し、結果を当番だけが入る試しのチャンネルに投稿するところまで作ります。この時点では障害のチャンネルに投稿せず、当たり外れを当番に付けてもらいます。
2か月目: チケットの状態を引き、生成AIの整理を足して、障害のチャンネルのスレッドに投稿します。3か月目以降: annotated での探し直しと、依存関係での絞り込みを足し、1件30分が何分になったかを実測します。当番に入ったばかりのエンジニアが、ベテランに聞かずに過去の経緯をつかめるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| ポストモーテムが障害の記録、影響、緩和や解決の行動、根本原因、再発防止のフォローアップを書いたものであること。書く条件の例(利用者に見える停止や劣化、データの損失、当番の介入、一定以上の復旧時間、監視の失敗)。誰が悪いかでなく原因に焦点を当てること。レビュー後に過去の障害の置き場に加えること | Google SRE Book: Postmortem Culture | 2026-10-08 |
Webhook(V3)の購読がサービス・チーム・アカウントの範囲で作れ、範囲ごとに10件までであること。triggered が障害の新規作成時に送られ、annotated などのイベントがあること。x-pagerduty-signature のヘッダーが付き、購読の作成時に検証用の秘密の値が渡されること | PagerDuty Knowledge Base: Webhooks | 2026-10-08 |
chat.postMessage に chat:write が要ること。thread_ts に親の投稿の ts を入れると返信になること。text を4,000文字以内に収めるよう求めていること。1つのチャンネルにおおむね1秒に1件の特別な流量の制限があること | Slack API: chat.postMessage | 2026-10-08 |
| Amazon OpenSearch Service の対応プラグインの一覧で、Sudachi Analysis が日本語向けに推奨されていること | Amazon OpenSearch Service: Plugins by engine version | 2026-10-08 |
function_score が返す文書を変えずに順位を変えること。減衰関数(gauss・exp・linear)が数値・日付・位置の項目で使え、日付では origin の既定が now、offset の内側が点数1、decay の既定が0.5であること。項目の無い文書には点数1が返ること | OpenSearch Documentation: Function score | 2026-10-08 |
search_result のブロック(source・title・content)で自社の文書を引用付きで答えること。引用がテキストブロックの単位で付くこと。引用の設定をすべての検索結果でそろえる必要があること | Claude Docs: Search results | 2026-10-08 |
障害の対処の判断は、自社の障害対応の手順と指揮者の判断に従ってください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1075)についてのご相談はこちらから。
