AWSメモ > AWS LambdaからDynamoDBに接続する

AWS LambdaからDynamoDBに接続する

テーブルの作成

マネージメントコンソールのDynamoDB から以下の通りテーブルを作成する

項目名
テーブル名books
プライマリキーid(数値)
デフォルト設定の使用off
セカンダリインデックスisbn(文字列)
title(文字列)
IAM ロール新しいロール: DynamoDBAutoscaleRole

Lambda関数を作成する

マネージメントコンソールのLambda から、以下の通りLambda関数を作成する。

項目
関数名dynamo-example
ロールAWSLambdaFullAccess、AmazonDynamoDBFullAccess、CloudWatchLogsFullAccess を持つロール( 無い場合は作成する )

DynamoDBへのアクセスを AWS.DynamoDB で行うのか AWS.DynamoDB.DocumentClient で行うのかが悩ましいが、
ここではシンプルに書けそうな AWS.DynamoDB.DocumentClient でコーディングする。(いったん)
※恐らく、それぞれシーンに適した使い方があるのだと思うが。

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

関数コード

'use strict';

var AWS = require('aws-sdk');
//var dynamodb = new AWS.DynamoDB();
var documentClient = new AWS.DynamoDB.DocumentClient();

const createResponse = (callback, statusCode, body) => {
    var res = {
        "statusCode": statusCode,
        "headers": { "Test-Headr1": "1234" },
        "body": JSON.stringify(body)
    }
    callback(null, res);
}
exports.handler = (event, context, callback) => {
    let id = false;
    if (event.pathParameters){
        id = event.pathParameters.id || false;
    }
    let req = event.body;
    if (typeof(event.body) === "string") {
        // TODO: 暫定(JSON文字列を受け取った場合のパース)
        let jsonBody = event.body.replace(/=/g,":").replace(/&/g, ",").replace(/([^:,]+):([^:,]*)/g, "\"$1\":\"$2\"");
        req = JSON.parse("{"+jsonBody+"}");
    }
    switch(event.httpMethod){
        case "GET":
            if(id && id > 0) {
                var params = {
                  TableName : 'Books',
                  FilterExpression : 'id = :id',
                  ExpressionAttributeValues : {':id' : parseInt(id,10) }
                };
                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" : parseInt(req.id, 10),
                    "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" : parseInt(id, 10) },
                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" : parseInt(id, 10) }
            };
            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:
            // Send HTTP 501: Not Implemented
            console.log("Error: unsupported HTTP method (" + event.httpMethod + ")");
            createResponse(callback, 501, { "msg": "Error: unsupported HTTP method (" + event.httpMethod + ")" } );
    }
}

API Gateway の作成

マネージメントコンソールのAPI GateWay から、以下の通りAPIを作成する。

API 名: lambda-example-api

api-gateway.png

URI一覧

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

全メソッドとも以下の設定で作成

項目
統合タイプLambda関数
Lambda プロキシ統合の使用on
リージョンap-northeast-1
Lambda 関数dynamo-example(上記で作成した関数名)

作成後は「APIをデプロイ」からデプロイ。

動作確認

# 一覧検索
curl -v https://エンドポイント/book

# 一意検索
curl -v https://エンドポイント/book

# 登録
curl -v -XPOST --data "id=1&isbn=A0001&title=test00A&price=1111" https://エンドポイント/book

# 更新
curl -v -XPUT --data "isbn=B0001&title=test00B&price=2222" https://エンドポイント/book/1

# 削除
curl -v -XDELETE https://エンドポイント/book/1

添付ファイル: fileapi-gateway.png 129件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-07 (火) 00:36:57 (405d)