AWS Lambdaを使ってSlack Botを作った話
いつもの週末勉強会でSlackは使っていたので、自然とBotを作ろうという話になりました。 Botに何をさせるかは少し悩みましたが、いつも昼飯で悩むので、くまモンが昼飯をランダムで指定するBotにします。
実現する方法はいくつもあるようなので、AWS Summitで勉強したばかりのLambdaを使ってみました。
ざっくり手順
Lambda関数を準備
AWSサービス一覧からLambdaを選択。 そして[Create a Lambda function]をクリック。
続いてSelect blueprintです。 Botを作るにはmicroservice-http-endpointを選択すると楽らしいのですが、 なかなか上手く行かなかったので、まずLambdaを理解するためにサンプルは使わないことに。
ここでは右下の[Skip]を選択。
Configure triggersですが、ここでは[Next]で飛ばします。
関数に名前をつけます。「myLunchBot」としました。言語はNode.jsです。
zipでupする方法やS3を使う方法もあるようですが、ここではインラインで記述します。 usernameに"くまモン"、あとはランダムでテキストを返すようにしました。
[Create new role from template(s)]を選択して新規ロールを作成します。 あとはそのまま。
Reviewで確認して[Create function]をクリック。 関数が出来たら[Test]してみます。良い感じです。
API GatewayでLambda関数を設定
今度はAPI Gatewayを作成します。 このサービスを利用することで、Lambdaを利用してAPIを公開することができるとのこと。
続いてリソースの[アクション]から[メソッドの作成]を選択、POSTメソッドを作成します。 統合タイプはもちろんLambda関数を選択、リージョンを選択するとLambda 関数名を入力できます。 ここ、最初は候補が出てこないのですが、入力し始めると出てきますね。ちょっと不安になる…
[保存]を押して作成完了。
続いて、POST - メソッドの実行という画面になります。 ここでは、統合リクエストの設定からマッピングテンプレートを設定する必要があるようです。 下記を参考にさせて頂きました。
[保存]します。
戻ってテストしてみると…あれ、Unsupported Media Typeになってる。
さっきの本文マッピングテンプレートのところ、 リクエスト本文のパススルーが「テンプレートが定義されていない場合 (推奨) 」になっていました。 作成時に「はい、この統合を保護します」を選択したからみたいです。 「リクエストの Content-Type ヘッダーに一致するテンプレートがない場合」を選択し直します。
もっかいテスト。うん、今度はOKそうです。
[アクション]からAPIのデプロイを行います。
そして呼出URLが表示されるので、これをメモっときます。
SlackのOutgoing Webhooksを利用
以下のURLからOutgoing Webhooksを探します。 https://{team}.slack.com/apps
[Add Configuration]をクリック。
今回はすべてのチャンネルを対象にするため「Any」を選択。 トリガーとするフレーズは「ごはん」。
URLに先ほどメモった呼出URLをセット。 Customize Iconには、くまモン公式から取得した画像を利用させて頂きました。 https://kumamon-official.jp/application
[Save Settings]をクリックして準備完了! 早速試してみます。
できました! 「ごはん」に反応して、ランダムで反応します。
現在は前方一致なので、次はすべてのポストを対象にして判断をLambda側にさせてみたいと思います。