チュートリアル:Azure Resource Manager テンプレートを使用して IoT Hub のメッセージ ルーティングを構成するTutorial: Use an Azure Resource Manager template to configure IoT Hub message routing

メッセージ ルーティングを使うと、IoT デバイスから組み込みイベント ハブ互換エンドポイントまたはカスタム エンドポイント (BLOB ストレージ、Service Bus キュー、Service Bus トピック、Event Hubs など) に、利用統計情報を送信できます。Message routing enables sending telemetry data from your IoT devices to built-in Event Hub-compatible endpoints or custom endpoints such as blob storage, Service Bus Queues, Service Bus Topics, and Event Hubs. カスタム メッセージ ルーティングを構成するには、特定の条件と一致するルートをカスタマイズするためのルーティング クエリを作成できます。To configure custom message routing, you create routing queries to customize the route that matches a certain condition. 設定が済むと、受信データは IoT Hub によってエンドポイントに自動的にルーティングされるようになります。Once set up, the incoming data is automatically routed to the endpoints by the IoT Hub. メッセージが定義されているルーティング クエリのいずれとも一致しない場合、メッセージは既定のエンドポイントにルーティングされます。If a message doesn't match any of the defined routing queries, it is routed to the default endpoint.

この 2 部構成のチュートリアルでは、IoT Hub を使用してこれらのカスタム ルーティング クエリを設定および使用する方法を学習します。In this 2-part tutorial, you learn how to set up and use these custom routing queries with IoT Hub. IoT デバイスから、BLOB ストレージや Service Bus キューなどの複数のエンドポイントのいずれかにメッセージをルーティングします。You route messages from an IoT device to one of multiple endpoints, including blob storage and a Service Bus queue. Service Bus キューへのメッセージは、ロジック アプリによって取得されて、メールで送信されます。Messages to the Service Bus queue are picked up by a Logic App and sent via e-mail. カスタム メッセージ ルーティングが定義されていないメッセージは、既定のエンドポイントに送信された後、Azure Stream Analytics によって取得され、Power BI の視覚化に表示されます。Messages that do not have custom message routing defined are sent to the default endpoint, then picked up by Azure Stream Analytics and viewed in a Power BI visualization.

このチュートリアルのパート 1 とパート 2 を完了するには、以下のタスクを実行します。To complete Parts 1 and 2 of this tutorial, you perform the following tasks:

パート I: リソースを作成してメッセージ ルーティングを設定するPart I: Create resources, set up message routing

  • リソースを作成する (IoT ハブ、ストレージ アカウント、Service Bus キュー、シミュレートされたデバイス)。Create the resources -- an IoT hub, a storage account, a Service Bus queue, and a simulated device. この操作は、Azure portal、Azure Resource Manager テンプレート、Azure CLI、または Azure PowerShell を使用して実行できます。This can be done using the Azure portal, an Azure Resource Manager template, the Azure CLI, or Azure PowerShell.
  • ストレージ アカウントと Service Bus キューに対するエンドポイントとメッセージ ルートを IoT Hub で構成する。Configure the endpoints and message routes in IoT Hub for the storage account and Service Bus queue.

パート II: メッセージをハブに送信して、ルーティングされた結果を表示するPart II: Send messages to the hub, view routed results

  • メッセージが Service Bus キューに追加されるとトリガーされてメールを送信するロジック アプリを作成します。Create a Logic App that is triggered and sends e-mail when a message is added to the Service Bus queue.
  • 異なるルーティング オプションでハブにメッセージを送信する IoT デバイスをシミュレートするアプリをダウンロードして実行します。Download and run an app that simulates an IoT Device sending messages to the hub for the different routing options.
  • 既定のエンドポイントに送信されたデータに対する Power BI の視覚エフェクトを作成します。Create a Power BI visualization for data sent to the default endpoint.
  • 結果を表示します ...View the results ...
  • ... Service Bus キューおよびメール内の結果。...in the Service Bus queue and e-mails.
  • ... ストレージ アカウント内の結果。...in the storage account.
  • ... Power BI の視覚エフェクト内の結果。...in the Power BI visualization.

前提条件Prerequisites

  • このチュートリアルのパート 1:For Part 1 of this tutorial:

    • Azure サブスクリプションが必要です。You must have an Azure subscription. Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。If you don't have an Azure subscription, create a free account before you begin.
  • このチュートリアルのパート 2:For Part 2 of this tutorial:

    • このチュートリアルのパート 1 を完了し、リソースが引き続き利用可能である必要があります。You must have completed Part 1 of this tutorial, and have the resources still available.
    • Visual Studio のインストール。Install Visual Studio.
    • 既定のエンドポイントの Stream Analytics を分析するために Power BI アカウントにアクセスできる。Have access to a Power BI account to analyze the default endpoint's stream analytics. (Power BI を無料で試す)(Try Power BI for free.)
    • 通知メールを送信するための職場または学校アカウントを持っている。Have a work or school account for sending notification e-mails.
    • ポート 8883 がファイアウォールで開放されていることを確認してください。Make sure that port 8883 is open in your firewall. このチュートリアルのサンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。The sample in this tutorial uses MQTT protocol, which communicates over port 8883. このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。This port may be blocked in some corporate and educational network environments. この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

Azure Cloud Shell を使用するUse Azure Cloud Shell

Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell で Bash または PowerShell を使用して、Azure サービスを操作できます。You can use either Bash or PowerShell with Cloud Shell to work with Azure services. ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Azure Cloud Shell を開始するには:To start Azure Cloud Shell:

オプションOption 例とリンクExample/Link
コード ブロックの右上隅にある [使ってみる] を選択します。Select Try It in the upper-right corner of a code block. [使ってみる] を選択しても、コードは Cloud Shell に自動的にコピーされません。Selecting Try It doesn't automatically copy the code to Cloud Shell. Azure Cloud Shell の [使ってみる] の例
https://shell.azure.com に移動するか、 [Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. 新しいウィンドウで Cloud Shell を起動するLaunch Cloud Shell in a new window
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。Select the Cloud Shell button on the menu bar at the upper right in the Azure portal. Azure Portal の [Cloud Shell] ボタン

Azure Cloud Shell でこの記事のコードを実行するには:To run the code in this article in Azure Cloud Shell:

  1. Cloud Shell を開始します。Start Cloud Shell.

  2. [コピー] ボタンを選択して、コード ブロックをコードにコピーします。Select the Copy button on a code block to copy the code.

  3. Windows と Linux では Ctrl+Shift+V キーを選択し、macOS では Cmd+Shift+V キーを選択して、コードを Cloud Shell セッションに貼り付けます。Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Enter キーを選択して、コードを実行します。Select Enter to run the code.

基本のリソースの作成Create base resources

メッセージ ルーティングを構成するには、IoT ハブ、ストレージ アカウント、および Service Bus キューを事前に作成する必要があります。Before you can configure the message routing, you need to create an IoT hub, a storage account, and a Service Bus queue. これらのリソースは、このチュートリアルのパート 1 にある 4 つの記事 (Azure portal、Azure Resource Manager テンプレート、Azure CLI、または Azure PowerShell) のいずれかを使用して作成できます。These resources can be created using one of the four articles that are available for Part 1 of this tutorial: the Azure portal, an Azure Resource Manager template, the Azure CLI, or Azure PowerShell.

すべてのリソースに同じリソース グループと場所を使います。Use the same resource group and location for all of the resources. 最後に、リソース グループを削除することによって、すべてのリソースを一度に削除できます。Then at the end, you can remove all of the resources in one step by deleting the resource group.

次に、以下のセクションで実行する手順の概要を示します。Below is a summary of the steps to be performed in the following sections:

  1. リソース グループを作成します。Create a resource group.

  2. S1 レベルに IoT ハブを作成します。Create an IoT hub in the S1 tier. コンシューマー グループを IoT ハブに追加します。Add a consumer group to your IoT hub. コンシューマー グループは、データを取得するときに Azure Stream Analytics によって使われます。The consumer group is used by the Azure Stream Analytics when retrieving data.

    注意

    このチュートリアルを完了するには、有料レベルで IoT ハブを使用する必要があります。You must use an Iot hub in a paid tier to complete this tutorial. 無料レベルで設定できるのは 1 つのエンドポイントのみです。このチュートリアルでは複数のエンドポイントが必要です。The free tier only allows you to set up one endpoint, and this tutorial requires multiple endpoints.

  3. Standard_LRS レプリケーションで Standard V1 ストレージ アカウントを作成します。Create a standard V1 storage account with Standard_LRS replication.

  4. Service Bus の名前空間とキューを作成します。Create a Service Bus namespace and queue.

  5. ハブにメッセージを送信するシミュレートされたデバイスのデバイス ID を作成します。Create a device identity for the simulated device that sends messages to your hub. テスト フェーズ用にキーを保存します。Save the key for the testing phase. (Resource Manager テンプレートを作成する場合、これはテンプレートをデプロイした後に行います)。(If creating a Resource Manager template, this is done after deploying the template.)

メッセージ ルーティングMessage routing

シミュレートされたデバイスによってメッセージに添付されたプロパティに基づいて、メッセージを異なるリソースにルーティングします。You are going to route messages to different resources based on properties attached to the message by the simulated device. カスタム ルーティングされないメッセージは、既定のエンドポイント (メッセージ/イベント) に送信されます。Messages that are not custom routed are sent to the default endpoint (messages/events). 次のチュートリアルでは、メッセージを IoT Hub に送信して、それらがさまざまな宛先にルーティングされるのを確認します。In the next tutorial, you send messages to the IoT Hub and see them routed to the different destinations.

Value 結果Result
level="storage"level="storage" Azure Storage に書き込みます。Write to Azure Storage.
level="critical"level="critical" Service Bus キューに書き込みます。Write to a Service Bus queue. ロジック アプリがキューからメッセージを取得し、Office 365 を使ってメールでメッセージを送信します。A Logic App retrieves the message from the queue and uses Office 365 to e-mail the message.
既定値 (default)default Power BI を使ってこのデータを表示します。Display this data using Power BI.

最初の手順では、データのルーティング先のエンドポイントを設定します。The first step is to set up the endpoint to which the data will be routed. 2 番目の手順では、そのエンドポイントを使用するメッセージ ルートを設定します。The second step is to set up the message route that uses that endpoint. ルーティングの設定後、ポータルでエンドポイントとメッセージ ルートを表示できます。After setting up the routing, you can view the endpoints and message routes in the portal.

テンプレートとパラメーター ファイルのダウンロードDownload the template and parameters file

このチュートリアルのパート 2 では、IoT ハブにメッセージを送信する Visual Studio アプリケーションをダウンロードして実行します。For the second part of this tutorial, you download and run a Visual Studio application to send messages to the IoT Hub. このダウンロード内のフォルダーには、Azure Resource Manager テンプレートとパラメーター ファイルのほか、Azure CLI と PowerShell のスクリプトが含まれています。There is a folder in that download that contains the Azure Resource Manager template and parameters file, as well as the Azure CLI and PowerShell scripts.

早速、Azure IoT C# サンプルをダウンロードしましょう。Go ahead and download the Azure IoT C# Samples now. master.zip ファイルを解凍します。Unzip the master.zip file. Resource Manager テンプレートとパラメーター ファイルは、template_iothub.json および template_iothub_parameters.json という名前で、/iot-hub/Tutorials/Routing/SimulatedDevice/resources/ にあります。The Resource Manager template and the parameters file are in /iot-hub/Tutorials/Routing/SimulatedDevice/resources/ as template_iothub.json and template_iothub_parameters.json.

リソースの作成Create your resources

リソースはすべて、Azure Resource Manager (RM) テンプレートを使用して作成します。You're going to use an Azure Resource Manager (RM) template to create all of your resources. Azure CLI と PowerShell のスクリプトは一度に数行実行することができます。The Azure CLI and PowerShell scripts can be run a few lines at a time. RM テンプレートは 1 回の手順でデプロイされます。An RM template is deployed in one step. この記事では、それぞれを理解しやすいように各セクションを個別に説明します。This article shows you the sections separately to help you understand each one. さらに、テンプレートをデプロイしてテスト用の仮想デバイスを作成する方法を説明します。Then it will show you how to deploy the template, and create the virtual device for testing. テンプレートのデプロイ後、ポータルでメッセージ ルーティング構成を確認できます。After the template is deployed, you can view the message routing configuration in the portal.

IoT ハブ名やストレージ アカウント名など、いくつかのリソース名はグローバルに一意であることが必要です。There are several resource names that must be globally unique, such as the IoT Hub name and the storage account name. リソースの命名を容易にするために、それらのリソース名には、現在の日付および時刻から生成される英数字のランダム値が追加されるよう設定されています。To make naming the resources easier, those resource names are set up to append a random alphanumeric value generated from the current date/time.

テンプレートを見ると、それらのリソースに対し変数が設定されている場所がわかります。リソースは渡されたパラメーターを受け取り、そのパラメーターに randomValue を連結します。If you look at the template, you'll see where variables are set up for these resources that take the parameter passed in and concatenate randomValue to the parameter.

次のセクションでは、使用されるパラメーターについて説明します。The following section explains the parameters used.

パラメーターParameters

これらのパラメーターのほとんどには既定値があります。Most of these parameters have default values. 末尾が _in のものは、randomValue と連結されてグローバルに一意になります。The ones ending with _in are concatenated with randomValue to make them globally unique.

randomValue: この値は、テンプレートをデプロイした時点の最新の日付および時刻から生成されます。randomValue: This value is generated from the current date/time when you deploy the template. このフィールドは、テンプレート自体で生成されるため、パラメーター ファイルには存在しません。This field is not in the parameters file, as it is generated in the template itself.

subscriptionId: このフィールドは、テンプレートのデプロイ先となるサブスクリプションに自動的に設定されます。subscriptionId: This field is set for you to the subscription into which you are deploying the template. このフィールドは自動的に設定されるため、パラメーター ファイルには存在しません。This field is not in the parameters file since it is set for you.

IoTHubName_in: このフィールドは、IoT ハブのベース名です。これが randomValue と連結されてグローバルに一意になります。IoTHubName_in: This field is the base IoT Hub name, which is concatenated with the randomValue to be globally unique.

location:このフィールドは、デプロイ先となる Azure リージョンです ("westus" など)。location: This field is the Azure region into which you are deploying, such as "westus".

consumer_group: このフィールドは、ルーティング エンドポイントを通じて受信されるメッセージに対して設定されるコンシューマー グループです。consumer_group: This field is the consumer group set for messages coming through the routing endpoint. Azure Stream Analytics で結果をフィルター処理するために使用されます。It is used to filter results in Azure Stream Analytics. たとえば、ストリーム全体からすべてのデータを受け取る場合や、Contoso に設定された consumer_group を通じてデータを受信する場合、Azure Stream Analytics ストリーム (と Power BI レポート) を設定して、それらのエントリだけを表示できます。For example, there is the whole stream where you get everything, or if you have data coming through with consumer_group set to Contoso, then you can set up an Azure Stream Analytics stream (and Power BI report) to show only those entries. このフィールドは、このチュートリアルのパート 2 で使用されます。This field is used in part 2 of this tutorial.

sku_name: このフィールドは、IoT ハブのスケーリングです。sku_name: This field is the scaling for the IoT Hub. この値は S1 以上にする必要があります。Free レベルは、複数のエンドポイントが許容されていないため、このチュートリアルには使用できません。This value must be S1 or above; a free tier does not work for this tutorial because it does not allow multiple endpoints.

sku_units: このフィールドは、使用できる IoT Hub ユニットの数であり、sku_name と対で使用します。sku_units: This field goes with the sku_name, and is the number of IoT Hub units that can be used.

d2c_partitions: このフィールドは、イベント ストリームに使用されるパーティションの数です。d2c_partitions: This field is the number of partitions used for the event stream.

storageAccountName_in: このフィールドは、作成されるストレージ アカウントの名前です。storageAccountName_in: This field is the name of the storage account to be created. メッセージは、ストレージ アカウント内のコンテナーにルーティングされます。Messages are routed to a container in the storage account. このフィールドが randomValue と連結されて、グローバルに一意になります。This field is concatenated with the randomValue to make it globally unique.

storageContainerName: このフィールドは、ストレージ アカウントにルーティングされたメッセージの格納先となるコンテナーの名前です。storageContainerName: This field is the name of the container in which the messages routed to the storage account are stored.

storage_endpoint: このフィールドは、メッセージ ルーティングによって使用されるストレージ アカウント エンドポイントの名前です。storage_endpoint: This field is the name for the storage account endpoint used by the message routing.

service_bus_namespace_in: このフィールドは、作成される Service Bus 名前空間の名前です。service_bus_namespace_in: This field is the name of the Service Bus namespace to be created. この値が randomValue と連結されて、グローバルに一意になります。This value is concatenated with the randomValue to make it globally unique.

service_bus_queue_in: このフィールドは、メッセージのルーティングに使用される Service Bus キューの名前です。service_bus_queue_in: This field is the name of the Service Bus queue used for routing messages. この値が randomValue と連結されて、グローバルに一意になります。This value is concatenated with the randomValue to make it globally unique.

AuthRules_sb_queue: このフィールドは、Service Bus キューの承認規則です。キューの接続文字列を取得するために使用されます。AuthRules_sb_queue: This field is the authorization rules for the service bus queue, used to retrieve the connection string for the queue.

変数Variables

これらの値はテンプレート内で使用され、大半はパラメーターから得られます。These values are used in the template, and are mostly derived from parameters.

queueAuthorizationRuleResourceId: このフィールドは、Service Bus キュー用の承認規則の ResourceId です。queueAuthorizationRuleResourceId: This field is the ResourceId for the authorization rule for the Service Bus queue. そして ResourceId は、キューの接続文字列を取得するために使用されます。ResourceId is in turn used to retrieve the connection string for the queue.

iotHubName: このフィールドは、randomValue が連結された後の IoT ハブの名前です。iotHubName: This field is the name of the IoT Hub after having randomValue concatenated.

storageAccountName:このフィールドは、randomValue が連結された後のストレージ アカウントの名前です。storageAccountName: This field is the name of the storage account after having randomValue concatenated.

service_bus_namespace: このフィールドは、randomValue が連結された後の名前空間です。service_bus_namespace: This field is the namespace after having randomValue concatenated.

service_bus_queue: このフィールドは、randomValue が連結された後の Service Bus キュー名です。service_bus_queue: This field is the Service Bus queue name after having randomValue concatenated.

sbVersion: 使用する Service Bus API のバージョンです。sbVersion: THe version of the Service Bus API to use. このケースでは "2017-04-01" です。In this case, it is "2017-04-01".

リソース: ストレージ アカウントとコンテナーResources: Storage account and container

最初に作成されるリソースは、ストレージ アカウントと、メッセージのルーティング先となるコンテナーです。The first resource created is the storage account, along with the container to which messages are routed. コンテナーは、ストレージ アカウントに属するリソースです。The container is a resource under the storage account. ストレージ アカウントに対する dependsOn 句が存在するため、コンテナーの前にストレージ アカウントを作成しておく必要があります。It has a dependsOn clause for the storage account, requiring the storage account be created before the container.

このセクションは、次のような内容になっています。Here's what this section looks like:

{
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[variables('storageAccountName')]",
    "apiVersion": "2018-07-01",
    "location": "[parameters('location')]",
    "sku": {
        "name": "Standard_LRS",
        "tier": "Standard"
    },
    "kind": "Storage",
    "properties": {},
    "resources": [
        {
        "type": "blobServices/containers",
        "apiVersion": "2018-07-01",
        "name": "[concat('default/', parameters('storageContainerName'))]",
        "properties": {
            "publicAccess": "None"
            } ,
        "dependsOn": [
            "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ]
        }
    ]
}

リソース: Service Bus の名前空間とキューResources: Service Bus namespace and queue

2 番目に作成されるリソースは、Service Bus 名前空間と、メッセージのルーティング先となる Service Bus キューです。The second resource created is the Service Bus namespace, along with the Service Bus queue to which messages are routed. SKU は Standard に設定されます。The SKU is set to standard. API バージョンは変数から取得されます。The API version is retrieved from the variables. また、このセクションのデプロイ時に Service Bus 名前空間をアクティブ化するように設定されます (status:Active)。It is also set to activate the Service Bus namespace when it deploys this section (status:Active).

{
    "type": "Microsoft.ServiceBus/namespaces",
    "comments": "The Sku should be 'Standard' for this tutorial.",
    "sku": {
        "name": "Standard",
        "tier": "Standard"
    },
    "name": "[variables('service_bus_namespace')]",
    "apiVersion": "[variables('sbVersion')]",
    "location": "[parameters('location')]",
    "properties": {
        "provisioningState": "Succeeded",
        "metricId": "[concat('a4295411-5eff-4f81-b77e-276ab1ccda12:', variables('service_bus_namespace'))]",
        "serviceBusEndpoint": "[concat('https://', variables('service_bus_namespace'),'.servicebus.windows.net:443/')]",
        "status": "Active"
    },
    "dependsOn": []
}

このセクションでは、Service Bus キューが作成されます。This section creates the Service Bus queue. スクリプトのこの部分には、キューの前に名前空間が作成されるようにする dependsOn 句があります。This part of the script has a dependsOn clause that ensures the namespace is created before the queue.

{
    "type": "Microsoft.ServiceBus/namespaces/queues",
    "name": "[concat(variables('service_bus_namespace'), '/', variables('service_bus_queue'))]",
    "apiVersion": "[variables('sbVersion')]",
    "location": "[parameters('location')]",
    "scale": null,
    "properties": {},
    "dependsOn": [
        "[resourceId('Microsoft.ServiceBus/namespaces', variables('service_bus_namespace'))]"
    ]
}

リソース: IoT Hub とメッセージ ルーティングResources: Iot Hub and message routing

ストレージ アカウントと Service Bus キューが作成されたところで、それらにメッセージをルーティングする IoT ハブを作成します。Now that the storage account and Service Bus queue have been created, you create the IoT Hub that routes messages to them. RM テンプレートで dependsOn 句が使用されているため、Service Bus リソースとストレージ アカウントが作成される前にハブの作成が試みられることはありません。The RM template uses dependsOn clauses so it doesn't try to create the hub before the Service Bus resources and the storage account have been created.

以下に示すのは、IoT ハブ セクションの最初の部分です。Here's the first part of the IoT Hub section. テンプレートのこの部分に依存関係の設定があり、プロパティから始まります。This part of the template sets up the dependencies and starts with the properties.

{
    "apiVersion": "2018-04-01",
    "type": "Microsoft.Devices/IotHubs",
    "name": "[variables('IoTHubName')]",
    "location": "[parameters('location')]",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[resourceId('Microsoft.ServiceBus/namespaces', variables('service_bus_namespace'))]",
        "[resourceId('Microsoft.ServiceBus/namespaces/queues', variables('service_bus_namespace'), variables('service_bus_queue'))]"
    ],
    "properties": {
        "eventHubEndpoints": {}
            "events": {
                "retentionTimeInDays": 1,
                "partitionCount": "[parameters('d2c_partitions')]"
                }
            },

次は、IoT ハブのメッセージ ルーティング構成のセクションです。The next section is the section for the message routing configuration for the Iot Hub. 最初に、エンドポイントのセクションがあります。First is the section for the endpoints. テンプレートのこの部分で、Service Bus キューとストレージ アカウントのルーティング エンドポイントが設定されます (接続文字列もここに含まれます)。This part of the template sets up the routing endpoints for the Service Bus queue and the storage account, including the connection strings.

キューの接続文字列を作成するためには、queueAuthorizationRulesResourcedId が必要です。これはインラインで取得されます。To create the connection string for the queue, you need the queueAuthorizationRulesResourcedId, which is retrieved inline. ストレージ アカウントの接続文字列を作成するには、プライマリ ストレージ キーを取得し、それを接続文字列の書式で使用します。To create the connection string for the storage account, you retrieve the primary storage key and then use it in the format for the connection string.

また、BLOB の形式も、エンドポイントの構成で AVRO または JSON に設定します。The endpoint configuration is also where you set the blob format to AVRO or JSON.

注意

データは、既定の Apache Avro 形式または JSON (プレビュー) のいずれかで BLOB ストレージに書き込むことができます。The data can be written to blob storage in either the Apache Avro format, which is the default, or JSON (preview).

JSON 形式にエンコードする機能は、IoT Hub が提供されているすべてのリージョンでプレビュー段階です (米国東部、米国西部、西ヨーロッパを除く)。The capability to encode JSON format is in preview in all regions in which IoT Hub is available, except East US, West US and West Europe. エンコード形式は、BLOB ストレージ エンドポイントの構成時にのみ設定できます。The encoding format can be only set at the time the blob storage endpoint is configured. 既に設定されているエンドポイントの形式は変更できません。The format cannot be changed for an endpoint that has already been set up. JSON エンコードを使用する場合は、メッセージのシステム プロパティで contentType を JSON に設定し、contentEncoding を UTF-8 に設定する必要があります。When using JSON encoding, you must set the contentType to JSON and the contentEncoding to UTF-8 in the message system properties.

BLOB ストレージ エンドポイントの使用に関する詳細については、ストレージへのルーティングに関するガイダンスを参照してください。For more detailed information about using a blob storage endpoint, please see guidance on routing to storage.

"routing": {
   "endpoints": {
       "serviceBusQueues": [
       {
           "connectionString": "[Concat('Endpoint=sb://',variables('service_bus_namespace'),'.servicebus.windows.net/;SharedAccessKeyName=',parameters('AuthRules_sb_queue'),';SharedAccessKey=',listkeys(variables('queueAuthorizationRuleResourceId'),variables('sbVersion')).primaryKey,';EntityPath=',variables('service_bus_queue'))]",
           "name": "[parameters('service_bus_queue_endpoint')]",
           "subscriptionId": "[parameters('subscriptionId')]", 
           "resourceGroup": "[resourceGroup().Name]"
       }
       ],
       "serviceBusTopics": [],
       "eventHubs": [],
       "storageContainers": [
           {
               "connectionString": 
               "[Concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value)]",
               "containerName": "[parameters('storageContainerName')]",
               "fileNameFormat": "{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}",
               "batchFrequencyInSeconds": 100,
               "maxChunkSizeInBytes": 104857600,
               "encoding": "avro",
               "name": "[parameters('storage_endpoint')]",
               "subscriptionId": "[parameters('subscriptionId')]",
               "resourceGroup": "[resourceGroup().Name]"
           }
       ]
   },

次のセクションは、エンドポイントへのメッセージ ルートに関するものです。This next section is for the message routes to the endpoints. 設定はエンドポイントごとに 1 つあるので、Service Bus キュー用に 1 つ、ストレージ アカウント コンテナー用に 1 つ存在します。There is one set up for each endpoint, so there is one for the Service Bus queue and one for the storage account container.

ストレージにルーティングされるメッセージのクエリ条件は level="storage" で、Service Bus キューにルーティングされるメッセージのクエリ条件は level="critical" であることを思い出してください。Remember that the query condition for the messages being routed to storage is level="storage", and the query condition for the messages being routed to the Service Bus queue is level="critical".

"routes": [
    {
        "name": "contosoStorageRoute",
        "source": "DeviceMessages",
        "condition": "level=\"storage\"",
        "endpointNames": [
            "[parameters('storage_endpoint')]"
            ],
        "isEnabled": true
    },
    {
        "name": "contosoSBQueueRoute",
        "source": "DeviceMessages",
        "condition": "level=\"critical\"",
        "endpointNames": [
            "[parameters('service_bus_queue_endpoint')]"
            ],
        "isEnabled": true
    }
],

次の JSON は、IoT ハブ セクションの残りの部分です。ここにはハブの既定の情報と SKU が含まれています。This json shows the rest of the IoT Hub section, which contains default information and the SKU for the hub.

            "fallbackRoute": {
                "name": "$fallback",
                "source": "DeviceMessages",
                "condition": "true",
                "endpointNames": [
                    "events"
                ],
                "isEnabled": true
            }
        },
        "storageEndpoints": {
            "$default": {
                "sasTtlAsIso8601": "PT1H",
                "connectionString": "",
                "containerName": ""
            }
        },
        "messagingEndpoints": {
            "fileNotifications": {
                "lockDurationAsIso8601": "PT1M",
                "ttlAsIso8601": "PT1H",
                "maxDeliveryCount": 10
            }
        },
        "enableFileUploadNotifications": false,
        "cloudToDevice": {
            "maxDeliveryCount": 10,
            "defaultTtlAsIso8601": "PT1H",
            "feedback": {
                "lockDurationAsIso8601": "PT1M",
                "ttlAsIso8601": "PT1H",
                "maxDeliveryCount": 10
            }
        }
    },
    "sku": {
        "name": "[parameters('sku_name')]",
        "capacity": "[parameters('sku_units')]"
    }
}

リソース: Service Bus キューの承認規則Resources: Service Bus queue authorization rules

Service Bus キューの承認規則は、Service Bus キューの接続文字列を取得するために使用されます。The Service Bus queue authorization rule is used to retrieve the connection string for the Service Bus queue. Service Bus 名前空間と Service Bus キューよりも前に作成されることがないよう、dependsOn 句が使用されています。It uses a dependsOn clause to ensure it is not created before the Service Bus namespace and the Service Bus queue.

{
    "type": "Microsoft.ServiceBus/namespaces/queues/authorizationRules",
    "name": "[concat(variables('service_bus_namespace'), '/', variables('service_bus_queue'), '/', parameters('AuthRules_sb_queue'))]",
    "apiVersion": "[variables('sbVersion')]",
    "location": "[parameters('location')]",
    "scale": null,
    "properties": {
        "rights": [
            "Send"
        ]
    },
    "dependsOn": [
        "[resourceId('Microsoft.ServiceBus/namespaces', variables('service_bus_namespace'))]",
        "[resourceId('Microsoft.ServiceBus/namespaces/queues', variables('service_bus_namespace'), variables('service_bus_queue'))]"
    ]
},

リソース: コンシューマー グループResources: Consumer group

このセクションでは、このチュートリアルのパート 2 で Azure Stream Analytics によって使用される IoT Hub データのコンシューマー グループを作成します。In this section, you create a Consumer Group for the IoT Hub data to be used by the Azure Stream Analytics in the second part of this tutorial.

{
    "type": "Microsoft.Devices/IotHubs/eventHubEndpoints/ConsumerGroups",
    "name": "[concat(variables('iotHubName'), '/events/',parameters('consumer_group'))]",
    "apiVersion": "2018-04-01",
    "dependsOn": [
        "[concat('Microsoft.Devices/IotHubs/', variables('iotHubName'))]"
    ]
}

リソース: 出力Resources: Outputs

デプロイ スクリプトに値を返して表示したい場合は、出力セクションを使用します。If you want to send a value back to the deployment script to be displayed, you use an output section. テンプレートのこの部分は、Service Bus キューの接続文字列を返します。This part of the template returns the connection string for the Service Bus queue. 必ずしも値を返す必要はありません。これは呼び出し元のスクリプトに結果を返す方法の例として含まれています。Returning a value isn't required, it's included as an example of how to return results to the calling script.

"outputs": {
    "sbq_connectionString": {
      "type": "string",
      "value": "[Concat('Endpoint=sb://',variables('service_bus_namespace'),'.servicebus.windows.net/;SharedAccessKeyName=',parameters('AuthRules_sb_queue'),';SharedAccessKey=',listkeys(variables('queueAuthorizationRuleResourceId'),variables('sbVersion')).primaryKey,';EntityPath=',variables('service_bus_queue'))]"
    }
  }

RM テンプレートのデプロイDeploy the RM template

テンプレートを Azure にデプロイするには、テンプレートとパラメーター ファイルを Azure Cloud Shell にアップロードしたうえで、テンプレートをデプロイするためのスクリプトを実行します。To deploy the template to Azure, upload the template and the parameters file to Azure Cloud Shell, and then execute a script to deploy the template. Azure Cloud Shell を開いてサインインします。Open Azure Cloud Shell and sign in. この例では、PowerShell を使用します。This example uses PowerShell.

ファイルをアップロードするには、メニュー バーの [ファイルのアップロード/ダウンロード] アイコンを選択して、[アップロード] を選択します。To upload the files, select the Upload/Download files icon in the menu bar, then choose Upload.

[ファイルのアップロード/ダウンロード] が強調表示された Cloud Shell のメニュー バー

表示されたエクスプローラーを使用して、自分のローカル ディスク上のファイルを探して選択し、 [開く] を選択します。Use the File Explorer that pops up to find the files on your local disk and select them, then choose Open.

ファイルのアップロード後、次の画像のような結果のダイアログが表示されます。After the files are uploaded, a results dialog shows something like the following image.

[ファイルのアップロード/ダウンロード] が強調表示された Cloud Shell のメニュー バー

Cloud Shell インスタンスによって使用される共有にファイルがアップロードされます。The files are uploaded to the share used by your Cloud Shell instance.

デプロイを行うスクリプトを実行します。Run the script to perform the deployment. このスクリプトの最後の行では、返されるように設定された変数 (Service Bus キューの接続文字列) を取得します。The last line of this script retrieves the variable that was set up to be returned -- the Service Bus queue connection string.

このスクリプトは、次の変数を設定して使用します。The script sets and uses these variables:

$RGName は、テンプレートのデプロイ先となるリソース グループの名前です。$RGName is the resource group name to which to deploy the template. このフィールドは、テンプレートをデプロイする前に作成されます。This field is created before deploying the template.

$location は、テンプレートに使用される Azure の場所です ("westus" など)。$location is the Azure location to be used for the template, such as "westus".

deploymentname は、デプロイに割り当てる名前です。返される変数の値を取得する際に使用します。deploymentname is a name you assign to the deployment to retrieve the returning variable value.

PowerShell スクリプトを次に示します。Here's the PowerShell script. この PowerShell スクリプトをコピーして Cloud Shell ウィンドウに貼り付け、Enter キーを押して実行してください。Copy this PowerShell script and paste it into the Cloud Shell window, then hit Enter to run it.

$RGName="ContosoResources"
$location = "westus"
$deploymentname="contoso-routing"

# Remove the resource group if it already exists. 
#Remove-AzResourceGroup -name $RGName 
# Create the resource group.
New-AzResourceGroup -name $RGName -Location $location 

# Set a path to the parameter file. 
$parameterFile = "$HOME/template_iothub_parameters.json"
$templateFile = "$HOME/template_iothub.json"

# Deploy the template.
New-AzResourceGroupDeployment `
    -Name $deploymentname `
    -ResourceGroupName $RGName `
    -TemplateParameterFile $parameterFile `
    -TemplateFile $templateFile `
    -verbose

# Get the returning value of the connection string.
(Get-AzResourceGroupDeployment -ResourceGroupName $RGName -Name $deploymentname).Outputs.sbq_connectionString.value

スクリプト エラーが発生した場合は、スクリプトをローカルで編集し、それをもう一度 Cloud Shell にアップロードして、スクリプトを再実行できます。If you have script errors, you can edit the script locally, upload it again to the Cloud Shell, and run the script again. スクリプトが正常に実行されたら、次の手順に進みます。After the script finishes running successfully, continue to the next step.

シミュレートされたデバイスの作成Create simulated device

次に、デバイス ID を作成し、後で使用するのでそのキーを保存します。Next, create a device identity and save its key for later use. このデバイス ID は、IoT ハブにメッセージを送信するためにシミュレーション アプリケーションによって使われます。This device identity is used by the simulation application to send messages to the IoT hub. この機能は、PowerShell では利用できず、また、Azure Resource Manager テンプレートを使用している場合も利用できません。This capability is not available in PowerShell or when using an Azure Resource Manager template. 以降の手順で紹介する方法では、シミュレートされたデバイスを Azure portal を使用して作成しています。The following steps tell you how to create the simulated device using the Azure portal.

  1. Azure portal を開き、Azure アカウントにログインします。Open the Azure portal and log into your Azure account.

  2. [リソース グループ] を選択し、対象のリソース グループを選択します。Select Resource groups and then choose your resource group. このチュートリアルでは、ContosoResources を使います。This tutorial uses ContosoResources.

  3. リソースの一覧から目的の IoT ハブを選択します。In the list of resources, select your IoT hub. このチュートリアルでは、ContosoTestHub を使います。This tutorial uses ContosoTestHub. [ハブ] ウィンドウで [IoT デバイス] を選びます。Select IoT Devices from the Hub pane.

  4. [+ 追加] を選択します。Select + Add. [デバイスの追加] ウィンドウで、デバイス ID を入力します。On the Add Device pane, fill in the device ID. このチュートリアルでは、Contoso-Test-Device を使います。This tutorial uses Contoso-Test-Device. キーは空のままにし、 [キーの自動生成] をオンにします。Leave the keys empty, and check Auto Generate Keys. [デバイスを IoT Hub に接続] を有効にします。Make sure Connect device to IoT hub is enabled. [保存] を選択します。Select Save.

    [デバイスの追加] 画面

  5. デバイスが作成されたので、デバイスを選択して生成されたキーを表示します。Now that it's been created, select the device to see the generated keys. プライマリ キーの [コピー] アイコンを選択し、このチュートリアルのテスト フェーズのために、メモ帳などの場所に保存します。Select the Copy icon on the Primary key and save it somewhere such as Notepad for the testing phase of this tutorial.

    デバイスの詳細 (キーを含む)

ポータルでのメッセージ ルーティングの表示View message routing in the portal

エンドポイントとメッセージのルートを設定したら、その構成をポータルで確認できます。Now that your endpoints and message routes are set up, you can view their configuration in the portal. Azure portal にサインインし、 [リソース グループ] に移動します。Sign in to the Azure portal and go to Resource Groups. 次に、目的のリソース グループを選択し、該当するハブを選択します (このチュートリアルのハブ名は ContosoTestHub で始まります)。Next, select your resource group, then select your hub (the hub name starts with ContosoTestHub in this tutorial). [IoT Hub] ウィンドウが表示されます。You see the IoT Hub pane.

IoT Hub のプロパティ画面

[IoT Hub] のオプションで、 [メッセージ ルーティング] を選択します。In the options for the IoT Hub, select Message Routing. 設定したルートが正しく表示されます。The routes you have set up successfully are displayed.

設定したルート

[メッセージ ルーティング] 画面で [カスタム エンドポイント] を選択すると、そのルートに対して定義したエンドポイントが表示されます。On the Message routing screen, select Custom Endpoints to see the endpoints you have defined for the routes.

ルートに対して設定したエンドポイント

次のステップNext steps

すべてのリソースを設定してメッセージ ルートを構成したので、次のチュートリアルに進み、ルーティングされたメッセージに関する情報を処理して表示する方法を確認しましょう。Now that you have all of the resources set up and the message routes are configured, advance to the next tutorial to learn how to process and display the information about the routed messages.