Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

インシデント発生時における初動対応の自動化

こんにちは、テクノロジー本部 プロダクト開発部 SRE の koizumi です。

この記事は Gunosy Advent Calendar 2023 の 8 日目の記事です。昨日の記事は 石川 さんの「オンライン実験を速く試すための基盤構築」でした。

本記事では、インシデントフローの改善として、インシデント発生時における初動対応の自動化を行なった実例についてご紹介します。

実際に動いている例

これまでの課題感

弊社では、障害発生時における初動対応として以下のようなアクションを行なっており、それら全てを手動で行なっていました。

  • 障害発生報チャンネル*1にて障害内容および影響範囲等を共有
  • 障害対応用のSlackチャンネルを作成
  • 作成したSlackチャンネルにステークホルダーを招集
  • 障害対応用のGoogleドキュメントを作成
  • 障害対応を行う場所(Slack Huddle)の共有
    • Huddleを行うSlackチャネルが統一されていないため、対応している場所を共有する必要がある

障害時には障害対応に注力したいですし、これらの初動対応は毎回発生する定期作業のため、効率化できればと思いました。 また、初動対応のフローを標準化する意図でも自動化したい機運が高まりました。

どのように実現したか

前述した手動で行なっていた初動対応をSlackワークフローとGoogle App Scriptを用いて自動化した実例をご紹介します。

Slackワークフローとは

2023 年 6 月 28 日、ワークフロービルダーの新しいバージョンの提供を開始しました。本記事でご紹介するものはレガシーワークフローになる点をご注意ください。

Slackワークフローを作成すると、定型的な業務の手順を自動化することができます。 例えば、チームに新メンバーが入った際のウェルカムコメントなどの定型文の作成や毎朝定期実行されるSlackアクションなどを自動化できます。

このSlackワークフローを作成するには、ワークフロービルダーというSlackの機能を使います。 以下の公式ドキュメントに記載があるように、ワークフローにはトリガー、ステップ、変数、コラボレーターという機能があります。

slack.com

Google App Scriptとは

Googleが提供する各種サービス(Gmail、カレンダー、スプレッドシート、ドキュメントなど)の自動化や連携を行うためのローコード開発ツールです。 イメージとしては、ExcelのマクロなどのGoogle版といったものになるかと思います。

詳細は後述しますが、スプレッドシートに入力した値をもとにドキュメントを更新したり、Slackなどの別サービスとの連携による操作の自動化(Slackチャンネルの作成など)が可能になります。

workspace.google.co.jp

実装内容

それでは、前述したSlackワークフローとGoogle App Script(以下、GAS)を利用した実装内容をご紹介します。 具体的には以下のように実装しました。

  • Slackのショートカットの開始をトリガーにワークフローが開始
  • ワークフローを開始したチャンネルにフォームを送信
  • 担当者がフォームに回答
  • 回答内容をGASが実装されたスプレッドシートに反映
  • 反映された値をもとに各初動対応をGASが実行

大きく分けてSlackワークフロー側とGAS側の実装に分けられます。 それぞれの実装内容についてご紹介します。

Slackワークフローの実装

トリガーの設定

トリガーには様々なアクションを設定できますが、今回は指定のSlackチャンネルでショートカットを開始したことをトリガーに設定します。 これにより、チャンネルに参加している誰かが設定したショートカットを開始すると、ワークフローが開始されるようになります。

トリガーの設定内容

ステップの追加

続いて、Slackワークフローにステップを追加していきます。 今回はショートカットをクリックしたチャンネルにフォームを送信し、その回答内容をもとにスプレッドシートを更新します。

まずはフォームを送信できるようにするために、ワークフロービルダーの画面のステップを追加からフォームを送信するのステップを追加します。 このステップでは、以下のようにタイトルと質問/答えを設定しています。 回答形式には、1行テキスト/段落/ドロップダウン/メンバーを選択/チャンネルまたはDMを選択 の5つから選択できます。 この時点で、指揮と記録担当を明示するためにメンバーを選択して回答できるようにしています。

フォームを送信するステップの設定内容

次に、フォームの回答内容をスプレッドシートに反映させます。 同じくステップを追加から、Update a spreadsheet rowを選択します。このステップは指定したスプレッドシートを自動更新することができます。

そして、連携するスプレッドシートを新規に作成しておきます。記入内容は以下のようにしています。

スプレッドシートの内容
作成したステップの設定画面にて、自身のGoogleアカウントを接続して、作成したスプレッドシートと更新したいシートを選択します。

次に、ステップで更新する行を識別させるためにスプレッドシートのカラム名とその値を入力します。 識別することができれば問題ないので、先ほどのスプレッドシートの画像の一番左のカラムとセル値(columnとhoge)のようにする必要はありません。 ステップ側で指定のカラムとそのセル値を選択すれば、更新する行をステップが識別してくれます。

そして、更新するカラム(Column name)とその値(Value)を設定します。 Valueには前のステップに設定したフォームの回答内容を設定することができます。変数を挿入するから指定の回答内容を選択できます。

Update these columnsの設定内容

スプレッドシートの各カラムに入力する値を同じように設定します。 これで指定のチャンネルでショートカットを開始すると、フォームが送信され、その回答内容がスプレッドシートに反映されるようになりました。

次は、GASを利用して、更新されたスプレッドシートをもとにそれぞれの初動対応を自動化していきます。

Google App Scriptの実装

作成したスプレッドシートの上部タブの拡張機能からApps Scriptをクリックすると、GASの画面に遷移します。 ここで、自動化するスクリプトを記述していきます。

GASはJavaScriptをベースにした言語であるため、エンジニアの方でも、そうでない方でも書きやすいと思います。 GASの文法などはインターネットに様々な優良な記事がありますので、そちらを参照してください。

GASではそれぞれの関数で一つの機能を実装していきます。 具体的には以下の通りです。

  • テンプレートドキュメントをもとに障害対応ドキュメントを作成
  • 障害対応Slackチャンネルの作成
  • 召集したいユーザグループのメンバーを取得
  • 取得したメンバーを作成したSlackチャンネルのメンバーに追加
  • 障害対応Google Meetの作成
  • 作成したGoogle MeetのURLをSlackに投稿
  • 作成したSlackチャンネルをSlackに投稿
  • 作成した障害対応ドキュメントのURLをSlackに投稿

コードの詳細は以下のGithub Gistで公開しています。 Google DriveのファイルIDやSlackチャンネルのIDなどは適宜変更してください。

Automated initial incident response · GitHub

Slack Appの設定

Slack Appの作成

Slack投稿などを行うSlack Appを作成します。Your Apps から Create New App をクリックして、Slack Appを作成します。 特にこだわりがなければ From scratch を選択してください。

Slack Appの新規作成1
Slack Appの新規作成2

OAuth Tokensの設定

次に、作成したSlack AppでOAuth Tokensを設定します。 Add features and functionality内のPermissionsをクリックします。

Scopesセクションに移動し、Add an OAuth Scopeをクリックし、適当なScopeを設定します。(chat:writeなど)

OAuth Tokenを取得するには、OAuth & PermissionsOAuth Tokens for Your Workspace項目のInstall to Workspaceをクリックし、権限の許可を行うと取得できます。

加えて、後述するGASのスクリプトプロパティに設定するVerification_Tokenの値を確認します。 Basic InformationApp Credentials項目で確認できます。

Google App Scriptのスクリプトプロパティの設定

GASのスクリプトプロパティにこれらのOAuth TokensVerification_Tokenの値を、それぞれSLACK_TOKENSLACK_VERIFICATION_TOKENというプロパティ名で設定します。 スクリプトプロパティは左サイドバーのプロジェクトの設定画面で設定することができます。

スクリプトプロパティの設定

以上が主な実装および設定内容となります。

今後の課題

今後解決すべき課題としては以下のようなものが挙げられます。

GASのバージョン管理

実装したGASのバージョン管理は一定GAS側で標準装備されていますが、他のコードと同じようにGithubリポジトリで管理したい思いがあります。 現状、共有フォルダに置くことによって組織内のメンバーであれば誰でも編集することは可能ですが、バージョン管理はGithubに統一した方が認知負荷は軽減できると思います。 また、CIなどで一定のテストを行い、GASに変更内容を反映できればベストだと思います。

レガシーワークフローからの移行

少し前述しましたが、作成を行っていた時期がSlackの大幅な刷新時期と重なり、作成したワークフローがレガシーワークフローという名称へ変更になりました。

slack.com

2024 年 9 月 12 日以降、移行されていないレガシーワークフローは動作を停止し、アクセスできなくなるようなので、新しいバージョンのワークフローへの移行が必要になっています。 今回作成したワークフローもレガシーワークフローであるため、新たに作成する場合は新しいバージョンのワークフローでの実装をお勧めします。

まとめ

本記事では、インシデント発生時における初動対応をSlackワークフローとGoogle App Scriptを用いて自動化した実例についてご紹介いたしました。 比較的簡単な実装内容で、手軽に日々の作業を自動化できるので、気になった方は是非使ってみてください。

明日は takaki otake さんの「パーソナライズド動画推薦システムをつくる」についてです!お楽しみに!

*1:障害発生時に社内に全体共有するためのSlackチャンネル