サーバレスアプリケーションフレームワーク JAWS を使ってみる
モバイルアプリサービス部の五十嵐です。
AWS LambdaとAPI Gatewayを使ったサーバレスアプリケーションフレームワークを見つけたので軽くさわってみました。
JAWSとは
AWS LambdaとAPI Gatewayを使ったサーバレスなアプリケーションフレームワークです。Lambdaを用いることにより巨大なスケールアウトとコスト削減ができるということです。オープンソースで現在はベータ版として提供されています。
また、現地時間の10/6から開催されるre:Inventでもセッションが予定されているのでこちらも注目です。
JAWS: The Monstrously Scalable Serverless Framework – AWS Lambda, Amazon API Gateway, and More!
Quick Start
npmをインストールします。
$ npm install jaws-framework -g
アプリケーションを作成します。いくつかインタラクティブな質問が出てくるので、すべてEnterを押してデフォルト設定にしました。そうするといきなりCloudFormationの構築が始まります。この時点でCloudFormationが生成されているので、事前に~/.aws/credential
の設定は必要かと思います。
ちなみに、リージョンの設定をap-northeast-1にしたところ、この後のデプロイでエラーになりました。おそらくAPI Gatewayが東京リージョンに無いためだと思われます。
現在は、API Gatewayも東京リージョンに来ているため、リージョンの設定をap-northeast-1にしても大丈夫です。
$ jaws project create ____ _____ __ __ _________ | | / _ \/ \ / \/ _____/ | |/ /_\ \ \/\/ /\_____ \ /\__| / | \ / / \ \________\____|__ /\__/\__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-4ydf3Rh1l) JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: ([email protected]) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: > us-east-1 us-west-2 eu-west-1 ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... JAWS: Preparing your runtime and installing jaws-core module... npm WARN package.json [email protected] No license field. [email protected] node_modules/jaws-core-js └── [email protected] JAWS: Your project "jaws-4ydf3Rh1l" has been successfully created in the current directory.
アプリケーションの全体像はこんな感じです。
/jaws-4ydf3Rh1l |--.env |--.gitignore |--README.md |--admin.env |--aws_modules |--cloudformation | |--dev | | |--us-east-1 | | | |--resources-cf.json |--jaws.json |--lib |--node_modules | |--jaws-core-js | | |--.npmignore | | |--README.md | | |--awsm.json | | |--env | | | |--index.js | | |--node_modules | | | |--dotenv | | | | |--.editorconfig | | | | |--.npmignore | | | | |--.travis.yml | | | | |--Contributing.md | | | | |--README.md | | | | |--config.js | | | | |--dotenv.png | | | | |--lib | | | | | |--main.js | | | | |--package.json | | | | |--test | | | | | |--.env | | | | | |--config.js | | | | | |--main.js | | |--package.json |--package.json |--tests
プロジェクトの直下に移動し、jaws module create
コマンドでモジュールを作成します。
$ jaws module create greetings hello JAWS: Successfully created greetings/hello
するとaws_modules以下にLambdaのソースコードが生成されます。
|--aws_modules | |--greetings | | |--awsm.json | | |--hello | | | |--awsm.json | | | |--event.json | | | |--handler.js | | | |--index.js
次にjaws dash
コマンドでデプロイします。デプロイするリソースを選択してくださいと聞かれるので、L) lGreetingsHello
とE) /greetings/hello - GET
を選択してデプロイします。L)
はLambda、E)
はAPI GatewayのEndpointですね。L) lGreetingsHelloの方はよく分かりません。
$ jaws dash JAWS: Dashboard for project "jaws-4ydf3Rh1l" ------------------------------------------- Project Summary ------------------------------------------- Stages: dev us-east-1 Lambdas: 1 Endpoints: 1 ------------------------------------------- Select Resources To Deploy ------------------------------------------- greetings/hello L) lGreetingsHello E) /greetings/hello - GET - - - - - > Deploy Selected --> JAWS: ------------------------------------------- JAWS: Dashboard: Deploying Lambdas... JAWS: ------------------------------------------- JAWS: No selected Lambdas to deploy. JAWS: ------------------------------------------- JAWS: Dashboard: Deploying Endpoints... JAWS: ------------------------------------------- JAWS: Endpoint Deployer: Deploying endpoint(s) to region "us-east-1"... JAWS: Endpoint Deployer: "dev - us-east-1": found 1 endpoints to deploy JAWS: Endpoint Deployer: "dev - us-east-1": created a new REST API on AWS API Gateway with ID: a0wsexi0ij JAWS: Endpoint Deployer: "dev - us-east-1": found 1 existing resources on API Gateway JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created resource: greetings JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created resource: hello JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created method: GET JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created integration with the type: AWS JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created new lambda access policy statement JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created method response JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created method response JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created method integration response JAWS: Endpoint Deployer: "dev - us-east-1 - greetings/hello": created method integration response JAWS: Endpoint Deployer: Endpoints for stage "dev" successfully deployed to API Gateway in the region "us-east-1". Access them @ https://a0wsexi0ij.execute-api.us-east-1.amazonaws.com/dev/ JAWS: ------------------------------------------- JAWS: Dashboard: Deployments Completed JAWS: -------------------------------------------
API Gatewayのエンドポイントが作られたのでアクセスしてみます。メッセージが返ってくればOKです!
$ curl -s https://a0wsexi0ij.execute-api.us-east-1.amazonaws.com/dev/greetings/hello {"message":"Your JAWS lambda executed successfully!"}%
AWS Consoleを見てましょう。
API Gatewayの方はリソースが生成されているのが分かります。
Lambdaの方はソースコードがS3にアップロードされているので、ここからの編集はできなさそうです。
所感
今回はQuick Startをそのままやってみました。Lambdaを使うということでスケールアウトの問題はなさそうですが、応答性とか複雑なアプリケーションをどうやって作ればいいのかとか、まだまだ未知な部分がありますが、LambdaとAPI Gatewayだけでアプリケーションを作る日も近いかもしれません。
現地レポート待ってます!!