AWSのLambda(Node.js)でDynamoDBを操作_レコードの取得・挿入・更新・上書き・削除

2021-03-28

Scan, Query, PutItem, UpdateItem, DeleteItem

AWSのLambda(Node.js)からDynamoDBのデータを取得したり、削除したり、またDynamoDBにデータを書き込んだりする方法をまとめて記載します。

できるだけコピペすればOKの状態にしてます。

  1. 全レコードの取得 ⇒ Scan
  2. 特定のレコードを取得 ⇒ Query
  3. レコードの作成・上書き ⇒ PutItem
  4. レコードの作成・更新 ⇒ UpdateItem
  5. レコードの削除 ⇒ DeleteItem

1. 全レコードの取得 ⇒ Scan

Scanは、テーブル内の全てのアイテムにアクセスし全レコードを返します。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let res= await dynamoscan();//データスキャン
    
    return res;
};

function dynamoscan(){
    return new Promise((resolve, reject) => {
        let params = {
            "TableName": "TableName",//テーブル名を指定
            "ReturnConsumedCapacity": "NONE"
        };
        dynamo.scan(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                //console.log("data count:",data.Count);
                resolve(data.Items);
            }
        });
    });
}

2. 特定のレコードを取得 ⇒ Query

パーティションキー(pk)やソートキー(sk)を使って、条件に合致したレコードを絞り込んで返します。
ここではpkとskの値が分かってる場合の使い方を記載します。
検索方法はいろいろあるので別記事で紹介します。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {
    let prm={
        tablename:"tablename",//テーブル名
        pk_name:"pk_name",//pkの名称
        pk_prm:{S:"pk_prm"},//検索pkの指定
        sk_name:"sk_name",//skの名称
        sk_prm:{S:"sk_prm"},//検索skの指定
    };
    let res= await dynamoquery_pksk(prm);
    
    return res;
};

function dynamoquery_pksk(obj){
    return new Promise((resolve, reject) => {
        let params = {
            "TableName": obj.tablename,
            "KeyConditionExpression": "#pk_name = :pk_prm and #sk_name = :sk_prm",//検索条件
            "ExpressionAttributeNames":{
                "#pk_name": obj.pk_name,
                "#sk_name": obj.sk_name,
            },
            "ExpressionAttributeValues": {
                ":pk_prm": obj.pk_prm,
                ":sk_prm": obj.sk_prm,
            }
        };
        dynamo.query(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve(data.Items);
            }
        });
    });
}

3. レコードの作成・上書き ⇒ PutItem

新しいレコードを作成するか、古いレコードを新しいレコードに上書きします。
新しいレコードと同じ主キーを持つレコードが指定テーブルに既にある場合、新しいレコードは既存のレコードに上書きします。
既存レコードにカラムを追加したい場合はUpdateItemを使います。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let Item_row = {
        column1:{S:"column1"},
        column2:{S:"column2"},
        column3:{S:"column3"}
    };
    let prm={
        "TableName":"tablename",//テーブル名
        "Item":Item_row//書き込みアイテム
    };

    let res= await dynamoPutItem(prm);
    
    return res;
};

function dynamoPutItem(obj){
    return new Promise((resolve, reject) => {
        let params = obj;
        dynamo.putItem(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve("updated");
            }
        });
    });
}

4. レコードの作成・更新 ⇒ UpdateItem

既存のレコードがある場合は編集・新しいカラムの追加などが行えます。
既存のレコードがない場合はPutItem同様、新しいレコードを作成します。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let prm = {
        TableName: "tablename",
        Key: {
            pk_name:{S:"pk_prm"},
            sk_name:{S:"sk_prm"},
        },
        UpdateExpression: "set #v1=:v1,#v2=:v2",
        ExpressionAttributeNames:{
            "#v1":"datetime",//カラム名
            "#v2":"value",//カラム名
        },
        ExpressionAttributeValues: {
            ":v1": {S:"2021-03-10T10:10:10"},//カラムの値
            ":v2": {N:"2.34"},//カラムの値
        }
    };

    let res= await dynamo_update(prm);
    
    return res;
};

function dynamo_update(params){
    return new Promise((resolve, reject) => {
        dynamo.updateItem(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                //console.log(data);
                resolve("updated");
            }
        });
    });
}

5. レコードの削除 ⇒ DeleteItem

プライマリーキーpk、(ソートキーsk)を指定して、レコードを削除します。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let prm={
        TableName:"tablename",
        Key:{
            pk_name: {S: "pk_prm"},
            sk_name: {S: "sk_prm"}
        }
    };

    let res= await dynamoDeleteItem(prm);
    
    return res;
};

function dynamoDeleteItem(params){
    return new Promise((resolve, reject) => {
        dynamo.deleteItem(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve("deleted");
            }
        });
    });
}

参考