質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

664閲覧

AWSでIoT coreからDynamoDBにデータを複数転送しているのに、スキャン結果が1つしか表示されない。

MaeharaKenji

総合スコア86

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/10/21 22:00

編集2022/10/23 06:18

前提

現在ESP32C3マイコン搭載基板でAWSに信号を送信するプログラムを作っています。
githubのソースコード

実現したいこと

AWSへ送信した信号にタイムスタンプを付けてDynamoDBに蓄積したいです。

発生している問題・エラーメッセージ

AWS Core IoTで受信した信号をルール設定でDynamoDBの用意したテーブルに転送するようにしました。

しかし、

DynamoDBのテーブルでアイテムのスキャンを実行すると、Core IoTで受信した最新の信号が表示されるのですが、最新の1個しか表示されず、過去のデータは出てきません。
結果をcsv出力でダウンロードしてみても1個しか入っていないです。

これは、DynamoDBの設定の間違いがあるからでしょうか?

データを蓄積する方法を教えて下さい。
よろしくお願いします。

テーブルに保存された1個だけのデータ内容

client_idpayloadtimestamp
MAL_CONFIG_AP_023{"SIGNAL_NAME":{"S":"Button_D2"},"onoff_event":{"S":"EVENT_OFF"},"THINGNAME":{"S":"MAL_CONFIG_AP_023"},"alart_type":{"S":"ALART_SIG"}}1666388042207

core IoTで受信できているmqtt信号内容

mqttのテスト受信ではこの表に受信できています。
データ内容に問題があるとかありますか?

イメージ説明

試したこと

IoT coreの”メッセージのルーティング”で設定したIAMロールの内容も掲載します。

ポリシーARN arn:aws:iam::********:policy/service-role/aws-iot-rule-sensor_data2Dynamodb-action-1-role-IoT2DynamoDBRole

json

1{ 2 "Version": "2012-10-17", 3 "Statement": [ 4 { 5 "Sid": "VisualEditor0", 6 "Effect": "Allow", 7 "Action": [ 8 "dynamodb:DeleteItem", 9 "dynamodb:RestoreTableToPointInTime", 10 "dynamodb:PurchaseReservedCapacityOfferings", 11 "dynamodb:CreateTableReplica", 12 "dynamodb:UpdateContributorInsights", 13 "dynamodb:UpdateGlobalTable", 14 "dynamodb:CreateBackup", 15 "dynamodb:DeleteTable", 16 "dynamodb:UpdateTableReplicaAutoScaling", 17 "dynamodb:UpdateContinuousBackups", 18 "dynamodb:PartiQLInsert", 19 "dynamodb:CreateGlobalTable", 20 "dynamodb:EnableKinesisStreamingDestination", 21 "dynamodb:ImportTable", 22 "dynamodb:DisableKinesisStreamingDestination", 23 "dynamodb:UpdateTimeToLive", 24 "dynamodb:BatchWriteItem", 25 "dynamodb:PutItem", 26 "dynamodb:PartiQLUpdate", 27 "dynamodb:StartAwsBackupJob", 28 "dynamodb:UpdateItem", 29 "dynamodb:DeleteTableReplica", 30 "dynamodb:CreateTable", 31 "dynamodb:UpdateGlobalTableSettings", 32 "dynamodb:RestoreTableFromAwsBackup", 33 "dynamodb:RestoreTableFromBackup", 34 "dynamodb:ExportTableToPointInTime", 35 "dynamodb:DeleteBackup", 36 "dynamodb:UpdateTable", 37 "dynamodb:PartiQLDelete" 38 ], 39 "Resource": "*" 40 } 41 ] 42}

解決したときの設定画像(10/23追記)

とりあえず、解決が付きました。AWS IoTのルールアクションの設定で、”パーティションキー”の設定を端末の名称の"device_id"に設定していることが原因だったことがわかりました。
端末名称の”MAL_CONFIG_AP_023”の信号が受信する度に、その名称が固定キーになっていて、その内容を上書き保存動作していたようです。

ログ内容を蓄積させるには、パーティションキーをタイムスタンプにすればよいことがわかりました。

イメージ説明

イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言いうと、DynamoDBのプライマリキーの設定が以下の通りのため上書きされているのではないでしょうか?

  • パーティションキーのみ
  • パーティションキーがSIGNAL_NAMEかTHINGNAME

この場合、DynamoDBはプライマリキーが同じ場合上書き更新します
回避策としてはDynamoDBのプライマリキーを以下の設定にして更にタイムスタンプを書き込むようにすべきかと思います

  • パーティションキーとソートキーの組み合わせにする
  • ソートキーにはタイムスタンプのプロパティ名を指定する

これで期待通りの物になるかと思いますが、IoTは常にデータを送信するため、DynamoDBのデータが肥大化することが考えられます。
そのためAWS IoT → DynamoDBではなくAWS IoT → AWS Lambda → DynamoDBの経路を作り、AWS Lambdaで以下の処理を行うこと検討してください。

  • DynamoDB にデータを書き込む
  • パーティションキー(SIGNAL_NAMEまたはTHINGNAME)のデータがn件またはn日以上になっているものを削除する
  • (必要であれば)古いデータはS3にJSONやCSV形式に書き込む

投稿2022/10/23 03:11

tamanegine

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MaeharaKenji

2022/10/23 06:08 編集

回答頂きありがとうございます。 解決できました。 パーティションキーが”MAL_CONFIG_AP_023”なので、常に上書きしてしまうのが原因でした。ここでは時刻データのような常に変化する名称データでないとログとしてはダメなのですね。 助かりました。 また、DynamoDBへの保存へのLambdaでの保存制御の方法なども教えて頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問