AWSメモ > AWS Lambda のローカル開発手順 †
事前準備 †aws-sdk と AWS CLI をインストールしておく。 SAM Local のインストール †# NPMでインストール npm install -g aws-sam-local # インストール(バージョン)確認 sam --version Dockerのインストール †「SAM Local は docker-lambda というカスタマイズされた Docker イメージを自動的に提供します」という事らしい。 インストールガイドに従ってインストール DynamoDB ローカルのインストール †参考) https://s3.ap-south-1.amazonaws.com/dynamodb-local-mumbai/dynamodb_local_latest.zip からダウンロード、解凍する。 DymanoDBの開始 java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb ※デフォルトでは localhost:8000 で動作する。 ローカルIPアドレスの確認 †上記で起動した DynamoDB はホストOS上の 8000ポートで動作しているが、 なので、ローカルホストの IPアドレスを確認し、lo0 に 127.0.0.1 (localhost) 以外のアドレスが割り当たっていない場合は、以下の通り割り当てる。 sudo ifconfig lo0 alias 10.20.30.40/24※10.20.30.40/24 は 割り当てる IPアドレスとサブネットマスク SAM localの 主なCLI オペレーション †
SAM Local によるシンプルなアプリケーションの構築 †Lambda関数の作成 †TODO: handler を分けた方が良さそう
https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/api_backend book.js 'use strict'; var AWS = require('aws-sdk'); var dynamoOpt = {apiVersion: '2012-08-10'}; if (process.env.DYNAMO_REGION && process.env.DYNAMO_END_POINT) { dynamoOpt.region = process.env.DYNAMO_REGION; dynamoOpt.endpoint = process.env.DYNAMO_END_POINT; } var documentClient = new AWS.DynamoDB.DocumentClient(dynamoOpt); const createResponse = (callback, statusCode, body) => { var res = { "statusCode": statusCode, "body": JSON.stringify(body) } callback(null, res); } exports.handler = (event, context, callback) => { var req = event.body || event; if (typeof(req) === "string" && req !== "") { req = JSON.parse(req); } var id = false; if (event.pathParameters){ id = event.pathParameters.id || false; } switch(event.httpMethod){ case "GET": if(id && id > 0) { var params = { TableName : 'Books', FilterExpression : 'id = :id', ExpressionAttributeValues : {':id' : id } }; documentClient.scan(params, function(err, data) { if (err) { console.log(err); createResponse(callback, 500, { "msg": "Get Error!", "err": err}); } else { createResponse(callback, 200, data); console.log(data); } }); return; } else { var params = { TableName : 'Books' }; documentClient.scan(params, function(err, data) { if (err) { console.log(err); createResponse(callback, 500, { "msg": "List Error!", "err": err}); } else { createResponse(callback, 200, data); console.log(data); } }); } break; case "POST": var params = { TableName : 'Books', Item: { "id" : req.id, "isbn" : req.isbn, "title" : req.title, "price" : parseInt(req.price,10) } }; documentClient.put(params, function(err, data) { if (err) { console.log(err); createResponse(callback, 500, { "msg": "Create Error!", "err": err, "req": req}); } else { createResponse(callback, 200, { "msg": "Create OK!"}); } }); break; case "PUT": var params = { TableName : 'Books', Key: { "id" : id }, ExpressionAttributeNames: { "#isbn" : "isbn", "#title" : "title", "#price" : "price" }, ExpressionAttributeValues: { ":isbn" : req.isbn, ":title" : req.title, ":price" : parseInt(req.price, 10) }, UpdateExpression: "SET #isbn = :isbn, #title = :title, #price = :price" }; documentClient.update(params, function(err, data) { if (err) { console.log(err); console.log(data); createResponse(callback, 500, { "msg": "Update Error!", "err": err}); } else { createResponse(callback, 200, { "msg": "Update OK!"}); } }); break; case "DELETE": var params = { TableName : 'Books', Key: { "id" : id } }; documentClient.delete(params, function(err, data) { if (err) { console.log(err); console.log(data); createResponse(callback, 500, { "msg": "Delete Error!", "err": err}); } else { createResponse(callback, 200, { "msg": "Delete OK!"}); } }); break; default: console.log("Error: unsupported HTTP method (" + event.httpMethod + ")"); createResponse(callback, 501, { "msg": "Error: unsupported HTTP method (" + event.httpMethod + ")" } ); } } テンプレートの作成 †template-local.yml AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Test serverless application. Resources: BookFunction: Type: AWS::Serverless::Function Properties: Handler: book.handler Runtime: nodejs6.10 Environment: Variables: DYNAMO_END_POINT: http://10.20.30.40:8000 #上記で確認/設定したローカルのIPアドレス DYNAMO_REGION: localhost Events: List: Type: Api Properties: Path: /book Method: get Create: Type: Api Properties: Path: /book Method: post Update: Type: Api Properties: Path: /book/{id} Method: put Delete: Type: Api Properties: Path: /book/{id} Method: delete APIの動作確認 †APIサーバー開始 †sam local start-api --template template-local.yml 動作確認 †一覧 curl -v http://localhost:3000/book 登録 curl -v -XPOST --data '{ "id" : "A01", "isbn" : "ABC001", "title" : "テスト001", "price": 1008 }' http://localhost:3000/book キー指定検索 curl -v http://localhost:3000/book/A01 更新(キー指定) curl -v -XPUT --data '{ "id" : "A01", "isbn" : "ABC001", "title" : "テスト001", "price": 2016 }' http://localhost:3000/book/A01 削除(キー指定) curl -v -XDELETE http://localhost:3000/book/A01 Lambda単体の動作確認 †イベントデータを生成 sam local generate-event apigateway aws-proxy > sample_request.json ※生成したJSONを処理に合わせて書き換える。 実行 sam local invoke BookFunction -e sample_request.json サンプル/参考URL †aws-sdk から DynamoDB を利用するサンプル †http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/dynamodb-examples.html aws-sdk から Lambda を利用するサンプル †http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/lambda-examples.html AWS SAM Local(ベータ版) – サーバーレスアプリケーションをローカルに構築してテストする †SAM ローカルを使用してサーバーレスアプリケーションをローカルでテストする †http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/test-sam-local.html Lambda ベースのアプリケーションをデプロイする †http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/deploying-lambda-apps.html 独自のサーバーレスアプリケーションを作成する(パッケージ化とデプロイ) †http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/serverless-deploy-wt.html Lambda ベースのアプリケーションのデプロイメントを自動化する †http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/automating-deployment.html |