fluctでAPI GatewayやLambdaと仲良くやる

https://github.com/r7kamura/fluct というのをつくってて、これを使ってAmazon API GatewayとAmazon Lambda上に簡単にWebアプリをつくれるようにしたいなあと思っている。そうなると、Amazon API GatewayとAmazon Lambdaが適したWebアプリをつくるにあたっては、サーバの用意や管理が要らず、簡単にWebアプリを公開でき、複数の検証環境を手軽に用意でき、エンドポイントごとに独立してデプロイでき、まあまあスケールし、24時間自分専用のサーバを動作させないぶんそれなりに安く、AWSと運命を共にできるといった環境が手に入る。

インストール

fluctはNode.jsで書かれていて、npm経由でインストールできる。なぜNode.jsかと言うと、Amazon LambdaでNode.jsかJava 8しか動かないのでNode.jsにした。先週からNode.js書き始めたのであまりよく分かっていないけど、そのような人間でも簡単なツールがつくれる程度には使いやすいものだと思う。

$ npm install fluct -g

試しにアプリをつくってみる

Railsみたいな感じで fluct new ... で新しいプロジェクトをつくる。

$ fluct new myapp Created ./myapp Created ./myapp/.gitignore Created ./myapp/actions Created ./myapp/actions/.keep Created ./myapp/package.json

エンドポイントを追加してみる

fluctでは GET /foo/bar みたいなAPIのエンドポイントの単位のことをactionと呼んでいて、1つのプロジェクトに複数のactionを持てるようになっている。RailsだとControllerのactionみたいな感じのもの。fluct generate action ... でactionに必要なファイルを生成する機能がある。

$ cd myapp $ myapp generate action list\_users Created ./actions/list\_users Created ./actions/list\_users/dist Created ./actions/list\_users/dist/index.js Created ./actions/list\_users/package.json

デプロイしてみる

package.json にactionの名前とエンドポイントの情報 (GETとか/foo/barとか) が書かれていて (package.jsonにnpmと関係ないメタデータが書かれてるのキモい感じする)、index.js にはLambdaで実行されることになるJavaScriptのコードが書かれている。fluct deploy コマンドでこれらをAPI GatewayとLambdaに送りつけると使えるようになる 。

$ fluct deploy Created ./actions/list\_users/dist.zip Uploaded list\_users function POST https://apigateway.us-east-1.amazonaws.com/restapis DELETE https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/models/Empty DELETE https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/models/Error GET https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources GET https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources POST https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources/k1xqcw5cj8 GET https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources PUT https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources/i7qrat/methods/GET PUT https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources/i7qrat/methods/GET/integration PUT https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources/i7qrat/methods/GET/responses/200 PUT https://apigateway.us-east-1.amazonaws.com/restapis/nob3eusi70/resources/i7qrat/methods/GET/integration/responses/200

確認してみる

AWSの管理画面で見るとこういうのができている。

image

手元で試してみる

あと手元で開発するために fluct server というコマンドも用意してるけどこれはまだ実験段階。

$ fluct server Server starting on http://127.0.0.1:3000