以下の内容はhttps://tech.guitarrapc.com/entry/2016/12/06/040058より取得しました。


.NET Core on LambdaでSlack Slash Commandを作ってみよう

さて、前回、前々回と .NET Core on Lambdaの下回りを見てきました。

https://tech.guitarrapc.com/entry/2016/12/02/053001

https://tech.guitarrapc.com/entry/2016/12/05/055458

大事なパッケージ周りやデプロイについては別の機会にするとして、そろそろ簡単なコマンドをWebhookで投げて返してみましょう。ついでにLambdaの環境変数も触っておきます。

サンプル

今回実装のサンプルとするのは、Azure Functionsの時に見かけたSlackのSlash Commandを作ってみたという例です。SlackのSlash Command入力を起点に、Slack (Post) -> Azure Functions (コード実行) -> Slackという流れです。

https://blog.xin9le.net/entry/2016/04/01/042452

API Gateway + AWS Lambda

AWS Lambdaはステートを持たないイベントドリブンなアプリケーション実行環境です。そのため、Azure Functionsと異なり単体では外部Webリクエストを受け付けたり返却できません。

そこで、Slack -> Azure Functions / Slack -> Azure Functionsの該当する接続部分にSlack -> Azure Functionsを用いるのが定石となっています。今回もそれに従いましょう。

AWS Lambda のコード作成

.NET Core on AWS Lambdaの最も使いやすいポイントは、ローカル実行環境の整備とふつうのC# (.NET Core)を普通にかけることです。今回は、Slack Slash Commandが送られてきたら、Hello from Lambda .NET Core. と返させてみます。

https://gist.github.com/guitarrapc/5fba786b88dd36c3c84a6e1b9772cabc

コードはごく単純です。

Slack Slash Commandで返ってくるJSONをSlackSlashCommandクラスでデシリアライズしてLambda関数に受けます。あとは、SlackSlashCommandでつながれている入力文字列を分割して、SlackSlashCommandで区切られたKey/Valueから値を取得しています。

続いて、Lambdaの環境変数に埋めたトークンと送信されてきたトークンの一致を検証しています。本来なら、処理内部ではなく前段のAPI Gateway時点ではじきたいのですが、API GatewayのAPIキー指定がHeader利用で、Slack Slash Commandの送信ヘッダをいじれないためシカタナイです。

最後に、Slackに対してレスポンスを返しています。

AWS Lambda のコードをアップロードと環境変数操作

Visual Studioからのアップロードにて、Lambda関数の環境変数も併せて調整可能です。

今回は、SlackSlashCommandWebhook としてLambda関数を作成しました。

Azure Functionsでもそうでしたが、環境変数を利用することでコードから機微情報を除外できるのでとてもいいです。特にAWS LambdaはKMSによる暗号化もかかっていて一定の安心感があります。環境変数については参考にできるサイトがいくつもあります。より詳しく知りたい方はこちらへ。

https://dev.classmethod.jp/cloud/aws/aws-lambda-env-variables/

API Gateway に API を作成

続いて、SlackのSlash Command (という名のWebhook) を受けるためAPI GatewayでAPIを作成します。SlackのSlash CommandはPOSTでリクエストできるので、GETではなくPOSTにします。

先ほど作成した、Lambda関数をバックエンドに指定しておいてください。これで次のようなAPI Gatewayの設定ができました。

さて、Slack Slash CommandはJSONではなくapplication/x-www-form-urlencodedとしてリクエストしてくるのですが、Lambda関数はJSONで入力されることを期待しています。そこで、application/x-www-form-urlencodedを調整して、リクエストボディからJSONを抽出してLambda関数に渡します。具体的に、次の通り入力します。

Content-Type 処理
application/x-www-form-urlencoded { "body": $input.json("$") }

これでAPI Gatewayの設定が出来ました。Deploy APIでス任意の環境にデプロイしてみましょう。

デプロイすると、APIのURLが定まります。

Slack の Slash Command を作成する

API GatewayのURLが定まったので、SlackにSlash Commandを作成します。URL欄には、API Gatewayで作成したAPIのURLを入れます。

準備できましたか?

早速実行してみます。

うまくいきましたね!

まとめ

従来Node.jsやPython、Javaでやっていたことは基本的に .NET Coreでも同様にできるでしょう。手始めにSlackを用いましたが、別の様々なサンプルの移行が簡単にできます。当然、Azure Functionsで実装していたものは、ほぼそのまま移行できます。次はそのあたりを。

今回のコードサンプルも追加しておきます。

https://github.com/guitarrapc/AWSLambdaCSharpIntroduction




以上の内容はhttps://tech.guitarrapc.com/entry/2016/12/06/040058より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14