Slackでくまモンとお話しする環境をサーバーレスで作る！

# 目的
hubotのためにEC2起動するのはいやだけど、botとお話がしたいなーと思って、サーバーレスでお話しするやつを考えました。
熊本出身なので、くまもんbotを作りました。


# 構成
Slackの任意のチャンネルから「hey ○○」と飛ばすと、
　Outgoing WebHooks → API Gateway → Lambda → UserLocal社の人工知能ボットAPI
とメッセージが伝わり応答が返ってきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/40136/751c1a9f-731a-274d-2cfc-6a291617e4ac.png)

## 人工知能ボットAPIの設定
以下を参考にアカウントを作成し、APIキーを取得します。

[人工知能ボットAPIを使ってSlack上で会話してみた](http://qiita.com/naoyamuto/items/89cf0c049ff7db8bc0d3)

![スクリーンショット_090916_044318_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/40136/55bc094a-4ba7-4ff4-e316-9fcb941bef81.jpeg)

この設定画面から「～もん」等、話し方の設定ができそうですが、今回はとりあえず置いておきます。

# Lambdaの設定

## ロールの作成
必要な権限としては特にないのですが、今回はCloudWatch Logsにログを出力するロールを作成してアタッチすることにします。

ロールの名前はkumamon_bot_roleとし、以下ポリシーを紐付けます。

```json:kumamon_bot_policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1473402522000",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

## ファンクション設定
新しくkumamon_bot_functionという名前でファンクションを作成します。（任意）
各種設定は以下にしました。

　Runtime ： **node.js 4.3**
　Role ： **kumamon_bot_role**

　Memory ： **128 MB**
　Timeout ： **6 sec**

## コード
今回、requestモジュールを使用しているため、jsファイルと一緒にrequetモジュールもzip化しアップロードします。
[request](https://www.npmjs.com/package/request)

Lambdaファンクションのコードは以下の通りです。

```js:kumamon_bot_function.js
exports.handler = (event, context, callback) => {

    try {
        const querystring = require('querystring');
        const request = require('request');

        const apiULI = 'https://chatbot-api.userlocal.jp/api/chat';
        const API_KEY = '<人工知能ボットAPIキー>';

        // メッセージ先頭のheyを削除
        const message = event.text.toUpperCase().replace( "HEY" , "" );

        const params = {
            key : API_KEY,
            message : message,
            bot_name : 'くまもん',
            platform : 'slack',
            user_name : event.user_name
        };

        const url = apiULI + '?' + querystring.stringify(params);
        console.log(url);

        // CHATBOT-APIをコール
        request.get(url, function (error, response, body) {
              if (!error && response.statusCode == 200) {
                  console.log(body);
                  callback(null, {
                      "text" : JSON.parse(body).result
                  });
              } else {
                  throw new Error(error);
              }
        });

    } catch(e) {
        callback(e);
    }
};
```

# API Gatewayの設定
任意の名前でAPIを新しく作成し、POSTメソッドを追加します。

## メソッドのセットアップ
以下の通り選択します。

　統合タイプ ： **Lambda関数**
　Lambdaリージョン ： **ap-northeast-1**
　Lambda関数 ： **kumamon_bot_function** 

![スクリーンショット_090916_041654_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/40136/dc6251ba-0b76-9bba-a171-d863b0c14dae.jpeg)

## 統合リクエストの設定
こちらの記事に従って、マッピングテンプレートを設定します。
[AWS Lambda を使って Slack ボット (命名: Lambot [ランボー]) を低予算で作ろうじゃないか](http://qiita.com/exabugs/items/e868df55333d0805acb2)

保存したら、新しいステージを作成し、デプロイしてください。
※今回はprodステージにデプロイ

# Outgoing WebHooksの設定
1. Slackにログインした状態でhttps://.slack.com/services/newにアクセス
2. 検索ボックスに「Outgoing WebHooks」と入力し選択する
3. 「Add Configuration」を選択
4. 以下の通り設定

　Channel ： **Any**
　Trigger Word(s) ： **hey**
　URL(s) ： **API GatewayのURLを指定**

![スクリーンショット_090916_042441_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/40136/f9d4771c-126d-096c-c31e-7af81c7b7bed.jpeg)

botのキャラクターはくまもんに変更しました。~~（任意）~~（必須）

![スクリーンショット_090916_042721_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/40136/aee1bc2b-a321-1f71-4eda-16277a195bf1.jpeg)
©2010 kumamoto pref. kumamon

設定が完了したら、保存してください。

# 試してみる

実際に試してみます。

![スクリーンショット_090916_045241_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/40136/70152816-1b2a-46a5-82d7-c3930b4a50e6.jpeg)
©2010 kumamoto pref. kumamon


…まあこんな感じです。。

# 振り返り
　毎回「hey」と入力するのが面倒であれば、Outgoing WebHooksの設定でAnyではなく特定のチャンネルを選ぶとTrigger Wordを入力しなくても会話ができそうです。
　今後はもっとくまもんっぽくしゃべりができるよう修正していきたいと思っています。
　また、SlackのTokenとAWS KMSを使って前回のQiita同様セキュリティを高めてもよいかと思いましたが、面倒になってやめました。
[前回投稿したQiita](http://qiita.com/d-yamanaka/items/47acb4a92949e5a749aa)

# 参考にさせていただきました！
ありがとうございます！

[AWS Lambda を使って Slack ボット (命名: Lambot [ランボー]) を低予算で作ろうじゃないか](http://qiita.com/exabugs/items/e868df55333d0805acb2)

[人工知能ボットAPIを使ってSlack上で会話してみた](http://qiita.com/naoyamuto/items/89cf0c049ff7db8bc0d3)