AWS 「APIGateway」と「Lambda」でサーバレス「slack bot」を作る

AWS 「APIGateway」と「Lambda」でサーバレス「slack bot」を作る

こんにちは、

「決戦は金曜日」、、、ではなく、

「日曜日はプレゼン」な、ヤマです。

 

タイトル通り、

 

AWSの「API Gateway」と「Lambda」を使って、社内専用の「slack bot」を

作ってみたいと思ってます。

 

サーバレスで。

 

 

すべての手順を書くと、ものすごく面倒なので、いつものように概要だけ。

 

ハショリマス。

slackは既にアカウントをお持ちという前提で。

 

処理の全体は以下のようになります。

 

slackへ投稿 ⇒ Outgoing Webhook(slack) ⇒ API Gateway(AWS) ⇒ Lambda(AWS) ⇒ Incoming Webhook(slack) ⇒ ボットからの返答が表示される

 

以下、作成手順

 

1)Outgoing Webhook を登録します

 Outgoing Webhookには、ボットを呼び出すキーワードを「Trigger Words」に設定します。

 API Gatewayを呼び出すためのURLを指定します。(後から作るAPI GatewayのエンドポイントURLを指定してください)

 

2)Incoming Webhook を登録します

 Incoming Webhookでは、Lambda(AWS)から投稿するためのURLが生成されますので、

 作って控えておきましょう。

 

3)Lambdaを作成します

 node.jsを触った事がないので、ここは下記の記事を参考にさせて頂きました。

 http://qiita.com/tmtysk/items/7161b11e20ac5e2dfc01

 投稿先は、slackのIncomingWebhookで生成されたURLです。

 

4)API Gatewayを登録します

 「APIを作成」から作成します。

 POSTメソッドを作成し、「メソッドリクエスト」内の「URLクエリ文字列パラメータ」に、

 OutgoingWebhookで渡されるパラメータ群を設定します。

 詳しくは、OutgoingWebhook画面内にある「Outgoing Payload and Responses」をexpandすると

 表示されますので、そちらをご覧ください。

 

 続いて、「統合リクエスト」内にある、本文テンプレートマッピングを編集します。

 slackからPOSTされる「x-www-form-urlencoded」を、Lambdaで処理する「JSON」へマッピングするための処理です。

 こちらの記事が参考になりそうです。

 http://tech.feedforce.jp/aws-lambda.html

 

 最後に、デプロイしてエンドポイントURLが生成されますので、OutgoingWebhookのURLで指定します。

 

 

えらいハショッテしまいました。。。(・ω・;)

 

 

slackに対して、特定の文字列を投稿すると、OutgoingWebhook(slack)が反応して、APIGateway(AWS)を呼び出し、

APIGateway(AWS)はOutgoingWebhook(slack)でPOSTされるデータをうまいこと、JSONに変換して、Lambda(AWS)へ渡します。

Lambda(AWS)でデータを受け取り、好きなように処理したあと、

IncomingWebhook(slack)に対して投稿すれば、ボットからslackへ自動的に投稿される、

という仕組みです。

 

Lambdaの裏では、node.jsが動いています。

Java8やPythonも動きますので、

完全にサーバレスなWEBアプリが作れちゃいます。

もちろんさらにその裏ではDBサービスとの連携もできます(たぶん。。。)

 

Lambdaでは、リクエスト回数と、実行時間、処理に割り当てるメモリによって

料金が変わるようです。

 

わざわざサーバを立てず、お手軽に連携アプリを作るなら、選択肢の一つとしていかがでしょうか。

 

ちなみに今回は、AWSの色んなサービスを使ってみようと思い、

勉強も兼ねて作っています。

間違いなどありましたら、ぜひご指摘ください!