5
1

More than 3 years have passed since last update.

M5StackGRAYのセンサの値を3G拡張ボードを使ってDynamoDBに送ってみた

Last updated at Posted at 2021-01-20

以前、
M5StackGRAYのジャイロセンサの値を3G拡張ボードを使ってSORACOM Harvestに送ってみた
というのをやったのですが、ゲームのように頻繁にリクエストが生じる場合、Harvestだとすぐリクエスト制限にかかってしまい、悩んでたところ、SORACOMのMAXさんからアドバイスを受け、DynamoDBに保存することにしました。

こんな感じです。
アーキテクチャ.png

M5Stackに3G拡張ボード(SORACOMのSIM)を使ってSORACOMプラットフォームに飛ばすまでは、手順、コードとも冒頭で紹介しました私が以前書いた記事のとおりです。

以下、DynamoDBに保存するまでの手順を示します。

DynamoDBのテーブル作成

AWSのコンソールから DynamoDBへ

DynamoDBの[ダッシュボード]から[テーブルの作成]で
[テーブルの作成]をクリックします。
Image from Gyazo

Image from Gyazo
テーブル名、プライマリキーのパーティションキーを入力します。
私は複数のM5Stackからデータを集めようと思ってるので、テーブル名を「M5Stack」、パーティションキーをM5Stackごとに識別するために[id]という名前にしました。

SORACOM Funkの設定

※このコーナーはほとんどSORACOMのサイトのとおりです。

事前準備(AWS)

SORACOM Funk から AWS Lambda を呼び出す為に、設定した AWS Lambda の ARN をメモします。

Image from Gyazo

以下の JSON を参考に Lambda 実行用の AWS IAM ユーザーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAuroraToExampleFunction",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "先ほどコピーしたARN"
        }
    ]
}

AWS IAM ユーザーの作成方法は私が書いたこちらの記事を参考にしてください。
AWS IAM ユーザーの作成方法

AWS IAM ユーザーを作成したとき生成される 「アクセスキーID」 と「シークレットアクセスキー」 をコピーします。

SORACOMコンソールでの設定

SORACOM コンソールで AWS IAM ユーザーの認証情報を登録します。
SORACOM ユーザーコンソールの右上のユーザー名をクリックし、"セキュリティ“ を選択。
Image from Gyazo

[認証情報ストア] > [認証情報を登録]

認証情報 ID: 任意
種別 : [AWS 認証情報]を選択
AWS Access Key ID: 先ほどコピーした AWS ユーザーのアクセスキー ID
AWS Secret Access Key: 先ほどコピーした AWS ユーザーのシークレットアクセスキー

Image from Gyazo

利用する SIM の[SIM グループ] > [SORACOM Funk 設定]
Image from Gyazo

以下のように入力
Image from Gyazo

AWS Lambdaの設定

関数の作成

AWSのコンソールから
Lambda > 関数 > 関数の作成
Image from Gyazo
[一から作成]
関数名 : 適当に
ランタイム: Python3.8
[関数の作成]をクリックします。

関数ができたら、
以下のコードを入力します。
なお、このコードはこちらのサイトのコードを参考にしました。ありがとうございました。
LambdaでDynamoDBのデータを操作する(Node&Python)

lambda_function.py
import boto3

def lambda_handler(event, context):

  gyroX = str(event["gyroX"])
  gyroY = str(event["gyroY"])
  gyroZ = str(event["gyroZ"])

  try:
    dynamoDB = boto3.resource("dynamodb")
    table = dynamoDB.Table("M5Stack") # DynamoDBのテーブル名

    # DynamoDBへのPut処理実行
    table.put_item(
      Item = {
        "id": "1",   # Partition Keyのデータ(複数のM5Stackから情報をとることにしてる)
        "payloads": {
            "gyroX":  gyroX,
            "gyroY":  gyroY,
            "gyroZ":  gyroZ
        }
      }
    )


  except Exception as e:
        print (e)


なお、上記のコードは、冒頭でご紹介した私の記事(M5StackからHarvestに送る)から飛んでくる以下のようなJSONを想定しています。

{"gyroX": -13.2,"gyroY": -20.2,"gyroZ": -16.8}


ポリシーの設定

このままでは、DynamoDBにデータが送れませんでした。
Lambdaのログを見るとこんなエラーでした。

arn:aws:sts::XXXXXXXXXXXXXXXXX is not authorized to perform: dynamodb:DeleteItem on resource: arn:aws:dynamodb:XXXXXXXXXXXXXXXX",

こちらのQiitaの記事を読んで解決できました。ありがとうございました。
AWS lambdaからdynamodbに接続: "AccessDeniedException"で怒られたのでポリシーを設定した

余談ですが、このQiitaの記事は約3年前にStartup Weekend深センで同じチームだった方が書かれてました。凄い偶然にびっくり! 

エラーの原因は
LambdaにDynamoDBへアクセスできるポリシーを持たせてなかったからでした。

ポリシーを持たすには、以下の手順です。

アクセス権限 > 実行ロール [編集]をクリックします。
Image from Gyazo

[Lambda-Dynamo-role-XXXXXXXXロールを表示] をクリックします。
Image from Gyazo

こんな画面に遷移
[ポリシーをアタッチします] をクリックします。
Image from Gyazo

「dynamo」で検索し、
AmazonDynamoDBFullAccess にチェックを入れて、[ポリシーのアタッチ]をクリック
Image from Gyazo

M5Stack起動

成功!!

無事、M5Stackのセンサーデータが、DynamoDBに送られました。

Image from Gyazo

DynamoDB JSON (普通のJSONとは違う)に直すと

{
  "id": {
    "S": "1"
  },
  "payloads": {
    "M": {
      "gyroX": {
        "S": "-10.7"
      },
      "gyroY": {
        "S": "-22.3"
      },
      "gyroZ": {
        "S": "-17.6"
      }
    }
  }
}

以上です。

5
1
0

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
5
1