🎉

Denoで動くSlack bot開発を試す

2022/09/30に公開

Slack releases platform open beta powered by Deno

https://deno.com/blog/slack-open-beta

2022/09/21にSlackの公式ブログでDenoを使ったSlack platformのオープンベータがリリースされていました
javascriptランタイムとして最速を目指すDenoで動くなんてワクワクしちゃいますが、個人的にはDenoだろうがSlack botのインフラができたことが嬉しいです

以前のSlack bot開発

これまでの自前Slack bot開発といえば頑張ってインフラを用意しつつSlack APIを使うか?Boltを使うか?という流れだったと思います

筆者はインフラをAWS CDKのNodejsFunctionをつかってAPI Gateway / Lambdaを用意しつつ、SQSを使っていい感じにtimeoutしないように作っていました
Node.jsで開発するのであればBolt一択な気がするので、快適に開発していました

以前のSlack bot開発の課題

上記のように開発していましたが本番環境に都度デプロイして動作確認しており、その点に大きな課題がありました

  • ローカル開発で動作確認は難しい
  • dev環境を用意するのもめんどい
    • workspace分けるか
    • Appを分けるか

Denoで動くSlack platformは何が嬉しい

cliを使ってAppの作成や設定をシームレスに行う開発体験も然ることながら、上記で上げた開発用のappを分離してローカル開発がしやすいことが嬉しいです
デプロイも早く、カジュアルなツール作成だからこそ早く実装できる全体の体験は大きい喜びを感じます

Slack botでHello Worldを試してみる

ここからは公式がドキュメントにしているQuickstartをなぞっていきます

https://api.slack.com/future?utm_medium=referral&utm_source=partner&utm_campaign=fy23-dev-open-beta-launch

:::alert
2022/09/30時点の情報であり、オープンβなので情報が変わる可能性があります
:::

slack cliのインストール

現状はMac or Linuxのみで自動インストールをサポートしています
※ Windowsはマニュアルインストールのみです

$ curl -fsSL https://downloads.slack-edge.com/slack-cli/install.sh | bash
実行結果

👋 Starting to download and install the Slack CLI and its dependencies...
Finding the latest Slack CLI release version
📦 Installing the Slack CLI
Downloading the Slack CLI: https://downloads.slack-edge.com/slack-cli/slack_cli_1.12.0_macOS_64-bit.tar.gz
######################################################################## 100.0%
Extracting the Slack CLI: /Users/**********/.slack/bin/slack
Adding a symbolic link /usr/local/bin/slack to /Users/***********/.slack/bin/slack
Installer doesn't have write access to /usr/local/bin to create a symbolic link. Script will try with sudo privileges
Password:
✨ Slack CLI was installed successfully
📦 Checking dependency: Deno
Installing Deno using Homebrew...
==> Downloading https://ghcr.io/v2/homebrew/core/deno/manifests/1.25.1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/deno/blobs/sha256:e6f8488d83850
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
######################################################################## 100.0%
==> Pouring deno--1.25.1.arm64_monterey.bottle.tar.gz
🍺 /opt/homebrew/Cellar/deno/1.25.1: 10 files, 77.4MB
==> Running brew cleanup deno...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see man brew).
✨ Deno is installed and ready!
📄 Use of the Slack CLI should comply with the Slack API Terms of Service:
https://slack.com/terms-of-service/api
✨ You're all set! Next, authorize your CLI in your workspace with slack login

Slack CliでWorkspaceにログインする

cliでログインします

$ slack login

上記コマンドを実行すると認証チケットのショートカットコマンドが発行されるので今回実行したいワークスペースの適当なチャンネルかDMのメッセージ入力部に貼り付けて送信します

📋 Run the following slash command in any Slack channel or DM
   The command will open a prompt detailing the user permissions for you to approve

/slackauthticket {*********************}

送信するとslack botから以下のような返答が来ます

cliを実行しているターミナルに戻ると認証が完了した旨のテキストと.slack/credentials.jsonが作成されたことが確認できます

認証完了結果

📋 Run the following slash command in any Slack channel or DM
The command will open a prompt detailing the user permissions for you to approve
/slackauthticket ZjYzZ***************************
✅ You've successfully authenticated! 🎉
Authorization data was saved to /Users/*********/.slack/credentials.json
💡 Run slack create my-app to create a new app, or slack help for details on available commands

これでログインできたようです
アプリ作成できる状態か以下のコマンドで確認します

$ slack auth list
実行結果

ACTIVE {workspace_name} (Team ID: T******)
User ID: U*********
Last update: 2022-09-30 08:50:57 +09:00

To change your active workspace authorization run slack login

Slack Appを作成する

$ slack create my-deno-app

実行するとどのテンプレートを利用するか選択できるので、今回はHello Worldを選択します

? Select a template to build from:

> Hello World
  A simple workflow that sends a greeting

  Scaffolded project
  A solid foundation to start building upon

  Blank project
  A, well.. blank project

  To see all available samples, visit github.com/slack-samples.
実行結果

? Select a template to build from: Hello World
Creating new Slack app at /Users//my-deno-app
Enter passphrase for key '/Users/
/.ssh/id_rsa':
📦 Installed project dependencies
✨ my-deno-app successfully created
🧭 Explore your project's README.md for documentation and code samples, and at any time run slack help to display a list of available commands
🧑‍🚀 Follow the steps below to try out your new project
1️⃣ Change into your project directory with: cd my-deno-app
2️⃣ Develop locally and see changes in real-time with: slack run
3️⃣ When you're ready to deploy for production use: slack deploy
🔔 If you leave the workspace, you won’t be able to manage any apps you’ve deployed to it. Apps you deploy will belong to the workspace even if you leave the workspace

これでベースのアプリケーションが作成されます

Slack Appのトリガーを作成する

アプリケーションを動作させるためのトリガーを作成します

$ cd my-deno-app
$ slack trigger create --trigger-def "triggers/greeting_trigger.ts"

すると、本番/開発を選択するような状態になります
まずは開発用を選択しましょう

? Choose an app  [Use arrows to move, type to filter]
  my-deno-app
   App ID: N/A   Status: Not installed
   Workspace: {workspace_name}        Team ID: T*********
> my-deno-app (dev)
   App ID: N/A   Status: Not installed
   Workspace: {workspace_name}        Team ID: T*********
選択結果

? Choose an app my-deno-app (dev)
App ID: N/A Status: Not installed
Workspace: {workspace_name} Team ID: T**************
📚 App Manifest
Created app manifest for "my-deno-app (dev)" in "{workspace_name}" workspace
🏠 Workspace Install
Installed "my-deno-app (dev)" app to "{workspace_name}" workspace
Finished in 1.3s
⚡ Trigger created
Trigger ID: Ft***********
Trigger Type: shortcut
Trigger Name: Send a greeting
URL: https://slack.com/shortcuts/Ft********/d35*****************

選択後に出てくるURLを手元に控えておきます

Slack Appをテスト動作させる

先程控えておいたURLをSlackのpublicチャンネルに投稿します
するとpreviewでアプリウィンドウが展開されます

previewでもボタンは発火するので押下するとモーダルが立ち上がります
適当に入力して送信します

botからメッセージが来たら成功です

まとめ

今回はhello worldに限ってSlack Appの動作確認しましたが、他のテンプレートも有用な物が多く業務で使うカジュアルなアプリケーションの開発ではcliを使った流れが快適すぎて「これがデファクトだろ!」という気持ちになりました
データストア系を使ったアプリを試して記事にしたいのでそれはまた明日の自分に期待したいと思います…

Discussion