【レポート】Bolt を使った Slack 連携アプリの開発からデプロイ・運用まで超入門 – Developers.IO TOKYO 2019 #cmdevio
2019年11月1日に、クラスメソッド主催の技術カンファレンス「Developers.IO 2019 TOKYO」が開催されました。 本記事では瀬良和弘氏によるセッション「Bolt を使った Slack 連携アプリの開発からデプロイ・運用まで超入門」をレポートします。
Bolt を使った Slack 連携アプリの開発からデプロイ・運用まで超入門
2019年11月1日(金)に、クラスメソッド主催の技術カンファレンス「Developers.IO 2019 TOKYO」が開催されました。
本記事では、瀬良和弘氏によるセッション「Bolt を使った Slack 連携アプリの開発からデプロイ・運用まで超入門」をレポートします。
スピーカー
Slack Japan 株式会社 ディベロッパーリレーションズ パートナーエンジニア 瀬良和弘 様
セッション資料
レポート
Slack Platformの紹介
- APIだけでなくUIも合わせてSlack Platformと呼んでいる
- SlackクライアントもRTM経由でSlack APIサーバーと通信している
- Slackのプロダクト自体がWeb APIベースで実装されている
- Slack外から情報を送る場合、Incoming Webhooksを利用すれば簡単にSlackへメッセージを送信できる
- Slack内で発生したパターンごとに、外部サーバに通知
- Events(Slack内の発生イベント)
- Interactivity(ユーザ行動)
- Slash Commands(コマンド起動)
- Dialog(ダイアログ送信)
- これらのSlackサーバとの送受信するSlackアプリの実装にBoltを使うと簡単に実装できる
ワークフロービルダーの紹介
- ノンコーディング、GUIでワークフローを作成可能
- 作成すると⚡マークから実行
- jsonで保存されるのでimport/exportもできる(サンプル公開中)
Specでのアップデート紹介
- bot向けに細やかな権限設定が可能に
- json書式でリッチなメッセージを作成できるBlock Kit機能
- Block Kitを活用できるModal UI
- Homeタブが登場
- スライドでの例:Google Calendarから現在時刻以降の予定を表示
- app_home_openedイベントが発生する
- views.publishでhomeタブに表示
Boltとは?
- Slack アプリ用のフレームワーク
- Node.js + TypeScriptで実装されている
- 単純なコードでSlackアプリを実装できる
- 共通処理をよしなにやってくれる
Bolt 実装例
- Slack APIの設定とboltのコード数行に実装内容を記述するだけ
- メッセージを応答するackなどユーテリティ関数が用意されている
ローカルで動かす
- スライドのサンプルだと
npm start
で実行。ローカルの3000ポートを使用する - これをngrok(エングロック)やserveoというサービスを使ってproxyすればslackサーバと接続、動作確認できる
- Steno というペイロードキャプチャして保存したりリプレイが簡単にできるツールあり
Herokuで動かす
- Procfileを用意して
npm start
- 環境変数PORTを参照する
- Request URLはhttps://*.herokuapp.com/slack/events
FaaSで動かす
AWS API Gateway + Lambda
- expressReceiverを変換にかけてラムダに渡す
const awsServerlessExpress = require('aws-serverless-express'); const server = awsServerlessExpress.createServer(expressReceiver.app); module.exports.app = (event, context) => { awsServerlessExpress.proxy(server, event, context); }
Firebase
- ローカルでの動作は対応していないので注意
- package.jsonにてengineのnodeのバージョンを明確に指定(10)する
"engines": { "node": "10" },
- Firebase側で提供している変換処理を使う
exports.slack = functions.https.onRequest(expressReceiver.app);
3秒タイムアウト
- 3秒応答がないとタイムアウトとなりリクエストを打ち切り、後でまたリトライする
- これを防ぐため、以下2つに分ける
- Slackからリクエストを直接受けるFunction(別lambda起動成功したらすぐに200 OKを返す)
- 非同期でメイン処理するFunction
- response_urlを活用すれば非同期で応答することが可能
コンテナサービスで動かす
Fargate / ECS
- ECSのターゲットグループのヘルスチェックとしてexpressのinstanceを利用して実装
receiver.app.get('/', (_, res) => { res.status(200).send(); });
Google Cloud Run
- Dockerイメージを作成
- gcloud builds submit & beta run deploy するだけ
感想
Slack Platformの紹介から、Update内容、Boltフレームワークの実装から運用までと大ボリュームのセッションでした。
Boltフレームワークを使えば、使いたい機能の実装に集中してSlack Botを作れそうなので、私もlambdaを使って作ってみたいと思います。