サーバレスアプリケーションフレームワーク JAWS を使ってみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

モバイルアプリサービス部の五十嵐です。

AWS LambdaとAPI Gatewayを使ったサーバレスアプリケーションフレームワークを見つけたので軽くさわってみました。

スクリーンショット 2015-10-07 1.13.28

JAWSとは

AWS LambdaとAPI Gatewayを使ったサーバレスなアプリケーションフレームワークです。Lambdaを用いることにより巨大なスケールアウトとコスト削減ができるということです。オープンソースで現在はベータ版として提供されています。

jaws-framework/JAWS

また、現地時間の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: (you@yourapp.com)
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 jaws-4ydf3Rh1l@0.0.1 No license field.
jaws-core-js@0.0.2 node_modules/jaws-core-js
└── dotenv@1.2.0
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) lGreetingsHelloE) /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の方はリソースが生成されているのが分かります。

スクリーンショット 2015-10-07 1.05.33

Lambdaの方はソースコードがS3にアップロードされているので、ここからの編集はできなさそうです。

スクリーンショット 2015-10-07 1.06.03

所感

今回はQuick Startをそのままやってみました。Lambdaを使うということでスケールアウトの問題はなさそうですが、応答性とか複雑なアプリケーションをどうやって作ればいいのかとか、まだまだ未知な部分がありますが、LambdaとAPI Gatewayだけでアプリケーションを作る日も近いかもしれません。

現地レポート待ってます!!

参考