Githubの awslabs は様々なAWSに関連するソフトウェアのリポジトリですが、その中でAWS SAM Localというものがあります。

AWS SAM Local 🐿 とは?
AWS SAM Local 🐿 is a CLI tool for local development and testing of Serverless applicationsということで、日本語にすると『AWS SAM Localはサーバーレスなアプリケーションをローカルで開発およびテストするためのCLIツールです』といった感じになるのかな、と。
Getting Startedしてみる
README.mdには様々なことが書かれていますが、まずは手を動かしてはじめてみましょう。詳細はHOWTO.mdに書かれています。
RestfulにCRUDなサービスを提供するAPI
今回はCRUDなアプリケーションを作成します。
– products.js
– template.yaml
yamlファイルはAWS SAMのテンプレートで、下記のように/productsに対するAPIリクエストに対する設定になります。
– Createの場合は、POSTリクエストを /products に
– 全てをListする場合は、GETリクエストを /products に
– Read, update, deleteの場合は、それぞれGET, PUT or DELETEリクエストを /products/{product} に
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: My first serverless application.
Resources:
Products:
Type: AWS::Serverless::Function
Properties:
Handler: products.handler
Runtime: nodejs6.10
Events:
ListProducts:
Type: Api
Properties:
Path: /products
Method: get
CreateProduct:
Type: Api
Properties:
Path: /products
Method: post
Product:
Type: Api
Properties:
Path: /products/{product}
Method: any
上記のAPIに対応するLambda Functionのコードを products.js に例えば動作確認目的用にコメントだけ返すようなコードを以下のように実装します。
'use strict';
exports.handler = (event, context, callback) => {
let id = event.pathParameters.product || false;
switch(event.httpMethod){
case "GET":
if(id) {
callback(null, {
statusCode: 200,
body: "This is a READ operation on product ID " + id
});
return;
}
callback(null, {
statusCode: 200,
body: "This is a LIST operation, return all products"
});
break;
case "POST":
callback(null, {
statusCode: 200,
body: "This is a CREATE operation"
});
break;
case "PUT":
callback(null, {
statusCode: 200,
body: "This is a UPDATE operation on product ID " + id
});
break;
case "DELETE":
callback(null, {
statusCode: 200,
body: "This is a DELETE operation on product ID " + id
});
break;
default:
// Send HTTP 501: Not Implemented
console.log("Error: unsupported HTTP method (" + event.httpMethod + ")");
callback(null, { statusCode: 501 })
}
}
SAM CLIを使う
上記のファイルをディレクトリに配置した状態でsamコマンドを叩きます。SAM CLIはnpmを使って簡単にインストールすることが出来ます。
npm install -g aws-sam-local
# と言いつつ、私の場合(Mac)は権限周りで失敗してて↓しましたが、、、
# $ sudo chown -R $(whoami) /usr/local/{lib/node_modules,bin,share}
# 詳細は→のISSUE参照 https://github.com/awslabs/aws-sam-local/issues/66
また、AWS SAMはDockerを使うので、もしご自身のマシンにまだDockerが入っていなかったら普通にDocker for Macとか使ったりして。
そんなこんなで sam local start-api を叩くと、それっぽいDocker Imageとか落としてくるので最初は多少時間かかりますが↓のようにローカルホストの3000ポートを使ってアレコレできるようになります。
$ sam local start-api
2017/10/23 10:32:58 Connected to Docker 1.32
2017/10/23 10:32:58 Runtime image missing, will pull....
2017/10/23 10:32:58 Fetching lambci/lambda:nodejs6.10 image for nodejs6.10 runtime...
nodejs6.10: Pulling from lambci/lambda
5aed7bd8313c: Pull complete
d60049111ce7: Pull complete
df2c17ad5e5e: Pull complete
93956b6301bb: Pull complete
Digest: sha256:7eb4ced6a15ae3c30effc4ec0cd3aabb2bd57c9a8330b37920c3d5d722d81083
Status: Downloaded newer image for lambci/lambda:nodejs6.10
Mounting products.handler (nodejs6.10) at http://127.0.0.1:3000/products/{product} [OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT]
Mounting products.handler (nodejs6.10) at http://127.0.0.1:3000/products [POST]
Mounting products.handler (nodejs6.10) at http://127.0.0.1:3000/products [GET]
Mounting static files from public at /
You can now browse to the above endpoints to invoke your functions.
You do not need to restart/reload SAM CLI while working on your functions,
changes will be reflected instantly/automatically. You only need to restart
SAM CLI if you update your AWS SAM template.
例えばプロダクトをLISTするようなオペレーションは、Lambda用のJavaScriptで書いたコメントが表示されます。
$ curl http://localhost:3000/products This is a LIST operation, return all products $ curl -XPUT http://localhost:3000/products/1 This is a UPDATE operation on product ID
JavaScriptに変更を入れる場合は、自動的に反映されるのでstart-apiしなくてもOKです。
CloudFormationを使ってAWSの環境へデプロイ
ココから先はSAMというより、CloudFormationを利用する形になります。具体的には、独自のサーバーレスアプリケーションを作成する に記載されているように↓のような流れ。それぞれのコマンドのパラメーター等の詳細に関しては↓公式のドキュメントをご参照ください。
http://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html
http://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/index.html
– パッケージを配置するS3のバケットを用意して
aws s3 mb s3://bucket-name --region region
– S3バケットに配置して
aws cloudformation package --template-file example.yaml --output-template-file serverless-output.yaml --s3-bucket s3-bucket-name
– API GatewayとAWS Lambdaにデプロイ
aws cloudformation deploy --template-file serverless-output.yaml --stack-name new-stack-name --capabilities CAPABILITY_IAM
実践AWS Lambda 「サーバレス」を実現する新しいアプリケーションのプラットフォーム
Amazonで西谷 圭介の{ProductTitle}。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。

コメント