Azure IoT Hub から D-Ocean へ(前編)

Azure Iot Hub から D-Ocean へ(前編)

こんにちは。D-Ocean CTO の八木橋です。

少し前になりますが、Microsoft さん主催の de:code 2019 に参加させていただきました。ML、IoT、MR、コンテナ、アプリ開発など、非常に幅広い領域をカバーされていて、大変勉強になりました。

そちらで Azure Iot Hub を知り、試しにストリームで D-Ocean にデータを流し込んで見ようと思い立ち、このブログを書くことにしました。初めて Azure を触りましたので、色々と試行錯誤しながら実装してみました。

アーキテクチャ

こちらはざっくりとしたアーキテクチャです。基本的な処理の流れとして、IoT デバイスから送られてきたメッセージ(温度と湿度)を Azure IoT Hub で受けて、Function App でイベントを処理してから、D-Ocean がストリーム・データとして取り込める Google Cloud Pub/Sub 経由で構造化テーブルに流し込むという考え方です。

大まかに分けて、作業は下記の4つに分けられます。今回の前編では 1 と 2 について記載します。

  1. IoT Hub の構成
  2. Function App のデプロイ
  3. Cloud Pub/Sub の構成
  4. D-Ocean の設定

1. IoT Hub の構成

まず、IoT デバイスからのメッセージを受ける IoT Hub の構成から始めます。Azure Portal から IoT Hub のメニューを探して、新規で IoT Hub を追加します。最初のページの名前、リージョンの指定やリソース・グループ(Azure 上に展開されるリソースをまとめたもの)の指定などは省略します。

ポイントは、「レベル」と「ユニット数」の掛け算で、IoT Hub の最大スケーラビリティ(= 料金)が確定する点です。裏で立ち上がる VM のスペック(レベル)と最大数(ユニット数)がここで決定されるのではと想像しています。この後、確認画面があり作成をクリックすると、数分で IoT Hub の環境が作成されます。

上記以外にもパーティション(キューのようなもの)の設定がありますが、今回は省略します。パーティションのアフィニティによってメッセージの順序性を保証してくれるようなので便利そうです。仕様から考えると Amazon Kinesis に動きがわりと似ている気がします。

2. Function App のデプロイ

Function App は、Azure 上でいわゆるサーバーレス環境を提供する仕組みです。今回は、Node.js でデバイスからのメッセージをパースして、Cloud Pub/Sub の API を呼び出すファンクションを作成してみました。


index.json
const {PubSub} = require('@google-cloud/pubsub'); module.exports = function (context, IoTHubMessage) { var pubsub = new PubSub({ projectId: 'docean-sdp', keyFilename: 'publisher.json' });
const buf = Buffer.from(JSON.stringify(IoTHubMessage)); const messageId = pubsub.topic('docean-demo').publish(buf);
context.done();};

IoT Hub から受け取った JSON のメッセージをそのまま Cloud Pub/Sub の「docean-demo」トピックへパブリッシュします。

このステップでのポイントは2つあります。

a. IoT Hub とエンドポイントと Function App のバインディング

IoT Hub 経由で受信するメッセージをどの Function App と関連付けるかを決定する作業になります。


function.json
{ "bindings": [ { "type": "eventHubTrigger", "name": "IoTHubMessage", "direction": "in", "eventHubName": "docean-iot-demo", "connection": "IoTEventHubConnectionString", } ]}

"connection" に指定されている接続文字列がどこに対応しているかが、最初よく理解できていなくてコンソールから探し出すのに苦慮しました。ちなみにローカル環境で Function をテスト実行する場合は、「local.settings.json」ファイルに同等の定義を書いておく必要があります。

b. Cloud Pub/Sub のライブラリとキー・ファイルの同梱

Function App としてパッケージングするバイナリに、Cloud Pub/Sub のライブラリとキー・ファイルを格納しておきます。

Node.js 用の Cloud Pub/Sub のライブラリは、簡単にインストールができますが、一つ注意点として GRPC のライブラリをデプロイ先となる Function App の環境に合わせてリビルドする必要があります。今回は Linux をベースの OS として選択しています。

% npm rebuild grpc -—target=10.16.0 --target_arch=x64 --target_platform=linux --target_libc=glibc


キー・ファイルは、デプロイする Function App のルートのフォルダに、「publisher.json」というファイル名で配置してあります。

その後、Function App を下記の Azure Functions Core Tools を使ってデプロイします。

% func azure functionapp publish docean-func-app1

前編のまとめ

Azure 初めて触ったので、まだちゃんと理解していないかもしれませんが、イベント処理に関連する複数の製品の位置付けや手法が複雑で、かなり試行錯誤の連続でした。最終的には、一応想定していたアーキテクチャに落ち着けました。

Visual Studio Code も今回はあえて使いませんでしたが、製品間を繋ぐ設定が理解できたので良かったと思っています。

後編は主に GCP 寄りの話と D-Ocean のストリームの設定まわりをご紹介します。