Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@ma2shita

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

注意: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ベースなものが多いと思うので、これは是非とも対応してもらいたい。。。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What are the problem?