Azure IoT Hub から Azure Cosmos DB を使用してデバイス接続イベントを順序付ける

Azure Event Grid を使うと、イベント ベースのアプリケーションを構築するのに役立ち、IoT イベントをビジネス ソリューションに簡単に統合できます。 この記事では、Cosmos DB、ロジック アプリ、IoT Hub イベント、シミュレートされた Raspberry Pi を使って、デバイスの接続と切断のイベントを収集して格納するためのセットアップの手順について説明します。

デバイスが起動してからの操作がアクティブになる順序は次のようになります。

  1. IoT ハブ デバイス キーを使う Pi デバイスが開始され、停止されます

  2. IoT Hub イベントがデバイスのアクティビティをキャプチャし、ロジック アプリに HTTP 要求を送信します

  3. ロジック アプリが、設定されている条件に基づいて HTTP 要求を処理します

  4. ロジック アプリが、接続または切断イベントを Cosmos DB の新しいドキュメントにログします

    この記事用に作成するセットアップのスクリーンショット。このセットアップでは、すべてのサービスとデバイスがどのように接続されているかを示します。

前提条件

  • アクティブな Azure Cosmos DB for NoSQL アカウント。 まだ作成していない場合は、「データベース アカウントの作成」の手順を参照してください。

  • データベース内のコレクション。 「コレクションの追加」の手順を参照してください。 コレクションを作成するときに、パーティション キーに /id を使用します。

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料でアカウントを 1 つ作成してください。

  • Azure サブスクリプションの IoT ハブ。 CLI または Azure portal を使って作成します。

ロジック アプリを作成します

ロジック アプリを作成し、仮想マシンのリソース グループを監視する Event Grid トリガーを追加してみましょう。

ロジック アプリ リソースを作成する

  1. Azure portalで、 [+リソースの作成][統合][ロジック アプリ] の順に選択します。

    Azure portal でロジック アプリを検索して選択する方法のスクリーンショット。

  2. フォームに入力して、以下を含む新しいロジック アプリを作成します。

    • 該当するサブスクリプション

    • 自分のリソース グループ (または、新しく作成します)

    • サブスクリプションで一意のロジック アプリ名

    • お使いの IoT ハブのリージョン

    • ログ分析の有効化は "いいえ"

    • "従量課金" プランの種類

      注意

      "従量課金" プランの種類は、UI でロジック アプリ デザイナーを有効にするオプションです。 Standard (既定値) を選んだ場合、ロジック アプリ デザイナーを使えるようにするには、新しいワークフローを作成する必要があります。

    Azure portal でロジック アプリを作成する方法のスクリーンショット。

  3. [確認と作成] を選んで構成を確認し、[作成] を選んでロジック アプリを作成します。

  4. これで、ロジック アプリの Azure リソースが作成されました。 Azure によってロジック アプリがデプロイされたら、[リソースに移動] を選択します。 すばやく始められるように、ロジック アプリ デザイナーで一般的なパターンのテンプレートが表示されます。

  5. ロジック アプリ デザイナーで、[テンプレート] セクションが表示されるまでスクロールし、[空のロジック アプリ] を選んで、ロジック アプリを最初から構築できるようにします。

トリガーを選択する

トリガーは、ロジック アプリを開始する特定のイベントです。 このチュートリアルでは、ワークフローを開始するトリガーは、HTTP 経由での要求の受信です。

  1. コネクタとトリガーの検索バーに、「HTTP」と入力して Enter キーを押します。

  2. トリガーとして要求 [HTTP 要求の受信時] を選びます。

    HTTP 要求トリガーを選ぶ方法のスクリーンショット。

  3. [サンプルのペイロードを使用してスキーマを生成する] を選びます。

    サンプル ペイロードを使ってスキーマを生成する方法のスクリーンショット。

  4. 次のサンプル JSON コードをテキスト ボックスに貼り付けて、[完了] を選びます。

    この JSON はテンプレートとしてのみ使われるため、正確な値は重要ではありません。

    [{
     "id": "fbfd8ee1-cf78-74c6-dbcf-e1c58638ccbd",
     "topic":
       "/SUBSCRIPTIONS/DEMO5CDD-8DAB-4CF4-9B2F-C22E8A755472/RESOURCEGROUPS/EGTESTRG/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/MYIOTHUB",
     "subject": "devices/Demo-Device-1",
     "eventType": "Microsoft.Devices.DeviceConnected",
     "eventTime": "2018-07-03T23:20:11.6921933+00:00",
     "data": {
       "deviceConnectionStateEventInfo": {
         "sequenceNumber":
           "000000000000000001D4132452F67CE200000002000000000000000000000001"
       },
       "hubName": "MYIOTHUB",
       "deviceId": "48e44e11-1437-4907-83b1-4a8d7e89859e",
       "moduleId": ""
     },
     "dataVersion": "1",
     "metadataVersion": "1"
    }]
    

    Azure のテキスト ボックスに貼り付けたサンプル JSON ペイロードのスクリーンショット。

条件を作成する

条件は、特定の条件を満たした後に特定のアクションを実行するのに役立ちます。 この記事での条件は、eventType がデバイス接続またはデバイス切断のどちらであるかを調べることです。 その eventType が true の場合に実行されるアクションは、Azure Cosmos DB でのドキュメントの作成です。 この条件は、ロジック アプリ デザイナーで作成されます。

  1. [+ 新しいステップ][ビルトイン] タブの順に選び、[条件] という名前のコントロールを見つけて選びます。

  2. 接続イベントまたは切断イベントを 1 回の解析でキャプチャしたいので、条件で [And][Or] に変更します。

  3. [値の選択] ボックスの内部を選ぶと、ポップアップが表示されて、動的コンテンツ (選択可能なフィールド) が示されます。

    • eventType を選びます。 ポップアップが閉じ、[本文][以前の手順から出力を選択] に自動的に配置されます。 [条件] を選んで、条件ステートメントをもう一度開きます。

    • [が次の値に等しい] という値のままにします。

    • その行の最後の値として「Microsoft.Devices.DeviceConnected」と入力します。

    • [+ 追加] を選んで別の行を追加します。

    • この 2 行目は 1 行目に似ていますが、切断イベントを探す点が異なります。

      行の値として、eventType[が次の値に等しい]Microsoft.Devices.DeviceDisconnected を使います。

      完全な For Each 条件のスクリーンショット。

  4. [true の場合] ダイアログで、 [アクションの追加] をクリックします。

    Azure の [true の場合] ボックスのスクリーンショット。

  5. Cosmos DB を検索し、[Azure Cosmos DB — Create or update document (V3)] (Azure Cosmos DB — ドキュメントを作成または更新する (V3)) を選びます

    Azure Cosmos DB の検索のスクリーンショット。

  6. [ドキュメントを作成または更新する (V3)] パネルが表示されます。 フィールドに次の値を入力します。

    Azure Cosmos DB account name (Azure Cosmos DB アカウント名): <自分のアカウント名を追加します>

    データベース ID:ToDoList

    コレクション ID:アイテム

    ドキュメント: 動的コンテンツ パラメーター リストから [Current item] を選びます

    スクリーンショットには、[新しいパラメーターの追加] を選択した状態で、[ストアド プロシージャの実行 (V3)] 項目が示されています。

  7. ロジック アプリを保存します。

HTTP の URL をコピーする

Logic Apps デザイナーを終了する前に、ロジック アプリがトリガーをリッスンする URL をコピーします。 この URL を使って、Event Grid を構成します。

  1. [HTTP 要求の受信時] トリガー構成ボックスを選んで展開します。

  2. [HTTP POST の URL] の横にあるコピー ボタンを選んで値をコピーします。

    コピーする HTTP URL を見つける場所のスクリーンショット。

  3. 次のセクションで使えるように、この URL を保存します。

IoT Hub イベント用のサブスクリプションを構成する

このセクションでは、発生したらイベントを発行するように IoT Hub を構成します。

  1. Azure Portal で、お使いの IoT ハブに移動します。

  2. イベントを選択します。

    IoT Hub のメニューの [イベント] ボタンの場所のスクリーンショット。

  3. [+ イベント サブスクリプション] を選びます。

    新しいイベント サブスクリプションを作成する

  4. [イベント サブスクリプションの詳細] を指定します。わかりやすい [名前] を指定し、[イベント スキーマ] として [イベント グリッド スキーマ] を選びます。

  5. IoT ハブ リソースのシステム トピック名を作成します。

  6. [イベントの種類] フィールドに入力します。 ドロップダウン リストで、 [Device Connected](デバイスの接続) および [Device Disconnected](デバイスの切断) のみをメニューから選択します。 画面の他の場所をクリックしてリストを閉じ、選択内容を保存します。

    検索するイベントの種類を設定する

  7. [エンドポイントの詳細] で、 [エンドポイントのタイプ] として [web hook] を選択し、[エンドポイントの選択] をクリックして、ロジック アプリからコピーした URL を貼り付けて選択を確認します。

    エンドポイントの URL を選択する

  8. これで、フォームは次の例のようになります。

    イベント サブスクリプションを作成するフォームのスクリーンショット。

    [作成] を選び、イベント サブスクリプションを保存します。

    重要

    デバイスを実行する前に、イベントが処理されるまで数分待ちます。 Azure サービスを作成または変更したときは常に、パイプラインの次のステップを始めるのが早すぎると、不要なエラーが発生する可能性があります。 たとえば、IoT ハブがアクティブな状態でない場合、イベントを受信する準備が整っていません。 IoT ハブの [概要] ページを調べて、IoT ハブがアクティブな状態かどうかを確認します。 そうでない場合は、ページの上部に警告が表示されます。

    アクティブな状態ではないことを示す IoT Hub エラーのスクリーンショット。

デバイスを実行してイベントを観察する

イベント サブスクリプションを設定した後は、デバイスを接続してテストします。

IoT Hub にデバイスを登録する

  1. IoT ハブで、[デバイス] を選択します。

  2. ペインの上部にある [+ デバイスの追加] を選びます。

  3. [デバイス ID] に「Demo-Device-1」と入力します。

  4. [保存] を選択します。

    [デバイスの追加] ボタンの場所のスクリーンショット。

  5. デバイスを再度クリックすると、接続文字列とキーが入力されます。 後で使用できるように [プライマリ接続文字列] をコピーして保存します。

    デバイスのプライマリ接続文字列の場所のスクリーンショット。

Raspberry Pi シミュレーターを起動する

Raspberry Pi Web シミュレーターを使用してデバイス接続をシミュレートしましょう。

Raspberry Pi シミュレーターの起動

Raspberry Pi Web シミュレーターでサンプル アプリケーションを実行する

このサンプル アプリでは、デバイス接続イベントがトリガーされます。

  1. コーディング領域で、行 15 のプレースホルダーを、前のセクションの最後に保存した Azure IoT Hub デバイスの接続文字列に置き換えます。

    Raspberry Pi スクリプトでプライマリ接続文字列を追加する場所のスクリーンショット。

  2. [Run](実行) を選択してアプリケーションを実行します。

    IoT Hub に送信されるセンサー データとメッセージを示す次のような出力が表示されます。

    Raspberry Pi を実行したときに予想される出力コンソールの内容のスクリーンショット。

  3. ロジック アプリの [概要] ページを調べて、ロジックがトリガーされているかどうかを確認できます。 [成功] または [失敗] と表示されます。 トラブルシューティングが必要な場合、ここを調べるとロジック アプリの状態がわかります。 トリガーが実行してから、15 秒から 30 秒の遅延が予想されます。 ロジック アプリのトラブルシューティングが必要な場合は、こちらのエラーのトラブルシューティングに関する記事をご覧ください。

    ロジック アプリの [概要] ページでの状態更新のスクリーンショット。

  4. [停止] を選んでシミュレーターを停止すると、デバイス切断イベントがトリガーされます。 このイベントは、接続イベントがログされたのと同様に、ロジック アプリの [概要] ページにログされます。

これで、サンプル アプリケーションを実行し、IoT ハブに送信されるデバイスの接続と切断イベントを収集しました。

Azure Cosmos DB でイベントを確認する

実行されたロジック アプリの結果は、Cosmos DB ドキュメントで確認できます。 ページを更新すると、[項目] コレクションにドキュメントが表示されます。 接続状態イベントごとに、一意の id を割り当てられた新しいドキュメントが生成されます。 次の図は、デバイスが起動 (接続) されたときに作成されるドキュメントを示したものです。 接続イベントの種類が、JSON 出力の一覧に表示されています。

Cosmos DB のコレクションに新しく生成された接続状態イベントのスクリーンショット。

Azure CLI の使用

Azure portal を使う代わりに、Azure CLI を使って IoT Hub の手順を行うことができます。 詳細については、イベント サブスクリプションの作成IoT デバイスの作成に関する Azure CLI のページを参照してください。

リソースをクリーンアップする

このチュートリアルでは、Azure サブスクリプションで料金が発生するリソースを使いました。 チュートリアルを試してテストを完了したら、残しておきたくないリソースを無効にするか削除します。

ロジック アプリ

アプリ ロジックでの作業を失いたくない場合は、削除ではなく無効にします。

  1. ロジック アプリに移動します。

  2. [概要] ブレードで、 [削除] または [無効] を選びます。

    各サブスクリプションで使うことができる無料 IoT Hub は 1 つです。 このチュートリアル用に無料のハブを作成した場合は、課金されないように削除する必要はありません。

IoT ハブまたは Event Grid

  1. IoT Hub に移動します。

  2. [概要] ブレードで [削除] を選びます。

  3. IoT Hub を残しておく場合でも、作成したイベント サブスクリプションを削除できます。 IoT Hub で [イベント グリッド] を選びます。

  4. 削除するイベント サブスクリプションを選んで、[削除] を選びます。

Cosmos DB

Azure portal から Azure Cosmos DB アカウントを削除するには、リソースに移動し、上部のメニュー バーから [アカウントの削除] を選びます。 Azure Cosmos DB アカウントを削除するための詳細な手順を参照してください。

次のステップ