はじめに
AWS IoT CoreとAWS Lambdaを連携してAWS DynamoDBに環境データを保存してみようと思います。
開発構成
- イメージは、こんな感じです。
検証環境
- RaspberryPi3B+
- 温湿度センサー(DHT22)
- AWS IoT Core
- AWS Lambda
- AWS DynamoDB
前提
- RaspberryPiから送られてくるデータをAWS IoT Coreで受信出来ていること
DynamoDB作成
- マネージメントコンソールにログインしDynamoDBサービスを開きます
- 「テーブルの作成」をクリックします
- テーブル作成に必要な項目を入力し「テーブルの作成」をクリックしてしばらくするとテーブルが作成されます
- テーブル名:任意の名前
- パーティションキー: client_id
- ソートキー・オプション:sensorid
IAMロール作成
- 「IAM」→ 「ロール」→ 「ロールを作成」をクリックします
- 「AWSサービス」→ 「Lambda」→ 「次のステップ:アクセス権限」をクリックします
- 「Attachアクセス権限ポリシー」の「ポリシーフィルター」から「dynamo」と検索して以下のキーワードを選択し、「次のステップ:タグ」をクリックします。
- AmazonDynamoDBFullAccess
- AWSLambdaDynamoDBExecutionRole
- 特に設定はしないので、「次のステップ:確認」をクリックします
- 任意のロール名を入力して「ロールの作成」をクリックします。
lambda作成
- lambdaサービスを開き「関数」→ 「関数の作成」をクリックします
- 関数の作成に必要な項目を入力して「関数の作成」をクリックします
- オプション:一から作成
- 関数名:任意の名前
- ランタイム:**今回は、node.js14x
- ロール:先ほど作成したロールを選択
- ローカルで必要なモジュールをインストールしてzipで圧縮します
$ mkdir aws-sdk
$ npm install aws-sdk
- 「node_moduleとpackage-lock.jsonを選択」→ 「右クリック」→ 「7-Zip」→ 「aws-sdk.zipに圧縮」をクリックします
- lambdaに戻り「レイヤー」を選択し、「レイヤーの作成」をクリックします。
- レイヤー作成に必要な項目を入力して「作成」をクリックします
- 名前:任意の名前
- .zipファイルをアップロード:先ほどzipに圧縮したファイルをアップロード
- ランタイム:node.js 14x
- 先ほど、作成した関数に戻り「レイヤーの追加」をクリックします
- レイヤー追加に必要な項目を選択して「追加」をクリックします
- レイヤーソース:カスタムレイヤーを選択
- カスタムレイヤー:先ほど作成したレイヤーを選択
- バージョン:先ほど作成したレイヤーのバージョンを選択
- IoT Coreとlambdaを紐づけます
- 「トリガーを追加」をクリックします
- 「AWS IoT」を選択しトリガー追加に必要な項目を入力して「追加」をクリックします
- IoTタイプ:カスタムIoTルールを選択
- ルール:新規ルールの作成を選択
-
- ルール名:任意の名前
- ルールクエリステートメント:SELECT * FROM 'iot/topic'
プログラム開発
- 以下のソースを関数のindex.jsに張り付けて編集します
- TableNameに作成したテーブル名を入力してください
node.js
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
const createItem = async (event) => {
const params = {
TableName: '--- Your table name ---',
Item: {
client_id: event.client_id,
sensorid: event.sensorid,
timestamp: event.timestamp,
temp: event.temp,
humid: event.humid
}
}
try {
await docClient.put(params).promise();
console.log(params.Item);
return params.Item;
} catch (err) {
return err;
}
}
exports.handler = async (event) => {
try {
const res = await createItem(event);
return res;
} catch (err) {
return { error: err }
}
};
lambdaのテストを使ってテストしてみる
- 「テスト」を選択します
- 任意の名前を入力して以下のjsonをコピーしてペーストして「変更を保存」をクリックします
{
"client_id": "testGateway",
"sensorid": "001",
"timestamp": "2021/10/07 16:52:00",
"temp": 11,
"humid": 22
}
- 「テスト」をクリックするとlambda関数が起動され実行結果の「詳細」をクリックすると詳細が見れるようになっています
- dynamoDBを確認してもデータが保存されてる事が確認できます
RaspberryPiを使ってテスト
- 実際にraspberryPiからデータをIoT Coreに送ってみます。
- RaspberryPi側
pi@raspberrypi:~/sensor_aws $ node main.js
connect
published message for 1 time
published message for 2 time
published message for 3 time
published message for 4 time
published message for 5 time
- lambdaが正常に動作してるか確認してみます
- 「モニタリング」→ 「ログ」→ 「Recent invocations」一番上の最新ログをクリックします
- lambdaが正常に動作している事がわかります。
- DynamoDBを確認してみてもデータ保存されている事がわかります