突然障害が起きると何をしたらいいか慌ててしまいませんか?
今回それを解決するために、1アクションで障害の初動対応をするslash commandを作りました。
概要
障害対応の初動を早めるために
- Slackで/hogeと打つ
- チャンネルが作られる
- チームメンバーがinviteされる
- タスクリストがpostされる
という仕組みを用意しました。
上の例は誰もいないスペースでテストしています。
スペースにメンバーがいるとき、Slack Appのレスポンスはこのようにチャンネル名と、招待したメンバーが出力されます。
環境
- serverless 1.37.1
- Node.js 8
- Google Cloud Functions
- Slack
背景
障害対応のとき
- 突然のアラートに何をすればいいかわからない
- チームの誰が何の対応をしているかわからない
- ベテラン1人しか対応できないので時間がかかる
- チーム外から作業状況が見えない
- 社内Wikiで状況をまとめているがリアルタイム性が低い
というようなことがあると思います。
コンセプト
アラート検知後、以下のようなことを目指します。
- 障害の初動を迅速に行う
- チームメンバーの習熟度に関係なく全員で障害に当たることができる
タスクリストを表示することで突然の障害にも最低限何をすればいいかわかる - 作業状況をオープンにする
パブリックチャンネルを作ることで見たい人が情報を参照できる
slackのリアクションで何をやっているかわかるようにする - 作業状況がリアルタイムにわかるようにする
あくまで初動のための仕組みです。アラートの種類によって調査手段は変わります。
タスクリストはチームごとに適宜更新していく想定です。
仕組み
SlackとGoogle Cloud Functionsを使って概要にある仕組みを構築しました。
フレームワークはServerlessを使いました。
- slash commandsでCloud FunctionsのHTTPトリガーを叩きます。
- slash commandは3秒のタイムアウトがあるのでまずはレスポンスを返します。
- 非同期でSlack APIを叩きます。
- Slack APIの結果を取得します。
- API呼び出しの結果をresponse_urlにPOSTします。
チャンネル名のprefix、招待するユーザ、タスクリストはyaml形式の設定ファイルに書きます。
チャンネル名は設定ファイルのprefixと時刻のsuffxが合わせて作られます。
(障害対応を想定して作ったので、チャンネル名を一覧したときわかるように時刻を入れてみました。)
ソース
まとめ
メンバーの習熟度にかかわらず、チーム全体で透明性のある障害対応をおこないましょう。
今回の挙げた例はあくまで一例です。
チームに合った障害対応策を考えてみてはいかがでしょうか?
参考
https://about.gitlab.com/2017/02/10/postmortem-of-database-outage-of-january-31/
GitLabのデータベースの事件は記憶に新しいでしょう。
対応状況をYouTube配信やGoogleDocsで外部に公開するのは難しいかもしれませんが、
関係部署など適切な範囲でオープンにできるといいですね。