🦫

[小ネタ]Slack Platform(Deno)で作成したインシデント対応botにリマインダー機能を追加した

2024/12/10に公開

はじめに

株式会社モニクルでSREを担当しているbeaverjrです。
この記事はSRE Advent Calendar 2024の10日目の記事です。

弊社SREチームでは、Slack次世代プラットフォーム(next generation Slack platform)を活用して、インシデント対応の標準化を目指すSlackbotを作成しました。
https://zenn.dev/monicle/articles/b3173ccbaa41a1

今回はそのbotに追加したリマインダー機能についてご紹介します。

背景

インシデント発生時に作成された対応用のチャンネル(WarRoom)が、対応完了後も閉じられないまま残っている自体が散見され、これってどうなってるんだっけ?とタイミングで誰かが確認して整理する、ということがしばしばありました。

さまざまな事情で恒久対応がすぐに実施できない、という場合もありますが、こうした状況が続くと、インシデント対応のステータスが不明瞭になり、対応漏れや後続タスクの遅延につながる恐れがあります。

そこで、この課題を解決するために、Slackbotにリマインダー機能を追加し、定期的に進捗確認を促す仕組みを導入しました。(開発チームのメンバーが要望としてあげてくれました。ありがとうございます!)

実装概要

ディレクトリ構造

リマインダー機能の追加に伴い、以下のような形となりました。

├── functions
│   ├── create_reminder_trigger.ts   # リマインダー用スケジュールトリガーの作成
│   ├── incident_function.ts         # インシデント発生時の処理
├── triggers
│   ├── incident_trigger.ts          # インシデント発生時のトリガー設定
└── workflows
    ├── incident_workflow.ts         # インシデント対応ワークフロー
    └── reminder_workflow.ts         # リマインダー機能のワークフロー

新たに作成した部分
functions/create_reminder_trigger.ts
新しいリマインダー機能のために作成したファイルです。スケジュールトリガーを作成する処理を定義しています。このファイルを通じて、指定した頻度で通知を送る仕組みを実現しています。

workflows/reminder_workflow.ts
リマインダー通知のワークフローを管理するために作成したファイルです。例えば、通知内容のカスタマイズや通知対象の設定を制御します。

既存ファイルとの関係
今回追加したreminder-関連のfunctionやworkflowは、既存のインシデント対応用の処理(incident_function.tsやincident_workflow.ts)を補完する形で動作します。

全体の流れ

インシデントが発生すると、専用チャンネルが作成され、同時にリマインダーのスケジュールトリガーが設定されます。
トリガーは1週間後から毎週、指定された内容の通知を送信します。
各コードの役割

  • create_reminder_trigger.ts: トリガーを作成する関数を定義。
  • incident_workflow.ts: インシデント対応時にトリガーを作成。
  • reminder_workflow.ts: 実際の通知内容を定義。

コード

Function: CreateReminderTrigger
以下はリマインダー用のスケジュールトリガーを作成する関数のコードです。リマインダーは指定されたチャンネルで、1週間後から毎週通知を送信します。

export default SlackFunction(
  CreateReminderTrigger,
  async ({ inputs, token }) => {
    const client = SlackAPI(token, {});
    const scheduleDate = new Date();
    scheduleDate.setDate(scheduleDate.getDate() + 7);

    try {
      const scheduledTrigger = await client.workflows.triggers.create({
        name: `Channel ${inputs.channel_id} Reminder Schedule`,
        workflow: "#/workflows/reminder_workflow",
        type: TriggerTypes.Scheduled,
        inputs: {
          channel_id: { value: inputs.channel_id },
        },
        schedule: {
          start_time: scheduleDate.toISOString(),
          frequency: { type: "weekly", repeats_every: 1 },
        },
      });

      if (!scheduledTrigger.trigger) {
        return { error: "Trigger could not be created" };
      }

      return { outputs: { trigger_id: scheduledTrigger.trigger.id } };
    } catch (error) {
      return { error: "Error creating scheduled trigger" };
    }
  }
);

ワークフロー: インシデント対応
以下はインシデント対応ワークフロー(incident_workflow.ts)の抜粋です。このワークフロー内でCreateReminderTriggerを呼び出しています。

IncidentWorkflow.addStep(CreateReminderTrigger, {
  channel_id: channel.outputs.channel_id, 
});

ワークフロー: リマインダー通知
以下はリマインダー通知を送信するワークフロー(reminder_workflow.ts)の抜粋です。
このステップでは、スケジュールトリガーによって毎週実行されるリマインダー通知の内容を定義しています。

ReminderWorkflow.addStep(Schema.slack.functions.SendMessage, {
  channel_id: ReminderWorkflow.inputs.channel_id,
  message: "インシデントチャンネルがまだ開いています。必要に応じて残タスクの確認やアーカイブの対応をお願いします。",
});

※この記事で紹介するコードは、読者の参考用に一般化した内容です。実際の運用ではセキュリティリスクに配慮し、必要に応じて環境設定やアクセス制御を適切に行ってください。

ハマりポイント

既存のショートカットトリガーは専用ファイルで作成しましたが、今回のように関数で作成できる場合もあります。この仕様の違いに最初は戸惑いました。

導入の結果と効果

今回のリマインダー機能追加により、定期的に進捗確認を促す通知が自動で行われるようになり、対応状況の確認漏れや放置チャンネルの削減につながりました。(とは言っても最近はインシデントチャンネルが早々にアーカイブされることも増え、リマインダーが動いた実績は2回ほどです!)

実際のリマインダー

まとめ

Slack次世代プラットフォームを活用することで、リマインダー機能のような業務効率化の仕組みを簡単に実現できます。
今回のリマインダー機能はインシデント管理以外の用途にも幅広く応用できる機能だと思いますので、ぜひ一度試してみてください!

株式会社モニクル

Discussion