3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS IoT Coreとlambdaを連携してAWS DynamoDBに環境データを登録する

Last updated at Posted at 2021-10-07

はじめに

AWS IoT CoreとAWS Lambdaを連携してAWS DynamoDBに環境データを保存してみようと思います。

開発構成

  • イメージは、こんな感じです。

image.png

検証環境

  • RaspberryPi3B+
  • 温湿度センサー(DHT22)
  • AWS IoT Core
  • AWS Lambda
  • AWS DynamoDB

前提

  • RaspberryPiから送られてくるデータをAWS IoT Coreで受信出来ていること

DynamoDB作成

  1. マネージメントコンソールにログインしDynamoDBサービスを開きます

マネージメントコンソール

  1. テーブルの作成」をクリックします

image.png

  1. テーブル作成に必要な項目を入力し「テーブルの作成」をクリックしてしばらくするとテーブルが作成されます
  • テーブル名:任意の名前
  • パーティションキー: client_id
  • ソートキー・オプション:sensorid

image.pngimage.png

image.png

IAMロール作成

  1. IAM」→ 「ロール」→ 「ロールを作成」をクリックします

image.png

  1. AWSサービス」→ 「Lambda」→ 「次のステップ:アクセス権限」をクリックします

image.png

  1. Attachアクセス権限ポリシー」の「ポリシーフィルター」から「dynamo」と検索して以下のキーワードを選択し、「次のステップ:タグ」をクリックします。
  • AmazonDynamoDBFullAccess
  • AWSLambdaDynamoDBExecutionRole

image.png

  1. 特に設定はしないので、「次のステップ:確認」をクリックします

image.png

  1. 任意のロール名を入力して「ロールの作成」をクリックします。

image.png

lambda作成

  1. lambdaサービスを開き「関数」→ 「関数の作成」をクリックします

image.png

  1. 関数の作成に必要な項目を入力して「関数の作成」をクリックします
  • オプション:一から作成
  • 関数名:任意の名前
  • ランタイム:**今回は、node.js14x
  • ロール:先ほど作成したロールを選択

image.png

  1. ローカルで必要なモジュールをインストールしてzipで圧縮します
$ mkdir aws-sdk
$ npm install aws-sdk
  • node_moduleとpackage-lock.jsonを選択」→ 「右クリック」→ 「7-Zip」→ 「aws-sdk.zipに圧縮」をクリックします

image.png

  1. lambdaに戻り「レイヤー」を選択し、「レイヤーの作成」をクリックします。

image.png

  1. レイヤー作成に必要な項目を入力して「作成」をクリックします
  • 名前:任意の名前
  • .zipファイルをアップロード:先ほどzipに圧縮したファイルをアップロード
  • ランタイム:node.js 14x

image.png

  1. 先ほど、作成した関数に戻り「レイヤーの追加」をクリックします

image.png

  1. レイヤー追加に必要な項目を選択して「追加」をクリックします
  • レイヤーソース:カスタムレイヤーを選択
  • カスタムレイヤー:先ほど作成したレイヤーを選択
  • バージョン:先ほど作成したレイヤーのバージョンを選択

image.png

  1. IoT Coreとlambdaを紐づけます
  • トリガーを追加」をクリックします

image.png

  1. AWS IoT」を選択しトリガー追加に必要な項目を入力して「追加」をクリックします
  • IoTタイプ:カスタムIoTルールを選択
  • ルール:新規ルールの作成を選択
    • ルール名:任意の名前
  • ルールクエリステートメント:SELECT * FROM 'iot/topic'

image.png

image.png

プログラム開発

  1. 以下のソースを関数の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のテストを使ってテストしてみる

  1. テスト」を選択します

image.png

  1. 任意の名前を入力して以下のjsonをコピーしてペーストして「変更を保存」をクリックします

image.png

{
  "client_id": "testGateway",
  "sensorid": "001",
  "timestamp": "2021/10/07 16:52:00",
  "temp": 11,
  "humid": 22
}
  1. テスト」をクリックするとlambda関数が起動され実行結果の「詳細」をクリックすると詳細が見れるようになっています

image.png

image.png

  1. dynamoDBを確認してもデータが保存されてる事が確認できます

image.png

RaspberryPiを使ってテスト

  1. 実際に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
  1. lambdaが正常に動作してるか確認してみます
  • モニタリング」→ 「ログ」→ 「Recent invocations」一番上の最新ログをクリックします

image.png

  • lambdaが正常に動作している事がわかります。

image.png

  1. DynamoDBを確認してみてもデータ保存されている事がわかります

image.png

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?