LoginSignup
12
9

More than 5 years have passed since last update.

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

Posted at

目的

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

構成

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

image

人工知能ボットAPIの設定

以下を参考にアカウントを作成し、APIキーを取得します。

人工知能ボットAPIを使ってSlack上で会話してみた

スクリーンショット_090916_044318_PM.jpg

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

Lambdaの設定

ロールの作成

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

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

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

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

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

統合リクエストの設定

こちらの記事に従って、マッピングテンプレートを設定します。
AWS Lambda を使って Slack ボット (命名: Lambot [ランボー]) を低予算で作ろうじゃないか

保存したら、新しいステージを作成し、デプロイしてください。
※今回は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

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

スクリーンショット_090916_042721_PM.jpg
©2010 kumamoto pref. kumamon

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

試してみる

実際に試してみます。

スクリーンショット_090916_045241_PM.jpg
©2010 kumamoto pref. kumamon

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

振り返り

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

参考にさせていただきました!

ありがとうございます!

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

人工知能ボットAPIを使ってSlack上で会話してみた

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9