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"}}'
“AWS LambdaからNode.jsでDynamoDBのクエリを実行する。” への1件の返信