Blog

非同期処理のすゝめ(Slack bolt + lazy listener)

はじめに

こんにちは、ニフティ インフラシステムグループ社内情報システムチームの仲上です。
先日、非エンジニアでもメール配信サービスからAPI経由で情報を取得できるように、Slack boltを使用してbotを作成しました。しかし、情報の取得・整形処理が想定より重く、エラーが頻発するようになってしまいました。その際にlazy listenerを使用してこの問題を解決したことについて紹介しようと思います。

Slack bolt と lazy listener

今回Slack botを作成するにあたって、機能の充実さと導入が容易な点から公式ライブラリのSlack boltを使用しました。

https://slack.dev/bolt-python/ja-jp/tutorial/getting-started

Slack boltを使用した場合、Slackへの応答には3秒以内返信という制約があります。処理が重かったり、ネットワークの問題などでレスポンスを返すのに3秒以上かかってしまった場合、Slack側でエラー処理されてしまします。そこでslack boltに搭載されているlazy listener を使用します。この機能を使うことにより、重い処理を非同期で実行できるので、タイムアウトによるエラーを回避することができます。

https://slack.dev/bolt-python/api-docs/slack_bolt/lazy_listener/index.html

lazy_listener を使用することで処理結果が出るより先にSlackへの応答を返すことができ、重い処理を非同期で実行することができます。

今回つくったもの

メール配信サービス(SendGrid)に登録されている情報をAPI経由で取得し、Slackに表示するbotを作りました。

SendGridとは

SendGridとは、クラウドベースのメール配信サービスです。こちらは世界的に利用されている高い到達率を誇るサービスで、APIを叩いてメールを送信することができます。また、SendGridにはテンプレート機能というものがあります。これはメールの送信元や件名、本文などを予め設定しておくことができる機能で、APIのパラメータに本文内の埋め込み情報などを渡すだけで定型文を送ることができます。
今回このテンプレートに登録されている情報を誰でも確認できるようにしたかったため、Slack botを作成しました。

構成図


Slackのグローバルショートカットをクリックするだけで使用できるようにしました。

SlackのショートカットがクリックされるとLambdaがSendGridのAPIを叩きテンプレートに関する情報を取得します。取得した情報はLambdaでSlack用のメッセージに整形され、メッセージが送信されます。

環境

  • Python 3.9
  • serverless framework 3.31.0
  • serverless-python-requirements 6.2.3
  • aws cli 2.12.4
  • slack-bolt 1.18.0
  • slack-sdk 3.21.3

実装

Slack appの登録やLambdaへの登録説明は省略します。

ファイル構成

app.py

lasy_listener を使用する際は以下のように書きます。

serverless.yaml

lambdaでは標準搭載されているパッケージ以外は自分で入れる必要があります。これらを手動で行う場合、

  • パッケージをローカルにダウンロード
  • zipファイルで圧縮
  • lambdaに転送

と非常に手間がかかります。
そこでserverless-python-requirementsを使うことでこれらの手間を低減します。このプラグインはrequirements.txtを宣言すると自動でパッケージの圧縮・デプロイまで行ってくれます。

デプロイ

動作確認

テンプレート一覧

テンプレート一覧を選択します。

登録されているテンプレート一覧がDMで送られてくることが確認できました。

テンプレート詳細

テンプレート詳細を選択します。

表示されたmodalに管理番号を入力して送信します。

DMでテンプレートの内容が送られてくることが確認できました(画像はテスト用テンプレートです)

おわりに

このbotを開発したことにより、sendgridのアカウントを持っていなくてもSlackからSencGridのテンプレートを見れるようになりました!今までは問い合わせベースで対応していたので、対応の時間を大きく減らすことができました。
Slack bolt + severless framework を使ったbotの開発は非常に柔軟性・拡張性が高いので、みなさんも是非試してみてください!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!