クラウドアダプタを利用してAWS IoTへデータを送信する

本ページでは、クラウドアダプタを利用して AWS IoT へデータを送信し、DynamoDB へ保存する一連の流れを説明します。

AWS の設定
モノの登録

まずは、AWS IoT コンソール を開き、AWS IoT の設定をします。
「管理>モノ>作成」から、使用するデバイスをモノ(Thing)として AWS 上に登録します。

「一つのモノを作成」を選択します。

名前を「raspi」としてモノを作成します。

次にモノに証明書を追加します。
ここでは「新しい証明書を自動生成(推奨)」を選択し「次へ」を選択します。

「モノを作成」を選択し、作成します。

下記の2つのファイルをダウンロードリンクよりダウンロードします。

  • デバイス証明書
  • プライベートキーファイル

特に「プライベートキーファイル」は後からダウンロードすることができないので注意して下さい。ダウンロードしたファイルは後ほど使用します。
ダウンロードが終わったら、「完了」を選択します。

次に、AWS IoT のコンソールに戻り「安全性>ポリシー>ポリシーの作成」からモノに割り当てるポリシーを作成します。

ここでは、特に制限のないポリシーを作成します。
下記のように入力し、ポリシーを作成します。

項目入力値
名前NotLimit
アクション*
リソースARN*
効果許可 を選択

次に、作成したポリシーをモノの証明書へ紐付けます。
「セキュリティ>証明書」を選択し、先ほど作成した証明書をチェックし、右上の「アクション」メニューから「ポリシーをアタッチ」を選択します。

先ほど作成した「NotLimit」のポリシーを選択し、「ポリシーをアタッチ」を選択します。

以上で AWS IoT へのモノの登録は完了です。

DynamoDB の設定

続いて、AWS IoT と Amazon DynamoDB を連携させ、AWS IoT に送信したデータをデータベースへ保存します。
まずは、DynamoDB のテーブルを作成します。
Amazon DynamoDB コンソール を開き「テーブルの作成」を選択します。

ここでは、下記のように入力しテーブルを作成します。
赤枠の箇所は初期値から変更している部分です。

項目入力値
テーブル名DeviceDataTable
パーティションキーDeviceID
パーティションキーのタイプ文字列 を選択
ソートキーの追加選択
ソートキーTimestamp
ソートキーのタイプ数値 を選択

以上で DynamoDB のテーブルの作成は完了です。

ルールの設定

次に AWS IoTへ戻り、作成した DynamoDB と連携するようにルールを設定します。
「ACT>ルールの作成」を選択し、ルールを作成します。

ルールの名前と説明を入力します。
ここでは分かりやすく「DynamoDB」と入力します。

ルールクエリステートメントを設定します。
今回は「device/data」という MQTT topic に publish されたメッセージを全て、DynamoDB へ保存するよう、ルールクエリステートメントを入力します。

SELECT * FROM 'device/data'

下記のように入力し、アクションを設定します。

項目入力値
アクション1DynamoDB
テーブル名DeviceDataTable
パーティションキーDeviceID
パーティションキーのタイプSTRING
パーティションキー値${id}
ソートキー(レンジキー)Timestamp
レンジキーのタイプNUMBER
レンジキーの値${timestamp}

また「新しいロールを作成」を選択し、このアクションに割り当てる IAM ロールを作成します。

ここでは、IAM ロールの名前を分かりやすく「DynamoDB」とします。

ロールの作成が完了すると、IAMロールに作成したロールが自動的に選択されます。「次へ」を選択します。

作成確認画面が表示され、「作成」を選択します。

以上でAWS上の設定は完了です。

カスタムエンドポイントの確認

最後に、送信先となる「カスタムエンドポイント」を確認します。
「設定>カスタムエンドポイント」に記載されているエンドポイントを控えておきます。
後ほどコントロールパネル上で設定する際に使用します。

コントロールパネルの設定

次に、コントロールパネルからクラウドアダプタの設定をします。
画面の詳細については クラウドアダプタ画面 をご覧ください。

認証情報の設定

まずは認証情報を設定します。
「クラウドアダプタ>認証情報一覧>認証情報作成」から認証情報を作成します。

ここでは先ほど作成した認証情報を使用し、下記のように入力します。
「秘密鍵」及び「証明書」は、先ほどダウンロードしたファイルをテキストエディタなどで表示し、貼り付けて下さい。

項目入力値
認証情報種別AWS IoT(X.509認証書) を選択
認証情報名aws-iot
秘密鍵(ランダムな文字列)-private.pem.key の内容
証明書(ランダムな文字列)-certificate.pem.crt の内容

以上で認証情報の設定は完了です。

転送/接続先の設定

次に、転送/接続先設定を作成します。クラウドアダプタでは以下のデータ転送方式があります。

  • HTTP 転送
  • MQTT 接続

デバイスシャドウや MQTT の subscribe など AWS からデータ受信が必要な場合は「MQTT接続」をご利用下さい。

HTTP 転送

「転送先一覧>転送先作成」から HTTP の転送設定を作成します。

下記のように入力し、転送先設定を作成します。
「転送先URL」には、控えておいた「カスタムエンドポイント」と指定した MQTT topic を入力します。
また「認証情報」は、先ほど作成した「aws-iot」の認証情報を選択します。
「デバイス選択」は使用するデバイスを適切に選択します。

項目入力値
転送先サービスAWS IoT を選択
転送先名AWS IoT
転送先URLhttps://(ランダムな文字列).iot.ap-northeast-1.amazonaws.com:8443/topics/device/data?qos=1
認証情報【AWS IoT(X.509証明書)】aws-iot を選択
デバイス選択使用するデバイスを選択

以上でコントロールパネル上の設定は完了です。

MQTT 接続

「MQTT接続先一覧>MQTT接続先作成」から MQTT の接続設定を作成します。

下記のように入力し、接続先設定を作成します。
「接続先エンドポイント」には、控えておいた「カスタムエンドポイント」を入力します。
また「認証情報」は、先ほど作成した「aws-iot」の認証情報を選択します。
「デバイス選択」は使用するデバイスを適切に選択します。

項目入力値
接続先名AWS IoT
接続先エンドポイント(ランダムな文字列).iot.ap-northeast-1.amazonaws.com
認証情報【AWS IoT(X.509証明書)】aws-iot を選択
デバイス選択使用するデバイスを選択

以上でコントロールパネル上の設定は完了です。

デバイスからのデータ送信と受信確認

それでは実際にデバイスからデータを送信します。

HTTP

Respberry Pi からコマンドを使用してデータを送信します。
下記のコマンドを実行し、データを送信します。

pi@raspberrypi:~ $ curl -i -X POST -H 'Content-Type: application/json' http://gw.iot.iij.jp/v1 -d '{}'
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 11 Dec 2019 03:40:40 GMT
Transfer-Encoding: chunked
Connection: keep-alive

コマンドを実行すると DynamoDBの「項目」にデータが表示され、保存されたのが分かります。デバイス ID はマスクしています。

HTTP 転送では、デバイス ID やタイムスタンプなどを自動付与することができます。

MQTT

Respberry Pi からコマンドを使用してデータを送信します。
Respberry Pi では、MQTT のクライアントは下記のようにインストール出来ます。

pi@raspberrypi:~ $ sudo apt install mosquitto-clients -y

下記のコマンドを実行し、データを送信します。デバイス ID はマスクしています。

pi@raspberrypi:~ $ mosquitto_pub -h gw.iot.iij.jp -d -t 'device/data' -m "{\"id\": \"dvc-xxxxxxxxxx\", \"timestamp\": $(date +%s)}"
Client mosqpub/2710-raspberryp sending CONNECT
Client mosqpub/2710-raspberryp received CONNACK
Client mosqpub/2710-raspberryp sending PUBLISH (d0, q0, r0, m1, 'device/data', ... (49 bytes))
Client mosqpub/2710-raspberryp sending DISCONNECT

コマンドを実行すると DynamoDB の「項目」にデータが表示され、保存されたのが分かります。

以上で説明は終了です。

この他にも「Lambda Function」の実行や「Amazon S3」への保存 等、様々な AWS のサービスと連携することができます。
是非お試しください。