今日もAmazon API Gatewayを撫でた

帰宅後に r7kamura/fluct の開発をちょっと進めて、AWS Lambdaの関数でHTTPリクエストのパスとかリクエストボディの内容とかを取れるようにした。文字で説明しただけでは意味が分からないだろうと思いデモを用意しましたのでこちらをご覧ください。

https://os92ef4zmf.execute-api.us-east-1.amazonaws.com/production/echo

us-east (バージニア) のAmazon API Gatewayにos92ef4zmfというIDのREST APIを作成してあって、これのproduction環境にGET /echoというエンドポイントを用意している。このエンドポイントは内部でAWS Lambda上に作成したshow_echoという関数を実行するように設定されていて、show_echoはAPI Gatewayから受け取ったパラメータをそのままJSON形式でレスポンスボディとして返すように実装されてる。で、「API Gatewayから受け取ったパラメータ」と書いたけれど、デフォルトではAPI GatewayからLambdaには何のパラメータも渡されないように設定されているので、ここに持てる限りの情報を渡してもらえるように祈りを捧げたというのが今回の活動内容になります。

Amazon API GatewayとAWS Lambdaを連携させたときにHTTPリクエストの情報をLambda側から参照できるようにするの、かなり大変というかやり方が特に説明されてなくて困った。他の人絶対困ってるだろうと思いつつも、インターネット見渡しても岩とか持ち上げない限りAmazon API Gateway使ってる人とかまだいないので、他の人とかいうのも存在しないのかもしれない。しかし諦めずに https://forums.aws.amazon.com/forum.jspa?forumID=199 というAmazon API Gatewayのフォーラムを掘り進めたところ、数人困っている人間を発見し、更に1人だけ答えに辿り着いた人がいて、ああ、いるところにはいるもんだなあと感心した。

image

このIntegration Requestというのを選んで、

image

Mapping Templateというのを開いて、application/json を追加し、

image

テンプレートの内容を編集し、VTLという古の言語を使って正しい形式のJSONが描画されるように編集する。VTLというのは、Apache VelocityというJavaベースのテンプレートエンジンがあって、その中で使う言語がVTL (Velocity Template Languate)。API Gatewayのドキュメント にどういう変数と関数が提供されているかが書いてあって、Apache Velocityでググって http://velocity.apache.org/engine/devel/user-guide.html とかの説明を見るとマップ構造を走査する方法が把握できる。ので、最終的に こういうの を書けばHTTPリクエストの情報をテンプレート経由でLambdaに渡せるはこびとなった。