さて、前回、前々回と .NET Core on Lambdaの下回りを見てきました。
大事なパッケージ周りやデプロイについては別の機会にするとして、そろそろ簡単なコマンドをWebhookで投げて返してみましょう。ついでにLambdaの環境変数も触っておきます。
サンプル
今回実装のサンプルとするのは、Azure Functionsの時に見かけたSlackのSlash Commandを作ってみたという例です。SlackのSlash Command入力を起点に、Slack (Post) -> Azure Functions (コード実行) -> Slackという流れです。
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で実装していたものは、ほぼそのまま移行できます。次はそのあたりを。
今回のコードサンプルも追加しておきます。