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