【レポート】Bolt を使った Slack 連携アプリの開発からデプロイ・運用まで超入門 – Developers.IO TOKYO 2019 #cmdevio

2019年11月1日に、クラスメソッド主催の技術カンファレンス「Developers.IO 2019 TOKYO」が開催されました。 本記事では瀬良和弘氏によるセッション「Bolt を使った Slack 連携アプリの開発からデプロイ・運用まで超入門」をレポートします。
2019.11.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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を使って作ってみたいと思います。