IoT Edge and Serverless
playground with Node.js
IoT EdgeとサーバレスをNode.jsで遊ぶ実験ノート
https://jazug.connpass.com/event/115696/
Self introduction
自己紹介
{
"name": {
"ja": "大平かづみ",
"en": "Kazumi OHIRA"
},
"currentPosition": "フリーランス",
"awards": ["Microsoft MVP"],
"favorites": [
"Azure": ["ARM template", "IoT"]
],
"twitter": "@dz_"
}
Me
https://ascii.jp/elem/000/001/838/1838466/index-2.html
Me
私の生きざまを
記事にして
くださいました!
• コミットしているコミュニティ
• Cogbot
• Node-RED User Group
• NoOps
Things I’m
making
つくってるもの
Background image by https://flic.kr/p/8WabtH
https://github.com/dzeyelid/iot-edge-with-serverless-demo
What’s this!?
IoT サーバレス×
Event Hubs
trigger
Card reader
IoT Edge runtime
module
(Python)
module
(Node.js)
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
Functions
SignalR Service
update!
Web
Blob Storage
構成図
Azure
Why I make this?
なんでつくってるの?
学びたいことを詰め込みました
• IoT Edgeを習得したい
• サーバーレス構成を習得したい
• Node.jsを習得したい
• Vue.jsを習得したい
• 実際に手を動かして体得したい!
• ぜんぶつなげてしまえ~
Why make this public?
なんでオープンに公開してるの?
エンジニアとしてのチャレンジ
• オープンソースに関わりたい
• いきなりコミットするのは難しいので、まず自分で作ってみる
• 私が好きで得意なことで仕事をしたい
• 私がなにに興味持っているか知ってもらえる
• 私のスキルをみてもらえる
• 同じ興味をもつ人とつながれる
• 未来の自分に向けた参考書
• 気持ちを引き締められる
Dive!
IoT Edge
study note
IoT Edge 研究
ノート
Event Hubs
trigger
Card reader
IoT Edge runtime
module
(Python)
module
(Node.js)
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
Functions
SignalR Service
update!
Web
Blob Storage
構成図
Azure
Azure IoT を構成する要素
• Azure IoT Hub
• Azure IoT Edge
Azure IoT Hub
Azure IoT Hub
• デバイスと双方向でメッセージを送受信できる出入口
• Azure の他のサービスに連携できる
Azure IoT Hub
Functions
Event Grid
Stream
Analytics
Service Bus
Logic App
Blob Storage
IoT Hub
Things
Azure
Azure IoT Hubのおすすめポイント
• 扱えるプロトコル
• MQTT、AMQPなど
• SDKが豊富
• C, C#, Java, Python, Node.jsなどの言語展開
• Device SDK, Service SDK, Provisioning SDK
• IoT Hub単体でもメッセージのルーティング、フィルタリングが可能
• 参考: Check! Azure IoT Hub message routing と Azure Stream
Analytics の使いどころ比較
(https://qiita.com/dz_/items/babb9404192693d71a65)
• Device twinsとDirect method
Device twins
• エッジデバイスの「状態」や「メタデータ」を取り扱う
• properties
• Desired properties
• クラウドからエッジデバイスへ要求されるプロパティ
• Reported properties
• エッジデバイスからクラウドへ報告されるプロパティ
• 更新されたタイミングでイベント駆動
Device twins
IoT HubThings
LEDをしました~
{
"ledIsLighted": true
}
LEDを点灯
してください~
desired
reported
{
"ledIsLighted": true
}
Direct method
• Device SDKを用いて「メソッド」を定義しておくと、クラウド側からそ
のメソッドを実行できる
• CLIからも実行できる
Azure IoT Edge
Azure IoT Edge
• エッジデバイスで複数の「モジュール」を配置・管理できるサービス
• IoT Hubの一部
• コンテナ技術がベースで、コンテナ=モジュールとして扱う
• 各モジュールでは、独立したプロセス空間でOSが実行される
• モジュールの中で、IoT HubのDevice SDKを使う
• クラウドからモジュールの管理・更新ができる
• エッジデバイス内でメッセージルーティングを制御できる
IoT Edge runtime
module module
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
IoT Edge の仕組み
Sensors, etc.
Device
Azure
Container
Registry
IoT Edge runtime
module module
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
IoT Edge の仕組み
Sensors, etc.
Device
Azure
データストリーム
のプロキシ
モジュールのライ
フサイクル管理
エッジ内の
メッセージ
ルーティング
Container
Registry
IoT Edge runtime
module module
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
IoT Edge の仕組み
Sensors, etc.
Device
Azure
モジュールを
自作できる
ホストに接続
されたデバイスに
も接続可能
Container
Registry
モジュールの
コンテナイメージ
を配信
デバイス上ではこのように見えます
iotedge コマンド
docker コマンド
IoT Edgeのいいところ
IoT Edgeのいいところ
• モジュールを利用して、エッジデバイスのシステムを分割できる
• 生産性、安全性が向上
• モジュールのライフサイクル管理は、IoT Edgeがしてくれる
• ロジックの開発に注力できる
• クラウドから管理できることで、継続的な更新ができる
• バグ修正、機能追加
• 機械学習の学習済みデータセットの更新、など
IoT Edgeのいいところ
• モジュール単位でも、Module twinsやDirect methodが利用でき
る
• モジュール間のメッセージルーティングを制御できることで、通信量を
抑えられる
• サーバーサイドで培ったコンテナ技術を活かせる
IoT Edgeを使った開発の流れ
IoT Edgeを使った開発の流れ
1. Azure IoT Hubを作成する
2. IoT Hubにエッジデバイスを登録する(手動 or 自動)
3. Visual Studio Codeで開発する
1. Dockerfile更新, Device SDKを使ってコーディング
2. deployment.template.jsonを編集
4. Visual Studio Codeからデプロイする
5. Azure DevOpsなどCI/CDの運用も可能
Visual Studio Code Extension
Azure IoT Edge Extension
• IoT Edge モジュールの開発、
デプロイができる
Azure IoT Hub Toolkit Extension
• IoT Hub に登録されたデバイス
やモジュールを管理できる
Deployment manifest
• development.template.jsonに定義する
• EdgeAgent, EdgeHubの設定
• 自作モジュールの設定
• メッセージルーティング
• Twinのdesired propertiesの設定
• これをもとに、デバイスの環境(arm32v7など)向けのマニフェストを
生成する
• 参考: https://docs.microsoft.com/en-us/azure/iot-
edge/module-composition
デプロイの様子
deployment.template.
jsonを参照し
ビルド→レジストリへpush、
マニフェストの生成
マニフェストを指定して、
対象のデバイスに
デプロイ
メッセージルーティング
• deployment.template.jsonに定義する
• どのモジュールのoutputsを、どのモジュールのinputsまたは
$upstream(IoT Hub)に届けるか
• 参考: https://docs.microsoft.com/en-us/azure/iot-
edge/module-composition#declare-routes
deployment.template.json
IoT Edgeモジュール開発メモ
具体的な(ニッチな)コツ
モジュールからホストの /dev にアクセスする
• deployment.template.jsonで、
モジュールに右記のパラメータを指定する
• createOptions.HostConfig
• “Privileged”: true
• “Binds”: [“/dev/usb:/dev/usb”]
deployment.template.json
使いたいライブラリがPython
Card reader
IoT Edge runtime
module
(Python)
module
(Node.js)
IoT
Edge
agent
IoT
Edge
hub
…
• 本当は、全体的にNode.jsで統一した
かったが、カードリーダーのライブラリが
ない
• Pythonのライブラリなら実績も豊富なの
で、カードリーダー用モジュールは
Pythonで構成した
• ライブラリがPython2.7でしか動かないの
で、いずれアップデートが必要だろう
• IoT Edgeなら更新が容易♪
カードの情報を
メッセージ送信
メッセージを受け
取り、Twinを更新
EdgeHubでOutOfMemory😐
• モジュール間のメッセージ送受信ができない
• $upsteam(IoT Hub)へはメッセージが届く🤔
• 原因は、EdgeHubがOutOfMemoryでエラー
で動作不良になっていた
• このissueから暫定対処を把握
• https://github.com/Azure/iot-edge-
v1/issues/475#issuecomment-403915333
deployment.template.json
モジュールの更新の仕方
1. イメージを更新してレジストリに push する
• タグは更新してもしなくてもよい
2. deployment.template.json のモジュー
ルのバージョンを更新する
3. Deployent manifest を生成する
4. デバイスにデプロイする
• これでエッジデバイスのiotedgeが、自動的に
pull して更新してくれる
deployment.template.json
Serverless
study note
サーバレス研究
ノート
Event Hubs
trigger
Card reader
IoT Edge runtime
module module
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
Functions
SignalR Service
Azure
update!
Web
Blob Storage
構成図
サーバレス構成の要素
• Azure Functions
• Azure SignalR Service
• Static website on Azure Storage Blob
• Vue.js
Azure Functions
• 言わずと知れたAzureのFaaS
• 多用なトリガーに対応する
• 今回は、Event Hubトリガーを利用
• IoT Hubからのメッセージを受け付け、そのままSignalR Serviceに横流し
Azure SignalR Service
• SignalRのサーバーをホストしてくれるサービス
• SignalRは、リアルタイムに通信するためのライブラリ
• Websocketsなどを利用して通信
• Azure Functionsと組み合わせて処理を実装
• SignalRはJavaScriptのクライアントがあるので、静的サイト上でも
利用できる!
Static website on Azure Storage Blob
• 静的サイトをホスティングできる
• ストレージなら低価格
Static site by Vue.js
• Vue.js
• "Progressive" JavaScript Framework
• https://vuejs.org/
• SignalRクライアントのサンプルもVue.jsで
書かれているので、組み合わせばっちり
• Bulma
• CSS framework
• https://bulma.io/
• (まだプロトタイプすぎですけど…)
Demoデモ
Event Hubs
trigger
Card reader
IoT Edge runtime
module
(Python)
module
(Node.js)
IoT
Edge
agent
IoT
Edge
hub
…
IoT Hub
Functions
SignalR Service
update!
Web
Blob Storage
構成図
Azure
Extrasおまけ
ARMテンプレート
• ARM = Azure Resource Manager
• 使うリソースを定義しておき、いつでも構築可能
• パラメータの指定や変数、ビルトイン関数を利用できる
• コツ
• AzureのREST APIと連動しているので、API versionに留意する
• リファレンス https://docs.microsoft.com/en-us/azure/templates/ を駆使する
• Functionsのオートデプロイ
• Azure DevOpsでzip化して、GitHub releaseに配置
• ARMテンプレートで、WEBSITE_RUN_FROM_PACKAGEにzipを指定することで、リ
ソースのデプロイ時にコードもデプロイ
Have fun!

IoT Edge and Serverless playground with Node.js ~ IoT EdgeとサーバレスをNode.jsで遊ぶ実験ノート