AWS と Azure と Raspberry Pi (ラズパイ) で IoT してみた (3) #raspi #aws #azure
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
こんにちは!エンジニアの星野です。
この連載では、Raspberry Pi(以下「ラズパイ」)を使って、
- アマゾン ウェブ サービス(以下「AWS」)
- Microsoft Azure(以下「Azure」)
の上にセンサーデータを溜める仕組みを作って違いを比較しよう!をテーマに、
第1回:AWS と Azure と Raspberry Pi (ラズパイ) で IoT してみた(デバイス編)
第2回:AWS と Azure と Raspberry Pi (ラズパイ) で IoT してみた(AWS 編)
といった内容で進めてきました。
今回は Azure 編になります!
前回のおさらい
まずは、前回の記事で AWS 上に構築した環境についておさらいしてみましょう。
使用したサービスとその構成はこのようになっています。
サービス名 | 説明 |
---|---|
AWS IoT | IoT デバイスとセキュアな相互通信を行うためのサービス。 |
DynamoDB | NoSQLデータベース。センサーデータを蓄積するために利用。 |
今のところはセンサーデータを AWS 上に溜める、という部分のみになるので非常にシンプルな構成になっています。
ゆくゆくはセンサーデータに他の情報を組み合せて可視化することで、何かがわかるようになるとより面白くなりそうですね。
今回の内容
冒頭にも書きましたが、本記事ではラズパイで取得したセンサーデータを Azure 上に溜めるための仕組みを構築します。
IoT のためのサービスは Azure でも多数提供されており、今回はそれらを活用して進めていきます。
それでは本編に入っていきたいと思います!
Azure 上の環境構築
今回使用するサービスはこのようになります。
サービス名 | 説明 |
---|---|
IoT Hub | IoT デバイスを接続して、監視、管理するためのサービス。 |
CosmosDB | グローバル分散型のマルチモデル データベース サービス。センサーデータを蓄積するために利用。 |
Stream Analytics | オンデマンド リアルタイム分析サービス。各サービス間でデータのやり取りを行うために利用。 |
リソースグループの作成
最初に、各リソースを束ねるためのリソースグループを作成します。
Azure にサインインしたら、左のメニューから「リソースグループ」を選んで下さい。
リソースグループの一覧画面に移動したら、「追加」ボタンを押します。
① リソースグループ名を入力します。
リソースグループ名 | iot-resources |
② 「作成」ボタンを押します。
その際、「ダッシュボードにピン留めする」にチェックを入れておくと、Azure ポータルのダッシュボード上にリソースグループが表示されるようになります。
作成が完了すると、リソースグループの概要画面に移るので、ここから各種リソースを作っていきます。
IoT Hub の作成
リソースグループの概要画面から「追加」ボタンを押します。
作成できるリソースを検索する画面が現れるので、「iot hub」と入力し検索すると見つかります。
検索結果から「IoT Hub」を選択し、「作成」ボタンを押します。
① IoT Hub の名前を入力します。
ここで入力する名前は、IoT Hub にアクセスする際のエンドポイントの一部に使用されます。
そのため、Azure 上で一意の名前をつける必要があります。本記事では一例として以下のように設定します。
IoT Hub 名 | cllab-iothub |
② 「価格とスケールティア」を選びます。
IoT Hub の性能を決める項目です。
デバイスから送信されるデータの大きさや頻度に合わせて選ぶと良いですが、高性能なものほど価格も高くなります。
今回はデータも大きくなく、送信頻度も少ないのでデフォルトの「S1 - Standard」のまま進めることにします。
この設定の場合、利用料金は 約5,000円 / 月 ほどかかります。
ちなみに、1つのサブスクリプションにつき1つの IoT Hub のみ「F1 - Free」を選ぶことが出来ますが、これは性能が制限される代わりに無料で IoT Hub を利用できる設定です。
「試しに IoT Hub を使ってみたい」といった場合に選ぶと良さそうですね。
また、「IoT Hub ユニット」「Device-to-cloud パーティション」についてもデフォルトの設定のまま進めます。
これらの設定は、実際に運用する際の負荷を想定してチューニングをする必要がありますが、「IoT Hub ユニット」はリソース作成後も変更することができます。
③ 「作成」ボタンを押します。
これで IoT Hub の作成は完了です。
次はデバイスが IoT Hub に接続できるようにするための設定を行っていきます。
IoT Hub の設定
デバイスを接続させるために必要な情報を設定します。これは IoT Hub に接続するデバイスの台数分設定する必要があります。
リソースグループの概要画面に戻り、先程作成した IoT Hub (cllab-iothub) を選択します。
Device ID を作成します。
左のメニューから「Device Explorer」→「追加」と選んでください。
Device ID を入力し、「保存」ボタンを押します。本記事では以下のように設定します。
この際、各種キーについて手動で設定することも出来ますが、今回は自動生成されるものを使うことにします。
Device ID | cllab-iot-device01 |
「接続文字列 - プライマリキー」を取得します。
Device Explorer 画面から先程作成した Device ID を選ぶと、デバイスの詳細画面が表示されます。
ここに記載されている「接続文字列 - プライマリキー」をあらかじめ控えておいて下さい。
デバイスからデータを送信する際に必要になります。
デバイス ~ Azure 間の導通確認
ここで IoTHub が正しく設定できているか、前回設定したラズパイを使って確認してみましょう。
導通確認には Azure IoT SDK のサンプルを参考に、こちらで用意した送信プログラムを使います。
Node.js をインストールします。
今回のプログラムは Node.js を使います。
インストール手順は第1回目の記事に追記しましたので、こちらをご覧ください。
送信プログラムを git からクローンし、実行します。
ラズパイで下記のコマンドを実行し、送信プログラムのクローンと必要ライブラリのインストールを行います。
$ git clone https://github.com/s-hoshino/cllab-device-client-azure.git
$ git clone https://github.com/szazo/DHT11_Python.git cllab-device-client-azure/lib/dht11
$ cd cllab-device-client-azure
$ npm install
次に、設定ファイル config/default.json を編集します。
{
"connectionString": "YOUR_CONNECTION_STRING",
"dht11Pin": 14,
"isDemo": false,
"intervalSec": 60,
"deviceId": "device_001"
}
2行目にあらかじめ控えておいた「接続文字列 - プライマリキー」を記述してください。
"connectionString": "HostName=xxxxxxx.azure-devices.net;DeviceId=xxxxxxx;SharedAccessKey=xxxxxxx",
これでプログラムを実行するための準備ができました。
下記のコマンドを実行し、以下のような標準出力が確認できれば送信成功です。
$ node send-to-azure.js
Client connected
Sending message:
{
"id": 1498718083010,
"verbose_timestamp": "2017-06-29 15:34:43.010+0900",
"device_id": "device_001",
"temperature": 25,
"humidity": 43,
"lux": 58
}
send status: MessageEnqueued
Sending message:
{
"id": 1498718088039,
"verbose_timestamp": "2017-06-29 15:34:48.039+0900",
"device_id": "device_001",
"temperature": 24,
"humidity": 44,
"lux": 56
}
・
・
・
IoT Hub の概要画面を確認します。
ここで IoT Hub の概要画面を見てみましょう。
以下のように、使用状況のメッセージ数が増えているはずです。
(※使用状況の表示反映には数分程度かかります)
Cosmos DB の作成
リソースグループの概要画面から「追加」ボタンを押します。
作成できるリソースを検索する画面が現れるので、「cosmos db」と入力し検索すると見つかります。
検索結果から「Azure Cosmos DB」を選択し、「作成」ボタンを押します。
① アカウント ID を入力します。
ここで入力する ID は、Cosmos DB にアクセスする際のエンドポイントの一部に使用されます。
そのため、Azure 上で一意の ID をつける必要があります。本記事では一例として以下のように設定します。
アカウント ID | cllab-document-db |
② API を選びます。
今回は「SQL (DocumentDB)」を利用します。
③ 「作成」ボタンを押します。
これで Cosmos DB のアカウントが作成されます。
次はこのアカウントに対して、コレクション(RDBでのテーブルに近いもの)を作成していきます。
Cosmos DB の設定
Cosmos DB アカウントの作成が完了したら、リソースグループの画面から作成したリソースを選択します。
コレクションを作成します。
左メニューから「概要」画面に移動し、「コレクションの追加」を選びます。
Cosmos DB (DocumentDB) では、コレクションに対してスループットとストレージ容量を設定します。
こちらもスループットを高くするほど、またストレージ容量を大きくするほど、価格は高くなります。
今回はあまり高頻度・大容量のデータ送信を行うわけではないので、各設定値は小さくしておきます。
この設定の場合、利用料金は 約3,000円 / 月 ほどかかります。
各種パラメータのチューニングについては、こちらの公式ドキュメントをご覧ください。
本記事では一例として以下のように設定します。
コレクション ID | sensordata |
ストレージ容量 | 10 GB |
初期スループット容量 (RU/秒) | 400 |
パーティションキー | /device_id |
データベース(新規作成) | cllab-iot-database |
ちなみにここで出てきたパーティションキーですが、AWS 編の「DynamoDB の設定」の際に出てきたパーティションキーとおおむね同じもので、今回も device_id を指定しています。
パーティションキーの詳しい情報はこちらの公式ドキュメントをご覧ください。
「OK」を押すと、センサーデータを溜めるためのコレクションが作成されます。
作成に成功すると、以下のように概要画面にコレクションの情報が表示されます。
次は、IoT Hub と Cosmos DB を連携させるための設定を行います。
AWS では AWS IoT の中に他のサービスとの連携機能まで含まれていましたが、Azure では別のサービス(リソース)を利用します。
Stream Analytics job の作成
リソースグループ画面から「追加」を押し、検索欄に「stream analytics」と入力して検索すると見つかります。
検索結果から「Stream Analytics job」を選択し、「作成」ボタンを押します。
① ジョブ名を入力します。
ジョブ名 | iothub-to-cosmosdb-job |
② 「作成」ボタンを押します。
これで Stream Analytics job が作成されます。
Stream Analytics job の設定
次は、先程作成したジョブに対して
「どのサービスのリソースを入力とするか」「入力データに対してどのような処理を行うか」「処理したデータをどのリソースに出力するか」
について設定を行います。
「入力」を設定します。
Stream Analytics の概要画面から「入力」を選び、次の画面で「追加」を押します。
ここでは IoT Hub が受けたデータを入力とするための設定を行います。
本記事では一例として以下のように設定します。
入力のエイリアス | iothub |
ソース | IoT Hub |
IoT Hub | cllab-iothub(「IoT Hub の作成」の際に設定した IoT Hub 名) |
「作成」を押せば「入力」の設定は終わりです。
以下のように、作成した「入力」が表示されていれば成功です。
「出力」を設定します。
次は概要画面に戻り「出力」を選び、次の画面で「追加」を押します。
ここでは Stream Analytics job での処理結果を出力するリソースについて設定を行います。
本記事では一例として以下のように設定します。
出力のエイリアス | iothub |
シンク | IoT Hub |
アカウント ID | cllab-document-db(「Cosmos DB の作成」の際に設定した ID) |
データベース | cllab-iot-database(「Cosmos DB の作成」の際に設定した データベース名) |
コレクション名パターン | sensordata(「Cosmos DB の作成」の際に設定した コレクション名) |
ドキュメント ID | id |
「作成」を押せば「出力」の設定は終わりです。
以下のように、作成した「出力」が表示されていれば成功です。
「クエリ」を設定します。
次は概要画面に戻り「クエリ」を選びます。
ここでは「入力」から受け取ったデータに対してどのような処理を行うかを設定します。
Stream Analytics job では SQL に似たクエリ言語によって、入力データに対して様々な処理を行うことができます。
本記事では、受け取ったデータをそのまま「出力」に渡す処理を記述しますが、
その他にどのような処理ができるかについてはこちらの公式ドキュメントを参考にしてみてください。
次の画面のテキストエリアを下記のように編集します。
SELECT
*
INTO
[cosmosdb]
FROM
[iothub]
「保存」を押せば「クエリ」の設定は終わりです。
ジョブを開始します。
ここまでで、Stream Analytics job の各種設定が終わりました。
概要画面に戻り「開始」を押すと、ジョブの開始時刻の設定画面が表示されます。
「カスタム」を選択すると任意の日時からジョブを開始させることができますが、今回は「現在」を選択して「開始」を押します。
これでデバイスから IoT Hub に送信したデータが CosmosDB に保存されるようになりました。
ちなみに、Stream Analytics job ではスループットやスケールティアといった設定は出てきませんでしたが、
メニューを見ると「スケール」という項目があり、これによってスケールアウトが可能となっています。
デフォルトでは最小値となっており、その設定での利用料金は 約9,000円 / 月 ほどかかります。
それでは、ラズパイからデータを送ってみましょう!
センサーデータをデバイスから Azure に送信する
デバイス起動時にプログラムを自動で起動させるための設定
前回の記事と同じように、送信プログラムをサービスとして登録します。
$ sudo cp ~/cllab-device-client-azure/send-to-azure.service /etc/systemd/system/
$ sudo systemctl enable send-to-azure
$ sudo systemctl start send-to-azure
これでラズパイからセンサーデータの送信が始まりました。
Cosmos DB にデータが届いているか見てみましょう。
蓄積されたセンサーデータの確認
Cosmos DB の左メニューから「データエクスプローラー」を選びます。
次の画面で「sensordata」→「Documents」と選んでいきます。
データが正常に届いていれば、以下のように表示されます。
これでラズパイから送ったデータを Cosmos DB に蓄積させることができました!
せっかくですので、データの中身がどうなっているか見てみましょう。
データの7行目まではラズパイから送ったデータの中身になっていますが、それ以降の項目は Azure 側で付加されています。
ちなみにこのデータは、普段私が作業をしている場所にラズパイを置いて取得したものです。
気温 24 [℃]、湿度 44 [%] なので快適(冷房の真下なのでちょっと寒い)ですが、照度は 56 [lux] とかなり薄暗いですね(笑)もしかするとPCで影になっていたのかもしれません。
最後に
今回もなかなかの長編となってしまいましたが、お付き合いいただきありがとうございました!
Azure は AWS と比べると各サービスの設定項目が多く、慣れないうちは「この項目は何を書いたらいいんだろう?」と戸惑いましたが、
設定項目の意味がわかってくるとより細かなチューニングをすることができ、Azure のパワフルさを感じました。
次回は、これまでに作った環境について振り返ってみたいと思います。
それでは、次回も引き続きよろしくお願いします!!
参考
IoT Hub のドキュメント
https://docs.microsoft.com/ja-jp/azure/iot-hub/
Azure Cosmos DB のドキュメント
https://docs.microsoft.com/ja-jp/azure/cosmos-db/
Stream Analytics のドキュメント
https://docs.microsoft.com/ja-jp/azure/stream-analytics/
GitHub - Azure/azure-iot-sdk-node
https://github.com/Azure/azure-iot-sdk-node
Microsoft Azure - 料金計算ツール
https://azure.microsoft.com/ja-jp/pricing/calculator/