目的
hubotのためにEC2起動するのはいやだけど、botとお話がしたいなーと思って、サーバーレスでお話しするやつを考えました。
熊本出身なので、くまもんbotを作りました。
構成
Slackの任意のチャンネルから「hey ○○」と飛ばすと、
Outgoing WebHooks → API Gateway → Lambda → UserLocal社の人工知能ボットAPI
とメッセージが伝わり応答が返ってきます。
人工知能ボットAPIの設定
以下を参考にアカウントを作成し、APIキーを取得します。
この設定画面から「~もん」等、話し方の設定ができそうですが、今回はとりあえず置いておきます。
Lambdaの設定
ロールの作成
必要な権限としては特にないのですが、今回はCloudWatch Logsにログを出力するロールを作成してアタッチすることにします。
ロールの名前はkumamon_bot_roleとし、以下ポリシーを紐付けます。
{
"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ファンクションのコードは以下の通りです。
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
統合リクエストの設定
こちらの記事に従って、マッピングテンプレートを設定します。
AWS Lambda を使って Slack ボット (命名: Lambot [ランボー]) を低予算で作ろうじゃないか
保存したら、新しいステージを作成し、デプロイしてください。
※今回はprodステージにデプロイ
Outgoing WebHooksの設定
- Slackにログインした状態でhttps://.slack.com/services/newにアクセス
- 検索ボックスに「Outgoing WebHooks」と入力し選択する
- 「Add Configuration」を選択
- 以下の通り設定
Channel : Any
Trigger Word(s) : hey
URL(s) : API GatewayのURLを指定
botのキャラクターはくまもんに変更しました。(任意)(必須)
設定が完了したら、保存してください。
試してみる
実際に試してみます。
…まあこんな感じです。。
振り返り
毎回「hey」と入力するのが面倒であれば、Outgoing WebHooksの設定でAnyではなく特定のチャンネルを選ぶとTrigger Wordを入力しなくても会話ができそうです。
今後はもっとくまもんっぽくしゃべりができるよう修正していきたいと思っています。
また、SlackのTokenとAWS KMSを使って前回のQiita同様セキュリティを高めてもよいかと思いましたが、面倒になってやめました。
前回投稿したQiita
参考にさせていただきました!
ありがとうございます!