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

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

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

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

AWS(Amazon Web Services)

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

解決済

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

MaeharaKenji
MaeharaKenji

総合スコア83

Amazon DynamoDB

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

AWS(Amazon Web Services)

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

1回答

0グッド

0クリップ

177閲覧

投稿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/ツールのバージョンなど)

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア148

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

MaeharaKenji

2022/10/23 06:08 編集

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Amazon DynamoDB

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

AWS(Amazon Web Services)

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