投稿日

SORACOM Funnel と Azure Event Hubs を活用した際のバックエンド構築例 (Power BI で可視化)

クラウドの進化が早いことを痛感している、ソラコム 松下(max)です。

ちょうど一年前(2016/1/27)にリリースされた、各種クラウドサービスと簡単に接続できるサービス「SORACOM Funnel」ですが、すでに多くのお客様に活用いただいております。

SORACOM Funnel の活用事例

SORACOM Funnel とは?

SORACOM Funnel(以下、Funnel) は、デバイスからのデータを特定のクラウドサービスに直接転送するクラウドリソースアダプターです。 Funnel でサポートされるクラウドサービスと、そのサービスの接続先のリソースを指定するだけで、データを指定のリソースにインプットすることができます。

詳細は Funnel の紹介ページをご覧ください

Azure Event Hubs の、その先

Funnel は Azure Event Hubs (以下、Event Hubs) との連携も容易です。方法は Getting Started に記載されていますが、Event Hubs はあくまで「データ収集基盤」のため、そのデータを活用する手段が必要となります。

幸いなことに Azure では Power BI という「データ可視化 BI (Business Intelligence) ツール」があるため、これで可視化するための方法をご紹介します。

構成

最終的には Event Hubs から Stream Analytics を通じ、Power BI へデータを運ぶ構成を目指します。

事前準備

  • SORACOM Funnel や Event Hubs の設定が済んでおり、Event Hubs までデータが着信していることが確認できている
  • Power BI のアカウントとサブスクリプション (Desktop でも Pro の無償試用中でOK)

Stream Analytics の設定

※Azureの管理画面は Microsoft Edge もしくは Firefox で見ることを推奨します

Microsoft Azure Portal にログインし、「その他のサービス」を選択した後、表示される検索ボックスに stream と入力します。 すると「Stream Analytics ジョブ」が表示されますのでクリックします。

「追加」をクリックし、表示されたダイアログに下記の通り入力し、「作成」をクリックします。

  • ジョブ名: <任意の文字列> (今回は SoracomFunnelStream0 としました)
  • サブスクリプション: <任意> (今回は 無料試用版 としました)
  • リソース グループ: <任意のリソースグループを作るなり既存から選択> (今回は SoracomFunnelDemo0 としました)
  • 場所: <リソースグループから自動的に決定されます>
  • ホスティング環境: クラウド

1~2分経つと Stream Analytics ジョブが作成されます。「更新」を押すと一覧に表示されるようになります。 表示された Stream Analytics ジョブをクリックし、「入力」をクリックします。その後「追加」をクリックします。

表示されたダイアログに下記の通り入力し、「作成」をクリックします。

  • 入力のエイリアス: <任意の文字列> (今回は Input としました)
  • ソースの種類: データ ストリーム
  • ソース: イベント ハブ
  • インポート オプション: サブスクリプションから Envet Hub を選択する
  • Service Bus 名前空間: <一覧の中から選択> (今回は aeNohy7phuko-eh0 としました)
  • イベント ハブ名: <一覧の中から選択> (今回は sensor0 としました)
  • Event Hub ポリシー名: <一覧の中から選択> (今回は RootManagerSharedAccessKey としました)
  • イベント ハブ コンシューマー グループ: <空でOK>
  • イベントシリアル化形式: JSON
  • エンコード: UTF-8
  • イベントの圧縮タイプ: なし

「出力」をクリックし、その後「追加」をクリックします。

表示されたダイアログに下記の通り入力し、「承認する」をクリックします。

※「承認する」は、シンクに Power BI を選択すると表示されます。

  • 入力のエイリアス: <任意の文字列> (今回は Output としました)
  • シンク: Power BI

「承認する」をクリックすると、 Power BI のログインを行う別ウィンドウが表示されますので、Power BI のアカウントを使用してログインしてください。

無事ログインできるとダイアログが下記のように変化しますので、追加で入力をし、「作成」をクリックします。

  • グループ ワークスペース: <一覧の中から選択> (今回は マイ ワークスペース としました)
  • データセット名: <任意の文字列> (今回は SoracomFunnelDataset0 としました)
  • テーブル名: <任意の文字列> (今回は SensorTable0 としました)

「クエリ」をクリックし、表示されたテキストボックスに下記の通り入力し、「保存」をクリックします。

本クエリの意味については「Stream Analytics の TIPS」で紹介します

SELECT
    System.Timestamp AS timestamp, operatorid, imei, imsi, payloads.*
INTO
    [Output]
FROM
    [Input] TIMESTAMP BY DATEADD(millisecond, timestamp, '1970-01-01T00:00:00Z')

以上で設定は完了です。Stream Analytics は「ジョブ」を開始することで動き出します。

「概要」をクリックし、「開始」をクリックします。

表示されたダイアログに下記の通り入力し、「開始」をクリックします。

  • ジョブ出力の開始時刻: 現在

以上で設定と、ジョブの実行を開始しました。

Stream Analytics の確認

Stream Analytics ジョブの動作確認です。

Event Hubs にデータを送信すると Stream Analytics へ流されます。また先ほど設定したクエリでは集計などのデータ加工を行っていないため、下図のように Event Hubs からの入力である INPUT EVENTS と Power BI への出力である OUTPUT EVENTS が同数で増えていきます※

※表示タイミングでは若干異なるかもしれませんが、最終的には同数になるはずです

Power BI Pro の設定

ここまでで SORACOM Funnel → Event Hubs → Stream Analytics という流れが出来上がりました。設定が完了していれば、Power BI に SoracomFunnelDataset0 というデータセット(データ格納の単位)が作成されているので、それを利用して可視化を行います。

Power BI Pro へのログインをした後、右下の「今はしない」をクリックします。

ちなみに、ここまでの設定に不備がある、もしくは設定は正常だがデータが1件も流れていない場合は、似たような画面が表示されますが「今はしない」が表示されません。設定の見直しや、データを流してみてください。

ワークスペースの画面が表示されたら「データセット」をクリックしてください。 SoracomFunnelDataset0 というデータセットが表示されていることを確認※したら、「作成」をクリックし、「ダッシュボード」をクリックしてください。

※データセットが作成されていない場合は、ここまでの設定の見直しや、データを流してみてください。

表示されたダイアログに下記の通り入力し、「作成」をクリックします。

  • ダッシュボード名: <任意の文字列> (今回は SoracomFunnelDashboard0 としました)

「タイルの追加」をクリックして、表示されたダイアログで カスタム ストリーミング データ を選択し、「次へ」をクリックします。

表示されたダイアログで SoracomFunnelDataset0 を選択し、「次へ」をクリックします。

表示されたダイアログに下記の通り入力し、「次へ」をクリックします。

  • 視覚化タイプ: 折れ線グラフ
  • 軸: <任意の軸に向いたデータ> (今回は timestamp としました)
  • 値: <任意の数値系データ> (今回は humitemp_c としました※)

※この “値” については「Stream Analytics の TIPS」で紹介します

表示されたダイアログに下記の通り入力し、「適用」をクリックします。

  • タイトル: <任意の文字列> (今回は SORACOM Funnel Streaming data としました)

下図のようにダッシュボードへ折れ線グラフが追加されます。データの更新は Stream Analytics からのデータによって自動的に更新されるのでリロードなどする必要がありません。便利です。

Power BI Desktop の場合

無料の Power BI Desktop でも可視化は可能です。

SoracomFunnelDataset0 が作成されていることが確認できれば Power BI Desktop のデータソースから Power BI サービス を選択すると、データセットが表示されます。

Power BI Desktop ではダッシュボードではなくレポートが作成できます。データの更新はオンデマンド(自動ではない)ので注意してください。

おさらい

SORACOM Funnel の Getting Started と、本ブログの内容を合わせて、下図のような構成を実現してきました。

費用

SORACOM Funnel や Azure の費用は下記ページから確認できます。

※Azure の料金計算ツールは Microsoft Edge か Firefox で見ることを推奨します

ザックリ計算すると、Azure側 (東日本) はこんな感じです

Event Hubs (Basic) 43.46円/日
Stream Analytics  370.94円/日
TTL 414.40円/日

Stream Analytics の TIPS

SORACOM Funnel からのデータを Power BI で使いやすくする

SORACOM Funnel へ下記のようにデータを送ってみます。

curl -H "Content-Type: application/json" -d '{"my_name": "is max!!", "old": 39}' funnel.soracom.io

すると、SORACOM Funnel から出力されるのは下記のような JSON です

{
 "operatorId": "OP0099999911",
 "timestamp": 1513816876880,
 "destination": {
 "resourceUrl": "...",
 "service": "...",
 "provider": "..."
},
 "credentialsId": "azure-eventhubs",
 "payloads": {
  "my_name": "is max!!",
  "old": 39
},
 "imei": "359999999999991",
 "sourceProtocol": "http",
 "imsi": "449999999999993"
}

デバイス側から送ったデータが payloads というキーに押し込まれて、その他便利に使ってもらえる付帯情報がくっつくフォーマットです。 Stream Analytics から Power BI にこのフォーマットのまま送ってしまうと payloads 内のデータが文字列として認識されてしまうため、グラフなどの値に利用することができません。

Stream Analytics のクエリで payloads の中身を Power BI でも読めるようにカラム化できます。

SELECT payloads.*

これで「payloadsの中身を取り出す」という宣言になります。

ですが、データ内に識別できる情報が抜けてしまっていて、どのデバイスからのデータかわからなくなってしまうと、視覚化や抽出の時に困りますので、例えば IMSI (International Mobile Subscriber Identity) を加える場合は、こんな感じになります

SELECT imsi, payloads.*

UNIX時間(エポック秒) を Stream Analytics 上で「タイムスタンプ」として認識する

Stream Analytics では FROM [Input] TIMESTAMP BY tsColumnName という書式で Input 内の tsColumnName をタイムスタンプ値として宣言することができます。

ISO 8601形式ならば特に何もせず識別してくれますが 1513816876880 といったUNIX時間形式の場合は、そのままでは認識してくれません。(Bigintとして認識されます)

これは DATEADD 関数を使い 1970/1/1 00:00:00 に対して加算することで解決します。

FROM
    [Input] TIMESTAMP BY DATEADD(millisecond, tsColumnName, '1970-01-01T00:00:00Z')

milliseconds のところを second などで調整できます。詳しくは DATEADD 関数をご覧ください。

このタイムスタンプとして認識されたカラムは SELECT 句の中で System.Timestamp というカラム名で取得することができます。 AS 句を使って別名設定しないと syntax error となりますので注意が必要です。

SELECT
    System.Timestamp AS ts
...
FROM
    [Input] TIMESTAMP BY DATEADD(millisecond, tsColumnName, '1970-01-01T00:00:00Z')

おわりに

このエントリーは Azure を活用したデモを作成しようと思った際に Event Hubs のスクリーンショットが古かったことがきっかけとなり作成しました。2年でこんなに変わってしまうのか、という思いで冒頭の「クラウドの進化は早い」という感想につながっています。

ステップ数は多いように見えますが、慣れると30分もかからずに作成することができます。また、スケーラブルなクラウドサービスですのでキャパシティ設計を考える必要がありませんので、新規のシステム構築にはもってこいの構成ではないでしょうか。

是非とも SORACOM Funnel をご活用ください!

ソラコム “MAX” 松下