atelier:mitsuba

i love UI/UX, Blend, XAML, Behavior, P5, oF, Web, Tangible Bits and Physical computing. なにかあればお気軽にご連絡ください。atelier@c-mitsuba.com

IoT HubにつないだStream Analyticsが高すぎるので、メッセージルーティングでなんとかする話。

前回、AZ3166をIoT Hubにつないでどーこーするエントリを書いたのだけど、そこで使ってるStreamAnalyticsが個人で使うには高すぎる。

azure.microsoft.com

azure.microsoft.com

今現在で、こんな価格。これが東日本だとさらに2円高い。
f:id:c-mitsuba:20220304004515p:plain

1SUの1時間あたりでこの値段なので雑に計算すると、、
13.757 * 24 * 30 = 9905.04 で、なんやかんやでだいたい1万円もする、、、高い、、、、。

っていうのも、そもそもIoTのバックエンドなんて何百何千のデバイスをつなげる前提のものが多い印象で、このStream Analyticsもこれに漏れずにそう。
秒間何十万何百万のメッセージをリアルタイムにやりとりするためのサービス。


ってわけで、高い、、高すぎる、、、っていうよりかは、むしろ1秒待ってループして1回メッセージを投げる1台しかないAZ3166相手に使うのは、富豪インフラストラクチャすぎるって話。

なので、Stream Analyticsを使わずに、センサーデータをBlobに保存したい、ってのが今回の本題。

もうすでに作ってしまったのだけど、IoT Hubのメッセージルーティングから、から、カスタムエンドポイントで処理できる。
こんなかんじ。
f:id:c-mitsuba:20220304005051p:plain

もしかしたらフリー版のIoT Hubだとカスタムエンドポイントは1つしか作れないかもしれない。

カスタムエンドポイントはストレージで追加して、
f:id:c-mitsuba:20220304010102p:plain

適当に名前つけて、
f:id:c-mitsuba:20220304010313p:plain

保存先のBlobコンテナ選んで、バッチ頻度は60秒に。
ここがポイントで、Stream Analyticsはリアルタイム解析だったのだけど、このカスタムエンドポイントは指定した60秒以上で1回処理するバッジ処理形式。
ファイル名形式でもわかるけど、1分おきにフォルダが生成されてファイルが出力させる仕組みにした。
チャンクサイズはたぶん1ファイルの大きさ上限かな。
エンコードJSONでOK。認証はキーベースが楽でよいかと。

出来上がったエンドポイントをルートに追加。
f:id:c-mitsuba:20220304010801p:plain

こんなかんじ。
f:id:c-mitsuba:20220304010857p:plain


できたら、しばらく待ってからBlobを覗きに行こう。

こんなかんじで、blobendpointコンテナの、MitsubaIoTHubの謎の1こめの2022年の3月の3日の15時の、n分ファイル.jsonみたいに作られてる。(多分UTC
f:id:c-mitsuba:20220304011119p:plain

で、中身がこんなかんじ。
f:id:c-mitsuba:20220304011427p:plain

{"EnqueuedTimeUtc":"2022-03-03T15:11:24.9340000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:24.9340000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MTgsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43OTk5OTkyMzcwNjA1NDcsCiAgICAiaHVtaWRpdHkiOiA0Mi4yOTk5OTkyMzcwNjA1NDcKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:11:30.7010000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:30.7010000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MTksCiAgICAidGVtcGVyYXR1cmUiOiAyNS43OTk5OTkyMzcwNjA1NDcsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:11:36.4690000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:36.4690000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjAsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:11:42.2350000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:42.2350000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjEsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:11:48.0010000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:48.0010000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjIsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:11:53.7660000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:53.7660000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjMsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4wOTk5OTg0NzQxMjEwOTQKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:11:59.5320000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:11:59.5320000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjQsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:12:05.3000000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:12:05.3000000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjUsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:12:11.0660000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:12:11.0660000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjYsCiAgICAidGVtcGVyYXR1cmUiOiAyNS43MDAwMDA3NjI5Mzk0NTMsCiAgICAiaHVtaWRpdHkiOiA0Mi4yMDAwMDA3NjI5Mzk0NTMKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:12:16.8470000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:12:16.8470000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjcsCiAgICAidGVtcGVyYXR1cmUiOiAyNS42MDAwMDAzODE0Njk3MjcsCiAgICAiaHVtaWRpdHkiOiA0Mi4yOTk5OTkyMzcwNjA1NDcKfQ=="}
{"EnqueuedTimeUtc":"2022-03-03T15:12:22.5990000Z","Properties":{"temperatureAlert":"false"},"SystemProperties":{"connectionDeviceId":"AZ3166","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"637818519466399285","enqueuedTime":"2022-03-03T15:12:22.5990000Z"},"Body":"ewogICAgIm1lc3NhZ2VJZCI6IDI0MjgsCiAgICAidGVtcGVyYXR1cmUiOiAyNS42MDAwMDAzODE0Njk3MjcsCiAgICAiaHVtaWRpdHkiOiA0Mi4yOTk5OTkyMzcwNjA1NDcKfQ=="}

リアルタイム性は今回必要ないし、ファイルは1分ごとにバラバラになってしまったけど、その分ファイル1つ1つのサイズが小さくなって、編集で読みやすくなった。
ひとまずJSONで保存する分には、高いStream Analyticsはなしでいいかなーっていう印象。
もうちょっとなんやかんや繋ぐには便利でよいかもだけど、使わないなら忘れずに止めておこう。