AWS LambdaからNode.jsでDynamoDBのクエリを実行する。

Node.jsで書いたAWS LambdaからDynamoDBに対してクエリでデータを抽出する方法です。
久しぶりにNode.jsとDynamoDBに触ったらすっかり忘れていたので将来の自分のためにメモ。

DyanamoDB

テーブル: test_table
プライマリパーティションキー: deviceid
プライマリソートキー: timestamp
データ: test_timestamp, data1


Lambda


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

exports.handler = function(event, context) {
  var device_id = "zoe6120";
  var start_date = "2019-01-01";
  var end_date = "2019-02-13";

  var param = {
      TableName : "test_table",
      KeyConditionExpression: "#hn = :val1 and #ts between :startdate and :enddate",
      FilterExpression: "contains(#tst, :filter1)",
      ExpressionAttributeNames:{
          "#ts": "timestamp",
          "#tst": "test_timestamp",
          "#hn": "deviceid"
      },
      ExpressionAttributeValues: {
          ":val1":device_id,
          ":filter1": "2019-02",
          ":startdate": start_date,
          ":enddate": end_date
      }
  };

  documentClient .query( param, function( err, data ) {
    if (err) {
        context.fail(err)
    } else {
        console.log("success");
    }
  } )
};

クエリの説明

上のtableから プライマリパーティションキー “zoe6120″に一致し、プライマリソートキーのtimestampが”2019-01-01″~”2019-02-13″であり、項目 test_timestamp に”2019-02″が含まれるレコードをフィルタして抽出するクエリを作成してみます。

KeyConditionExpression

ここにパーティションキーとソートキーの条件を記述します。
キー名や条件データはその後のExpressionAttributeNames と ExpressionAttributeValues で別名で定義します。直観的ではないのですが、予約語であるtimestampでもキー名に使用できるからでしょうか

KeyConditionExpression: "#hn = :val1 and #ts between :startdate and :enddate",

これは
1) “#hn” すなわちパーティションキー deviceid が “:val1” すなわち “zoe6120” に等しい
かつ
2) “#ts” (=timestamp) が :startdate (=”2019-01-01″) と :enddate (=”2019-02-13″) のbetween (=間) であるデータに一致します。

FilterExpression

FilterExpression: "contains(#tst, :filter1)",

さらに、フィルターにより、
“#tst” (=test_timestamp) が :filter1 (=”2019-02″) をcontains (=含む) 条件にマッチしたデータが出力されます。

ハマリポイント

フィルタは contains(key, 条件) と”()”を使った式になっています。KeyConditionExpressionでソートキーの条件式は key between 条件1 and 条件2 であり()を使わない式になっています。理由はわかりませんが気を付けましょう。

ExpressionAttributeNames

キーに別名を割り当てます。別名は”#”で始まる文字列です。

ExpressionAttributeNames:{
    "#ts": "timestamp",        //ソートキー
    "#tst": "test_timestamp",  //データキー
    "#hn": "deviceid"          //パーティションキー
},

ExpressionAttributeValues

クエリの条件データの別名です。”:” で始まる文字列です。

ExpressionAttributeValues: {
    ":val1":device_id,         // "zoe6120"
    ":filter1": "2019-02",     // "2019-02"
    ":startdate": start_date,  // "2019-01-01"
    ":enddate": end_date       // "2019-02-13"
}

参考 AWS CLIからDynamoDBの操作

AWS CLIからDynamoDBにテストデータを作成してみました。

tableの作成: cretae-table

$ aws dynamodb create-table --table-name test_table --attribute-definitions \
         AttributeName=deviceid,AttributeType=S \
         AttributeName=timestamp,AttributeType=S \
     --key-schema AttributeName=deviceid,KeyType=HASH AttributeName=timestamp,KeyType=RANGE \
     --provisioned-throughput ReadCapacityUnits=3,WriteCapacityUnits=3

データの挿入: put-item

$ aws dynamodb put-item --table-name 'test_table' --item '{"deviceid": {"S": "zoe6120"},"timestamp": {"S": "2019-02-12T22:55:01+09:00"},"test_timestamp": {"S": "2019-02-12T18:00:00+09:00"},"data1": {"N": "100"}}'

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です