🌊

Slackワークフローの遅延機能とDevinを活用した時間差のサーバーリソース調査

に公開

はじめに

システムにおいて、何かとユーザに通知を送ることがあるかと思います。
地震や津波などの通知は、通知した直後はまだアクセス少ないのですが、数分〜数十分経ってからユーザーが一斉にアクセスし始めて負荷が急上昇します。

通知のタイミングでDevinを起動させ、サーバリソースの状態を確認していたのですが、
通知直後ではまだアクセスが少ない状況のため、タイミング的にイマイチでした。
通知から少し時間を置いてからDevinを起動する仕組みがないかと考えていたところ、
Slackワークフローの遅延機能を使えばいい感じに実現できそうだったので試してみました。

実装

Slackワークフローには「指定時間待たせる」という機能が標準で用意されています。
この機能を使うことで、適切なタイミングでの調査を実現できます。

実装フロー

ざっくりと以下のような流れです。

1. 地震等の災害情報を検知
   ↓
2. メール通知
   ↓
3. Slackチャンネルにメッセージとしてメール内容を送信
   ↓
4. Slackメッセージをトリガーにワークフロー起動
   ↓
5. ワークフロー内で遅延設定(例:10分)
   ↓
6. 遅延後、Devinへサーバリソース調査指示のメッセージ送信
   ↓
7. Devinがサーバリソース調査を実行

ノーコードで実装可能

この仕組みの良い点は、コーディング不要で実装できることです。
プログラミングやインフラ構築は一切不要で、Devinの設定とSlackのワークフロービルダー上で設定するだけで動作します。

必要な設定としては以下

  • SlackにDevinアプリの追加
  • Devinを起動するチャンネルにDevinアプリを招待
  • Devinナレッジの作成(サーバリソース調査指示用のプロンプト)
  • Slackインテグレーションでアプリケーションからの通知を受け取るメールアドレスを発行
  • Slackワークフローの作成

最初の2つはDevinとSlackの連携なので、以前解説したのでそちらを参照頂ければと思います。
https://zenn.dev/rescuenow/articles/a3a13b09bb7a63

その下の3つについては掘り下げたいと思います。

Devinナレッジの作成

サーバリソース調査指示用のプロンプトとしてDevinのナレッジに登録しておきます。
Slackワークフローのメッセージに直接書いても動作しますが、Devinに対するプロンプトはDevinで管理しておいた方が扱いやすく再利用もできるため、Devinのナレッジに細かい指示を書いておきます。

Devinにはマクロというショートカットコマンド機能があるため、ナレッジにマクロのキーを紐づけておき、Slackのワークフローからはマクロを指定することでSlack側の指示は簡単になります。

ナレッジの設定例

$シークレット名でDevinに登録したシークレットの値を指定可能です。
サーバへのアクセスキーなどをシークレットとして登録しておき、$シークレット名としてプロンプトに記載しておくことで、シークレットに登録したアクセスキーを元にサーバへのアクセスを実施してくれます。
※この前段階として、アプリケーションのリソースに対してアクセス可能なアカウントや権限等の設定が必要ですが、本筋から外れるので割愛します。
※サーバへのアクセスのためのCLI等を事前にインストールが必要です。インストールされていない場合はDevinの調査内でインストールも実施します。

右下にある「Macro」の部分に任意キーを設定すると、Devinへの指示で「!」+マクロキー名を書くことでナレッジを参照させることが出来ます。
この例だと「alert」と設定しているので、!alertと記述すればOKです。
Slackワークフローのメッセージに!alertを含めておけば、Devinが自動でこのナレッジを使って調査してくれます。

上記のようなサーバの状態確認のほか、業務アプリケーションにログインし、特定のページをキャプチャするなども可能です。

Slackインテグレーションでアプリケーションからの通知を受け取るメールアドレスを発行

Slackチャンネルの詳細から、インテグレーションタブを選び、「このチャンネルにメールを送信する」をクリックするとメールアドレスが発行されます。

発行したメールアドレスに対してアプリケーションから通知を出すように設定しておきましょう。
これについては、アプリケーションの実装によっては追加でコードを書かないと行けないかもしれません。

Slackワークフローの作成

Slackワークフローを以下のように設定します。

  1. ワークフロービルダーで新規ワークフロー作成
  2. トリガー:特定のキーワードを含むメッセージが投稿されたとき
  3. ステップ追加:「このワークフローを遅らせる」を選択
  4. 待機時間を設定(例:10分)
  5. 次のステップ:メッセージを送信(Devinへの指示)

「このワークフローを遅らせる」ステップを挟むだけで、時間差での処理が可能になります。

ワークフロー作成

Slackのワークフロー作成方法については公式ドキュメントがありますので、基本の操作はそちらを確認していただくのが良いでしょう。
https://slack.com/intl/ja-jp/help/articles/17542172840595-ワークフローを作成する---Slack-でワークフローを作成する

  • トリガーとなるイベントの選択
    「キーワードを含むメッセージが投稿された時」を選択し、チャンネルとワークフローを起動するキーワードを指定

    メッセージが送られるチャンネルを指定し、キーワードを含める


高度なフィルター

  • 遅延ステップを追加
    「ユーティリティ」を選択し、「このワークフローを遅らせる」を選択

  • 待たせたい時間を指定

    最小1分から。ここでは10分に設定

  • Devin起動のためのメッセージ送信ステップを追加

ここではスレッドでメッセージに返信することにします。
メール通知のメッセージを受け取るチャンネルと別なチャンネルにしたり、スレッドじゃない方が良い場合は「チャンネルへメッセージを送信する」を選ぶと良いでしょう。

Devinに登録してあるナレッジを指定するため、ワークフローのメッセージは簡単なものでOKです。

実際の実行イメージ

  • Slackに受信したメールの内容がメッセージとして送信

  • ワークフローが開始され、10分後にDevin起動指示のメッセージが送信

  • Devinの起動、調査完了報告

  • 作成されたレポート




実際に生成されたHTMLレポートを見ると、グラフやテーブルが見やすく整理されていて良い感じです。
良い感じではあるのですが、HTML出力させると時間がかかるので、速度面を考慮するとマークダウン形式にするのがよいです。

まとめ

Slackワークフローの遅延機能とDevinを組み合わせた、時間差でのサーバーリソース調査について解説しました。

良い点:

  • Slackの機能だけで実装できる手軽さ
  • コードやインフラ構築が不要
  • Devinのナレッジとマクロで複雑な調査指示もシンプルに管理可能

課題:

  • Slackのワークフローで複雑な動作は組みづらい。(繰り返し実行や分岐など)
  • Devinの応答時間が安定しない可能性
  • 調査に失敗した場合のリトライ制御が難しい

ノーコードで手軽に実装できる点は良かったですが、まだ検証段階なので実運用でどこまで効果が出るかは未知数です。
しかし、災害時の初動対応で自動調査の仕組みがあるのは心強いなと感じました。

同様の課題を抱えている方の参考になれば幸いです。

レスキューナウテックブログ

Discussion