[[AWSメモ]] > * AWS DynamoDBへのJSON登録/取得 [#q38b7968] #setlinebreak(on); #contents ** テーブルの作成 [#j5d71e39] #myterm2(){{ aws dynamodb create-table \ --table-name JsonSample1 \ --attribute-definitions \ AttributeName=id,AttributeType=S \ AttributeName=name,AttributeType=S \ --key-schema AttributeName=id,KeyType=HASH AttributeName=name,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \ --profile developper }} ※事前に名前付きプロファイルを設定しておく。([[AWS CLIコマンドのメモ]]を参照) ** Lambda関数の作成 [#z5c813af] #html(<div style="padding-left:20px;">) #TODO(handler を分けた方が良さそう) https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/api_backend index.js #mycode2(){{ 'use strict'; var AWS = require('aws-sdk'); var documentClient = new AWS.DynamoDB.DocumentClient(); var querystring = require('querystring'); 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; if (typeof(req) === "string") { req = JSON.parse(req); } var id = false; if (event.pathParameters){ id = event.pathParameters.id || false; } switch(event.httpMethod){ case "GET": if(id) { // scan だと全件検索 //var params = { // TableName : 'JsonSample1', // FilterExpression : 'id = :id', // ExpressionAttributeValues : {':id' : id } //}; //documentClient.scan(params, function(err, data) { var params = { TableName : 'JsonSample1', KeyConditionExpression: '#id = :id', ExpressionAttributeNames:{ '#id': 'id'}, ExpressionAttributeValues:{':id': id } }; documentClient.query(params, function(err, data) { if (err) { createResponse(callback, 500, { "msg": "Get Error!", "err": err, "params" : params }); } else { var result = data; if (data.Items) { data = data.Items[0] || {}; var childCount = data.children ? data.children.length : 0; result = { "data" : data , "message" : data.name + " has " + childCount + " children" } } createResponse(callback, 200, result); } }); return; } else { var params = { TableName : 'JsonSample1' }; documentClient.scan(params, function(err, data) { if (err) { createResponse(callback, 500, { "msg": "List Error!", "err": err}); } else { var result = data.Items || data; createResponse(callback, 200, result); } }); } break; case "POST": var params = { TableName : 'JsonSample1', Item: { "id" : req.id, "name" : req.name, "children" : req.children } }; documentClient.put(params, function(err, data) { if (err) { console.log(err); createResponse(callback, 500, { "msg": "Create Error!", "err": err, "params": params, "req": req}); } else { createResponse(callback, 200, { "msg": "Create OK!", "params": params }); } }); break; case "PUT": var params = { TableName : 'JsonSample1', Key: { "id" : id }, ExpressionAttributeNames: { "#name" : "name", "#children" : "children" }, ExpressionAttributeValues: { ":name" : req.name, ":children" : req.children }, UpdateExpression: "SET #name = :name, #children = :children" }; documentClient.update(params, function(err, data) { if (err) { createResponse(callback, 500, { "msg": "Update Error!", "err": err, "params": params }); } else { createResponse(callback, 200, { "msg": "Update OK!", "params": params}); } }); break; case "DELETE": var params = { TableName : 'JsonSample1', Key: { "id" : id } }; documentClient.delete(params, function(err, data) { if (err) { createResponse(callback, 500, { "msg": "Delete Error!", "err": err, "params" : params }); } else { createResponse(callback, 200, { "msg": "Delete OK!", "params": params }); } }); break; default: console.log("Error: unsupported HTTP method (" + event.httpMethod + ")"); createResponse(callback, 501, { "msg": "Error: unsupported HTTP method (" + event.httpMethod + ")" } ); } } }} #html(</div>) ** API Gateway の作成 [#fdd67c5f] #html(<div style="padding-left:20px;">) 以下の通り作成し、すべて上記の Lambda関数に引っ付ける。 ※「Lambda プロキシ統合の使用」は ON。 #html(<div style="vertical-align:top;">) #html(<div style="display:inline-block;border:1px solid #333;padding:10px;vertical-align:top;">) #ref(routes.png,nolink); #html(</div>) #html(<div style="display:inline-block;vertical-align:top;padding:0px 20px;">) URI一覧 |URI|メソッド|説明|h |/|GET|一覧取得| |/|POST|登録| |/{id}|GET|一意検索| |/{id}|PUT|更新| |/{id}|DELETE|削除| #html(</div>) #html(<div style="display:inline-block;vertical-align:top;padding:0px 20px;">) 全メソッドとも以下の通り設定する |項目|設定内容|h |統合タイプ|Lambda 関数| |Lambdaプロキシ統合の使用|On| |Lambda リージョン|上記で作成したLambda関数のリージョン| |Lambda 関数|上記で作成したLambda関数名| #html(</div>) #html(</div>) 作成後は忘れずにデプロイ。 ※デプロイしたらエンドポイントを確認しておく。 #html(</div>) ** 動作確認 [#cc1b244b] #html(<div style="padding-left:20px;">) *** 一覧検索 [#abb852aa] #myterm2(){{ curl https://上記で確認したエンドポイント }} *** 登録 [#d0d6def0] #myterm2(){{ curl -XPOST --data '{"id":"A001", "name":"Taro Yamada", "children":[{"name":"ichiro", "age":3}]}' https://上記で確認したエンドポイント }} *** 一意検索 [#u61f564f] #myterm2(){{ curl https://上記で確認したエンドポイント/A001 }} *** 更新 [#k0270c7c] #myterm2(){{ curl -XPUT --data '{"name":"Taro Yamada", "children":[{"name":"ichiro", "age":4}, {"name":"jiro", "age":0}]}' https://上記で確認したエンドポイント/A001 }} *** 削除 [#zb872607] #myterm2(){{ curl -XDELETE https://上記で確認したエンドポイント/A001 }} #html(</div>)