LoginSignup
7

More than 5 years have passed since last update.

AWS IoTから NumericなRangeKeyを持つDynamoDBテーブルへput-itemをする方法

Posted at

注意:2015年12月の時点の情報す。改善されるはずです

概要

AWS IoTはDynamoDBへput-itemできますが、NumericなRange keyを持つDynamoDBテーブルへput-itemができないという制約があります
ですが、Lambdaをつかって変換することでput-itemできるので、その方法です

論よりコード

検証用のDynamoDBテーブル作成

id というPrimaryKey(String型)と timestamp という RangeKey(Numeric型) を持つ demo_dynamo_table というDynamoDBテーブルを作成

DynamoDBテーブル作成
$ aws dynamodb create-table --table-name demo_dynamo_table \
  --attribute-definitions AttributeName=id,AttributeType=S \
    AttributeName=timestamp,AttributeType=N \
  --key-schema AttributeName=id,KeyType=HASH \
    AttributeName=timestamp,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

上記テーブルへput-itemするLambdaを作成

ここでのポイントは event です。これには AWS IoT から送られてきたデータが入っています

Lambda(put_item_to_dynamodb)
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    var r = {
        "TableName": "demo_dynamo_table",
        "Item": {
            "id": event.id,
            "timestamp": parseInt(event.timestamp, 10),
            "field0": event.field0,
            "field1": event.field1
        }
    };
    dynamo.putItem(r, context.done);
}

AWS IoTのルールを作成

トピック topics/device0 に着信したデータを先のLambdaファンクションへ流す設定をします

json:AWS IoT ルール

  • Rule Query Statement: SELECT * FROM 'topics/device0
  • Action: Lambda ⇛ put_item_to_dynamodb

どんなエラーが吐かれているのか?

ちなみに AWS IoTから直接NumericなRangeKeyを持つテーブルへPut-itemすると、CloudWatchに下記のエラーが出力されます

2015-10-22 03:40:58.468 ... [ERROR] EVENT:DynamoActionFailure TOPICNAME:topics/device0 CLIENTID:... MESSAGE:Failed to put Dynamo record. The error received was One or more parameter values were invalid: Type mismatch for key id expected: N actual: S (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: DLQQIDMIGM2SGF3Q5GN0ISTIHNVV4KQNSO5AEMVJF66Q9ASUAAJG). Message arrived on: topics/device0, Action: dynamo, Table: demo_dynamo_table, HashKeyField: device0_id, HashKeyValue: device0_id, RangeKeyField: device0_timestamp, RangeKeyValue: device0_timestamp

あとがき

IoTのデータってtimestampベースなものが多いと思うので、これは是非とも対応してもらいたい。。。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7