以前、
M5StackGRAYのジャイロセンサの値を3G拡張ボードを使ってSORACOM Harvestに送ってみた
というのをやったのですが、ゲームのように頻繁にリクエストが生じる場合、Harvestだとすぐリクエスト制限にかかってしまい、悩んでたところ、SORACOMのMAXさんからアドバイスを受け、DynamoDBに保存することにしました。
M5Stackに3G拡張ボード(SORACOMのSIM)を使ってSORACOMプラットフォームに飛ばすまでは、手順、コードとも冒頭で紹介しました[私が以前書いた記事]
(
https://qiita.com/tatsuya1970/items/b25881ddf11ae8cd6409)のとおりです。
以下、DynamoDBに保存するまでの手順を示します。
##DynamoDBのテーブル作成
AWSのコンソールから DynamoDBへ
DynamoDBの[ダッシュボード]から[テーブルの作成]で
[テーブルの作成]をクリックします。
テーブル名、プライマリキーのパーティションキーを入力します。
私は複数のM5Stackからデータを集めようと思ってるので、テーブル名を「M5Stack」、パーティションキーをM5Stackごとに識別するために[id]という名前にしました。
##SORACOM Funkの設定
※このコーナーはほとんどSORACOMのサイトのとおりです。
###事前準備(AWS)
SORACOM Funk から AWS Lambda を呼び出す為に、設定した AWS Lambda の ARN をメモします。
以下の 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 ユーザーコンソールの右上のユーザー名をクリックし、"セキュリティ“ を選択。
[認証情報ストア] > [認証情報を登録]
認証情報 ID: 任意
種別 : [AWS 認証情報]を選択
AWS Access Key ID: 先ほどコピーした AWS ユーザーのアクセスキー ID
AWS Secret Access Key: 先ほどコピーした AWS ユーザーのシークレットアクセスキー
利用する SIM の[SIM グループ] > [SORACOM Funk 設定]
##AWS Lambdaの設定
###関数の作成
AWSのコンソールから
Lambda > 関数 > 関数の作成
[一から作成]
関数名 : 適当に
ランタイム: Python3.8
[関数の作成]をクリックします。
関数ができたら、
以下のコードを入力します。
なお、このコードはこちらのサイトのコードを参考にしました。ありがとうございました。
・LambdaでDynamoDBのデータを操作する(Node&Python)
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へアクセスできるポリシーを持たせてなかったからでした。
ポリシーを持たすには、以下の手順です。
[Lambda-Dynamo-role-XXXXXXXXロールを表示] をクリックします。
こんな画面に遷移
[ポリシーをアタッチします] をクリックします。
「dynamo」で検索し、
AmazonDynamoDBFullAccess にチェックを入れて、[ポリシーのアタッチ]をクリック
##M5Stack起動
成功!!
無事、M5Stackのセンサーデータが、DynamoDBに送られました。
DynamoDB JSON (普通のJSONとは違う)に直すと
{
"id": {
"S": "1"
},
"payloads": {
"M": {
"gyroX": {
"S": "-10.7"
},
"gyroY": {
"S": "-22.3"
},
"gyroZ": {
"S": "-17.6"
}
}
}
}
以上です。