AWSメモ >

AWS DynamoDBへのJSON登録/取得

テーブルの作成

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関数の作成

TODO: handler を分けた方が良さそう

https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/api_backend

index.js

'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 + ")" } );
    }
}

API Gateway の作成

以下の通り作成し、すべて上記の Lambda関数に引っ付ける。
※「Lambda プロキシ統合の使用」は ON。

routes.png

URI一覧

URIメソッド説明
/GET一覧取得
/POST登録
/{id}GET一意検索
/{id}PUT更新
/{id}DELETE削除

全メソッドとも以下の通り設定する

項目設定内容
統合タイプLambda 関数
Lambdaプロキシ統合の使用On
Lambda リージョン上記で作成したLambda関数のリージョン
Lambda 関数上記で作成したLambda関数名

作成後は忘れずにデプロイ。
※デプロイしたらエンドポイントを確認しておく。

動作確認

一覧検索

curl https://上記で確認したエンドポイント

登録

curl -XPOST --data '{"id":"A001", "name":"Taro Yamada", "children":[{"name":"ichiro", "age":3}]}' https://上記で確認したエンドポイント

一意検索

curl https://上記で確認したエンドポイント/A001

更新

curl -XPUT --data '{"name":"Taro Yamada", "children":[{"name":"ichiro", "age":4}, {"name":"jiro", "age":0}]}' https://上記で確認したエンドポイント/A001

削除

curl -XDELETE https://上記で確認したエンドポイント/A001

添付ファイル: fileroutes.png 90件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-30 (木) 09:41:55 (382d)