目次
Slackbotを作成する機会がありましたので、ボットのひな形として、メンションに反応してオウム返しをするだけのボットの作り方の手順をご紹介します。
AWSのAPI GatewayとLambdaを使います。LambdaではNode.jsをベースとしたコンテナイメージを動かします。
構成は以下のようなイメージです。
デプロイの手段としてはTerraformを選びました。
@slack/bolt という名前の、SlackのAPIを扱うNode.jsのライブラリがあります。しかも、AWS Lambdaで動かすための仕組みまでもライブラリの中で提供されています。これに頼って実装することにします。
Slack公式のドキュメントが以下にありますので、これに従えば実現できます。
https://slack.dev/bolt-js/deployments/aws-lambda
この公式ドキュメントと今回の私の記事との違いは、公式ドキュメントではServerless Frameworkを使っているのに対して、今回はフレームワークを使わずにDockerコンテナイメージを作成し、Terraformでデプロイしている点です。
ボットの作り方手順
以下のような流れです。
- Slackのサイトでアプリのためのキーを取得
- アプリに許可する権限(発言の書き込みなど)を設定
- Slackのワークスペースにアプリをインストール
- Slackアプリ用のキーを取得
- Lambdaのソースコード作成
- AWS環境にAPI GatewayとLambdaを構築
- API GatewayのURLをアプリのURLとしてSlackに登録し、アプリに通知したいイベントを設定
- Slackのチャンネルにボットを招待
- ボットにメンションを送ってみる
Slackのサイトでアプリのためのキーを取得
以下のURLにアクセスします。
ブラウザでSlackにログインしていない場合はログインが求められますので、ログインしておいてください。
ログインするとこんな画面になります。
一番目立つ「Create an App」ボタンを押します。
次のような2択の画面が出ました。今回は「From scratch」を選択します。
次の画面でアプリ名を入力し、導入先のSlackワークスペースを選択します。
アプリ名は「echo」という名前にしました。
最後に「CreateApp」を押すとアプリができ、以下のようなアプリの設定画面になります。
アプリに許可する権限を設定
アプリが呼び出すことのできるSlack APIの権限を設定します。メンションを読み取ったり、発言を投稿する権限を与えます。
設定画面の左の「OAuth & Permissions」を選ぶと権限設定の画面になります。
Scopesの欄が次のような表示になっているはずです。
「Add an OAuth Scope」を押し権限を選択することで、以下の権限を付与します。
Slackのワークスペースにアプリをインストール
左のメニューから「Basic Information」に進むと「Install your app」というリンクが出てきますので、これをクリックします。
こんな画面になります。Slackワークスペース側として、このアプリに権限を許可するかどうかの画面です。「Allow」を押してください。
Slackアプリ用のキーを取得
Signing Secretというものと、Bot User OAuth Tokenという2つの文字列が必要です。
ワークスペースにアプリをインストールすると、同じく「Basic Information」のページにCredentialsが表示されます。この中の「Signing Secret」をローカルメモにコピペしておきます。(あとからでも参照できるので、必要になってからでも大丈夫です。)
アプリの権限設定をした「OAuth & Permissions」のページに行くと、「Bot User OAuth Token」というものが表示されています。 `xoxb-` という文字列で始まる文字列です。これもローカルメモにコピペしておきます。
Lambdaのソースコード作成
以下は Node.js でのサンプルコードです。最初と最後はSlackボットとしてのおまじないで、中ほどにボットが返信するためのコードがあります。
const { App, AwsLambdaReceiver } = require('@slack/bolt');
const awsLambdaReceiver = new AwsLambdaReceiver({
signingSecret: process.env.SLACK_SIGNING_SECRET
});
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
receiver: awsLambdaReceiver
});
app.event('app_mention', async ({ event, context, client, say }) => {
// メンションのイベントを受信したときに実行されるコード
try {
const { channel, event_ts, text } = event;
// check if text starts with a mention '<@...>' using regex, and then remove it from text
const textWithoutMention = text.replace(/^<@(.+?)>/, '').trim();
await say({
channel,
thread_ts: event_ts, // 返信先スレッドを識別するための文字列
text: "Helle! :wave: \n> " + textWithoutMention,
});
} catch (error) {
console.error(error);
}
});
exports.lambda_handler = async (event, context, callback) => {
const handler = await awsLambdaReceiver.start();
return handler(event, context, callback);
};
AWS環境にAPI GatewayとLambdaを構築
Terraformでデプロイするためのソースコードは、上記Lambdaのソースコード含め、GitHubにアップしてあります。
https://github.com/beex-inc/slack-echo-bot/tree/for-blog-nodejs
TerraformでAWSのAPI GatewayやLambdaをデプロイするコードは、先日私がQiitaに書いた記事をほとんどそのまま使っています。
TerraformでAPI Gateway + コンテナのLambdaを作成してみる
デプロイ前に以下のような内容の terraform.tfvars を作成してください。awsのprofileが複数ある場合は1行目を適切なものに書き換えてください。5行中の下2行はSlackアプリの設定画面から先ほど取得したSigning SecretとBot User OAuth Tokenを記載します。
aws_profile="default"
aws_region="ap-northeast-1"
resource_name="slack-echo-bot"
slack_signing_secret="..."
slack_bot_token="xoxb-..."
あとは terraform init と terraform apply をするだけでAWS環境にデプロイできます。
デプロイするとAPI GatewayのURLがわかります。 terraform apply を実行したときに最後に表示されます。もしくはAWSのマネジメントコンソールでAPI Gatewayの画面に行けば確認できます。
API GatewayのURLは https://???.execute-api.ap-northeast-1.amazonaws.com/prod のようなフォーマットですが、これの後ろに /slack/events を付けて https://???.execute-api.ap-northeast-1.amazonaws.com/prod/slack/events がこのボットアプリのAPIになります。これもローカルメモにコピペしておきます。
API GatewayのURLをアプリのURLとしてSlackに登録し、アプリに通知したいイベントを設定
先ほどデプロイしてできたAPI GatewayのURLを2か所に入力します。
まず、Slackのアプリの設定画面に戻り、左のメニューから「Interactivity & Shortcuts」に進み、「Interactivity」をOnにし、「Request URL」の欄に入力します。
2つ目は「Events Subscriptions」に行き、「Enable Events」をOnにし、「Request URL」の欄に入力します。入力時にURLがAPIとして機能しているかどうかが自動でチェックされます。Lambdaの実装が正しくないとここではじかれます。
そのすぐ下には、メンションの通知など、どんなイベントをアプリに通知したいかの設定があります。「Subscribe to bot events」の欄からイベントを追加します。echoボットでは app_mention がほしいのでこれを登録します。以下のような表示になります。
Slackのチャンネルにボットを招待
アプリ設定画面ではなく、普段目にしているいつものSlackの画面に戻り、チャンネルにボットを招待します。メンバーの招待とは違って「Integrations」というメニューかもしれません。
ボットにメンションを送ってみる
できた!
最後に
BeeXではこんなアプリ開発もしています。アプリ開発のご相談についてはアプリケーション開発支援のページをご覧ください。
ChatGPTで話題の大規模言語モデルの活用が広まっていますが、そんな流行に乗ってボットアプリケーションを開発したいというエンジニアの方々がいらっしゃいましたら、ぜひ一緒にお仕事しましょう。こちらからの応募をお待ちしております。
- カテゴリー