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

https://github.com/r7kamura/fluct というのをつくってて、これを使ってAmazon API GatewayAmazon Lambda上に簡単にWebアプリをつくれるようにしたいなあと思っている。そうなると、Amazon API GatewayAmazon 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