If today were the last day of my life

やりたいことをがんばるブログ

AWS Lambdaを使ってSlack Botを作った話

いつもの週末勉強会でSlackは使っていたので、自然とBotを作ろうという話になりました。 Botに何をさせるかは少し悩みましたが、いつも昼飯で悩むので、くまモンが昼飯をランダムで指定するBotにします。

実現する方法はいくつもあるようなので、AWS Summitで勉強したばかりのLambdaを使ってみました。

ざっくり手順

  • Lambda関数を準備
  • API GatewayでLambda関数を設定
  • SlackのOutgoing Webhooksを利用

Lambda関数を準備

AWSサービス一覧からLambdaを選択。 そして[Create a Lambda function]をクリック。

続いてSelect blueprintです。 Botを作るにはmicroservice-http-endpointを選択すると楽らしいのですが、 なかなか上手く行かなかったので、まずLambdaを理解するためにサンプルは使わないことに。

ここでは右下の[Skip]を選択。 f:id:suzusin:20160903183515p:plain

Configure triggersですが、ここでは[Next]で飛ばします。 f:id:suzusin:20160903190429p:plain

関数に名前をつけます。「myLunchBot」としました。言語はNode.jsです。 f:id:suzusin:20160903190643p:plain

zipでupする方法やS3を使う方法もあるようですが、ここではインラインで記述します。 usernameに"くまモン"、あとはランダムでテキストを返すようにしました。 f:id:suzusin:20160903191041p:plain

[Create new role from template(s)]を選択して新規ロールを作成します。 あとはそのまま。 f:id:suzusin:20160903191547p:plain

Reviewで確認して[Create function]をクリック。 関数が出来たら[Test]してみます。良い感じです。 f:id:suzusin:20160903192159p:plain

API GatewayでLambda関数を設定

今度はAPI Gatewayを作成します。 このサービスを利用することで、Lambdaを利用してAPIを公開することができるとのこと。

API名を入れて[APIの作成]を押します。 f:id:suzusin:20160903193337p:plain

続いてリソースの[アクション]から[メソッドの作成]を選択、POSTメソッドを作成します。 統合タイプはもちろんLambda関数を選択、リージョンを選択するとLambda 関数名を入力できます。 ここ、最初は候補が出てこないのですが、入力し始めると出てきますね。ちょっと不安になる… f:id:suzusin:20160903200015p:plain

[保存]を押して作成完了。

続いて、POST - メソッドの実行という画面になります。 ここでは、統合リクエストの設定からマッピングテンプレートを設定する必要があるようです。 下記を参考にさせて頂きました。

takayukii.me

[保存]します。 f:id:suzusin:20160903200930p:plain

戻ってテストしてみると…あれ、Unsupported Media Typeになってる。 f:id:suzusin:20160903201227p:plain

さっきの本文マッピングテンプレートのところ、 リクエスト本文のパススルーが「テンプレートが定義されていない場合 (推奨) 」になっていました。 作成時に「はい、この統合を保護します」を選択したからみたいです。 「リクエストの Content-Type ヘッダーに一致するテンプレートがない場合」を選択し直します。

もっかいテスト。うん、今度はOKそうです。 f:id:suzusin:20160903203708p:plain

[アクション]からAPIのデプロイを行います。 f:id:suzusin:20160903203946p:plain

そして呼出URLが表示されるので、これをメモっときます。

SlackのOutgoing Webhooksを利用

以下のURLからOutgoing Webhooksを探します。 https://{team}.slack.com/apps

[Add Configuration]をクリック。

今回はすべてのチャンネルを対象にするため「Any」を選択。 トリガーとするフレーズは「ごはん」。 f:id:suzusin:20160903204939p:plain

URLに先ほどメモった呼出URLをセット。 Customize Iconには、くまモン公式から取得した画像を利用させて頂きました。 https://kumamon-official.jp/application

[Save Settings]をクリックして準備完了! 早速試してみます。

できました! 「ごはん」に反応して、ランダムで反応します。 f:id:suzusin:20160903210318p:plain

現在は前方一致なので、次はすべてのポストを対象にして判断をLambda側にさせてみたいと思います。