IoT Hub でのマネージド ID のサポート

マネージド ID は、Microsoft Entra ID で自動的に管理される ID を安全な方法で Azure サービスに提供します。 これにより、開発者は、ID を指定して資格情報を管理する必要がなくなります。 マネージド ID には、システム割り当てとユーザー割り当ての 2 種類があります。 IoT Hub では両方がサポートされます。

IoT Hub では、メッセージ ルーティングファイルのアップロードデバイスの一括インポートおよびエクスポートなどの機能のために、IoT Hub ハブから他の Azure サービスへのエグレス接続にマネージド ID を使用できます。 この記事では、IoT ハブでさまざまな機能にシステム割り当ておよびユーザー割り当てのマネージド ID を使用する方法について説明します。

前提条件

システム割り当てマネージド ID

Azure portal でシステム割り当てマネージド ID を有効または無効にする

  1. Azure Portal にサインインし、IoT Hub に移動します。

  2. ナビゲーション メニューの [セキュリティの設定] セクションで [ID] を選択します。

  3. [システム割り当て済み] タブを選択します。

  4. システム割り当てマネージド ID の [状態][オン] または [オフ] に設定し、[保存] を選択します。

    Note

    使用中のシステム割り当てマネージド ID をオフにすることはできません。 機能を無効にする前に、システム割り当てマネージド ID 認証を使用しているカスタム エンドポイントがないことを確認してください。

    Screenshot showing where to turn on system-assigned managed identity for an IoT hub.

ARM テンプレートを使用してハブの作成時にシステム割り当てマネージド ID を有効にする

リソースのプロビジョニング時に IoT ハブでシステム割り当てマネージド ID を有効にするには、次の Azure Resource Manager (ARM) テンプレートを使用します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": 
    {
      "iotHubName": {
        "type": "string",
        "metadata": {
          "description": "Name of iothub resource"
        }
      },
      "skuName": {
        "type": "string",
        "defaultValue": "S1",
        "metadata": {
          "description": "SKU name of iothub resource, by default is Standard S1"
        }
      },
      "skuTier": {
        "type": "string",
        "defaultValue": "Standard",
        "metadata": {
          "description": "SKU tier of iothub resource, by default is Standard"
        }
      },
      "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
          "description": "Location of iothub resource. Please provide any of supported-regions of iothub"
        }
      }
    },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "createIotHub",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Devices/IotHubs",
              "apiVersion": "2021-03-31",
              "name": "[parameters('iotHubName')]",
              "location": "[parameters('location')]",
              "identity": {
                "type": "SystemAssigned"
              },
              "sku": {
              "name": "[parameters('skuName')]",
              "tier": "[parameters('skuTier')]",
              "capacity": 1
              }
            }
          ] 
        }
      }
    }
  ]
}

リソースの namelocationSKU.nameSKU.tier の値を置き換えた後、以下の Azure CLI を使用して、既存のリソース グループにリソースをデプロイすることができます。

az deployment group create --name <deployment-name> --resource-group <resource-group-name> --template-file <template-file.json> --parameters iotHubName=<valid-iothub-name> skuName=<sku-name> skuTier=<sku-tier> location=<any-of-supported-regions>

リソースが作成されたら、Azure CLI を使用して、ハブに割り当てられたシステム割り当てマネージド ID を取得できます。

az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>

ユーザー割り当てマネージド ID

このセクションでは、Azure portal を使用して、IoT ハブとの間でユーザー割り当てマネージド ID を追加および削除する方法について説明します。

  1. 最初に、スタンドアロン リソースとしてユーザー割り当てマネージド ID を作成する必要があります。 それを行うには、「ユーザー割り当てマネージド ID を作成する」の手順に従います。

  2. IoT ハブにアクセスし、IoT Hub ポータルで [ID] に移動します。

  3. [ユーザー割り当て] タブで、[ユーザー割り当てマネージド ID の関連付け] をクリックします。 ハブに追加するユーザー割り当てマネージド ID を選択し、[選択] をクリックします。

  4. IoT ハブからユーザー割り当て ID を削除できます。 削除するユーザー割り当て ID を選択し、[削除] ボタンをクリックします。 この削除では、ユーザー割り当て ID は IoT ハブから削除されるだけで、リソースとしては削除されないことに注意してください。 リソースとしてのユーザー割り当て ID を削除するには、「ユーザー割り当てマネージド ID を削除する」の手順に従います。

    Screenshot showing how to add user-assigned managed identity for an I O T hub.

ARM テンプレートを使用してハブの作成時にユーザー割り当てマネージド ID を有効にする

ユーザー割り当てマネージド ID を使用するハブを作成するために使用できるテンプレートの例を次に示します。 このテンプレートでは、作成された IoT ハブに割り当てられる、[iothub-name-provided]-identity という名前のユーザー割り当て ID が 1 つ作成されます。 テンプレートを変更して、必要に応じて複数のユーザー割り当て ID を追加できます。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "iotHubName": {
      "type": "string",
      "metadata": {
        "description": "Name of iothub resource"
      }
    },
  "skuName": {
    "type": "string",
    "defaultValue": "S1",
    "metadata": {
      "description": "SKU name of iothub resource, by default is Standard S1"
    }
  },
  "skuTier": {
    "type": "string",
    "defaultValue": "Standard",
    "metadata": {
      "description": "SKU tier of iothub resource, by default is Standard"
    }
  },
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]",
    "metadata": {
      "description": "Location of iothub resource. Please provide any of supported-regions of iothub"
    }
  }
},
  "variables": {
    "identityName": "[concat(parameters('iotHubName'), '-identity')]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "createIotHub",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
              "name": "[variables('identityName')]",
              "apiVersion": "2018-11-30",
              "location": "[resourceGroup().location]"
            },
            {
              "type": "Microsoft.Devices/IotHubs",
              "apiVersion": "2021-03-31",
              "name": "[parameters('iotHubName')]",
              "location": "[parameters('location')]",
              "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                  "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('identityName'))]": {}
                }
              },
              "sku": {
                "name": "[parameters('skuName')]",
                "tier": "[parameters('skuTier')]",
                "capacity": 1
              },
              "dependsOn": [
                "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',variables('identityName'))]"
              ]
            }
          ]
        }
      }
    }
  ]
}
az deployment group create --name <deployment-name> --resource-group <resource-group-name> --template-file <template-file.json> --parameters iotHubName=<valid-iothub-name> skuName=<sku-name> skuTier=<sku-tier> location=<any-of-supported-regions>

リソースが作成されたら、Azure CLI を使用して、ハブのユーザー割り当てマネージド ID を取得できます。

az resource show --resource-type Microsoft.Devices/IotHubs --name <iot-hub-resource-name> --resource-group <resource-group-name>

IoT Hub から他の Azure リソースへのエグレス接続

メッセージ ルーティングファイルのアップロードデバイスの一括インポートおよびエクスポートのために、IoT Hub ハブから他の Azure サービスへのエグレス接続にマネージド ID を使用できます。 顧客所有のエンドポイント (ストレージ アカウント、イベント ハブ、サービス バス エンドポイントなど) への IoT Hub エグレス接続ごとに、使用するマネージド ID を選択できます。

注意

システム割り当てマネージド ID を使用する場合にのみ、IoT Hub にプライベート リソースへのアクセスが許可されます。 ユーザー割り当てマネージド ID を使用する場合、接続を許可するには、そのようなプライベート アクセスに対するパブリック アクセスを有効にする必要があります。

マネージド ID を使用してメッセージ ルーティングを構成する

このセクションでは、例として、Event Hubs カスタム エンドポイントへのメッセージ ルーティングを使用します。 この例は、他のルーティング カスタム エンドポイントにも当てはまります。

  1. Azure portal でご使用のイベント ハブに移動し、マネージド ID に適切なアクセス権を割り当てます。

  2. [アクセス制御 (IAM)] を選択します。

  3. [追加] > [ロールの割り当ての追加] の順に選択します。

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

  4. [ロール] タブで、[Azure Event Hubs のデータ送信者] を選択します。

    注意

    ストレージ アカウントの場合は、ロールとして [ストレージ BLOB データ共同作成者] を選択します ( [共同作成者] または [ストレージ アカウント共同作成者] では "ありません")。 サービス バスの場合は、[Azure Service Bus のデータ送信者] を選択します。

    Screenshot showing Add role assignment page with Role tab selected.

  5. [メンバー] タブで、[マネージド ID] を選択し、[メンバーの選択] を選択します。

  6. ユーザー割り当てマネージド ID の場合は、サブスクリプションを選択し、[ユーザー割り当てマネージド ID] を選択してから、ユーザー割り当てマネージド ID を選択します。

  7. システム割り当てマネージド ID の場合は、サブスクリプションを選択し、[すべてのシステム割り当てマネージド ID] を選択してから、IoT Hub のリソース名を選択します。

  8. [確認と 割り当て] タブで、 [確認と割り当て] を選択して ロールを割り当てます。

    ロールの割り当ての詳細については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください

  9. VNet を介したカスタム エンドポイントへの接続を制限する必要がある場合は、信頼できる Microsoft ファースト パーティの例外を有効にして、ご使用の IoT ハブに特定のエンドポイントへのアクセス権を付与する必要があります。 たとえば、イベント ハブ カスタムエンド ポイントを追加する場合、イベント ハブの [ファイアウォールと仮想ネットワーク] タブに移動し、[選択したネットワークからのアクセスを許可する] オプションを有効にします。 [例外] 一覧で、[Allow trusted Microsoft services to access event hubs](信頼された Microsoft サービスによる Event Hubs に対するアクセスを許可します) のボックスをオンにします。 [保存] ボタンをクリックします。 これは、ストレージ アカウントとサービス バスにも当てはまります。 詳細については、IoT Hub での仮想ネットワークのサポートに関するページを参照してください。

    注意

    イベント ハブを IoT Hub のカスタム エンドポイントとして追加する前に、上記の手順を完了して、マネージ ID に適切なアクセスを割り当てる必要があります。 ロールの割り当てが反映されるまで数分お待ちください。

  10. 次に、IoT ハブに移動します。 ご使用のハブで、[メッセージ ルーティング] に移動し、[追加] を選択します。

  11. [エンドポイント] タブで、次の情報を指定して、イベント ハブのエンドポイントを作成します。

    パラメーター
    [エンドポイントの種類] [Event Hubs] を選択します。
    [エンドポイント名] 新しいエンドポイントの一意の名前を指定するか、[既存のものを選択] を選択して既存の Event Hubs エンドポイントを選択します。
    Event Hubs 名前空間 ドロップダウン メニューを使用して、サブスクリプション内の既存の Event Hubs 名前空間を選択します。
    イベント ハブのインスタンス ドロップダウン メニューを使用して、名前空間内の既存のイベント ハブを選択します。
    認証の種類 [ユーザー割り当て] を選択し、ドロップダウン メニューを使用して、イベント ハブで作成した [ユーザー割り当て ID] を選択します。

    Screenshot that shows event hub endpoint with user assigned authentication.

  12. [作成 + 次へ] を選択します。 ウィザードを続行して、このエンドポイントを指すルートを作成するか、ウィザードを閉じることができます。

既存のカスタム エンドポイントの認証の種類を変更できます。 エンドポイントを変更するには、次の手順を実行します。

  1. IoT ハブで、左側のナビゲーション ペインの [メッセージ ルーティング] を選択し、[カスタム エンドポイント] を選択します。

  2. 変更するカスタム エンドポイントのチェック ボックスをオンにし、[認証の種類の変更] を選択します。

  3. このエンドポイントの新しい認証の種類を選択し、[保存] をクリックします。

マネージド ID を使用してファイルのアップロードを構成する

IoT Hub のファイルのアップロード機能を使用すると、デバイスで顧客所有のストレージ アカウントにファイルをアップロードできます。 ファイルのアップロードを機能させるには、IoT Hub でストレージ アカウントに接続する必要があります。 メッセージ ルーティングと同様に、Azure Storage アカウントへの IoT Hub エグレス接続のための優先する認証の種類とマネージド ID を選択できます。

  1. Azure Portal のストレージ アカウントに移動します。

  2. [アクセス制御 (IAM)] を選択します。

  3. [追加] > [ロールの割り当ての追加] の順に選択します。

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

  4. [ロール] タブで [ストレージ BLOB データ共同作成者] を選択します。 ([共同作成者][ストレージ アカウント共同作成者] は選択しないでください。)

  5. [メンバー] タブで、[マネージド ID] を選択し、[メンバーの選択] を選択します。

  6. ユーザー割り当てマネージド ID の場合は、サブスクリプションを選択し、[ユーザー割り当てマネージド ID] を選択してから、ユーザー割り当てマネージド ID を選択します。

  7. システム割り当てマネージド ID の場合は、サブスクリプションを選択し、[すべてのシステム割り当てマネージド ID] を選択してから、IoT Hub のリソース名を選択します。

  8. [確認と 割り当て] タブで、 [確認と割り当て] を選択して ロールを割り当てます。

    ロールの割り当ての詳細については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください

    VNet を介したストレージ アカウントへの接続を制限する必要がある場合は、信頼できる Microsoft ファースト パーティの例外を有効にして、ご使用の IoT ハブにストレージ アカウントへのアクセス権を付与する必要があります。 ご使用のストレージ アカウントのリソース ページで、[ファイアウォールと仮想ネットワーク] タブに移動し、[選択したネットワークからのアクセスを許可する] オプションを有効にします。 [例外] 一覧で、[信頼された Microsoft サービスによるこのストレージ アカウントに対するアクセスを許可します] のボックスをオンにします。 [保存] ボタンをクリックします。 詳細については、IoT Hub での仮想ネットワークのサポートに関するページを参照してください。

    注意

    マネージド ID を使用するファイルのアップロードのためにストレージ アカウントを IoT Hub に保存する前に、上記の手順を完了して、マネージド ID に適切なアクセスを割り当てる必要があります。 ロールの割り当てが反映されるまで数分お待ちください。

  9. ご使用の IoT Hub のリソース ページで、[ファイルのアップロード] タブに移動します。

  10. 表示されたページで、BLOB ストレージで使用する予定のコンテナーを選択し、必要に応じて [ファイル通知の設定]、[SAS TTL]、[既定の TTL]、[最大配信回数] を構成します。 優先する認証の種類を選択し、[保存] をクリックします。 この手順でエラーが発生した場合は、一時的にストレージ アカウントを設定して、すべてのネットワークからのアクセスを許可してから、再試行してください。 ファイルのアップロードの構成が完了したら、ストレージ アカウントでファイアウォールを構成できます。

    Screen shot that shows file upload with msi.

    Note

    ファイルのアップロードのシナリオでは、ハブとデバイスの両方がストレージ アカウントに接続する必要があります。 上記の手順は、必要な認証の種類を使用して、IoT ハブをストレージ アカウントに接続するためのものです。 その場合も、SAS URI を使用してデバイスをストレージに接続する必要があります。 現在、SAS URI は接続文字列を使用して生成されます。 マネージド ID を使用した SAS URI の生成のサポートが近日中に追加される予定です。 ファイルのアップロードの手順に従ってください。

マネージド ID を使用してデバイスの一括インポートとエクスポートを構成する

IoT Hub では、顧客指定のストレージ BLOB 間で、一括してデバイスの情報をインポートおよびエクスポートする機能がサポートされています。 この機能では、IoT Hub からストレージ アカウントへの接続が必要です。

  1. Azure Portal のストレージ アカウントに移動します。

  2. [アクセス制御 (IAM)] を選択します。

  3. [追加] > [ロールの割り当ての追加] の順に選択します。

    Screenshot showing Access control (IAM) page with Add role assignment menu open.

  4. [ロール] タブで [ストレージ BLOB データ共同作成者] を選択します。 ([共同作成者][ストレージ アカウント共同作成者] は選択しないでください。)

  5. [メンバー] タブで、[マネージド ID] を選択し、[メンバーの選択] を選択します。

  6. ユーザー割り当てマネージド ID の場合は、サブスクリプションを選択し、[ユーザー割り当てマネージド ID] を選択してから、ユーザー割り当てマネージド ID を選択します。

  7. システム割り当てマネージド ID の場合は、サブスクリプションを選択し、[すべてのシステム割り当てマネージド ID] を選択してから、IoT Hub のリソース名を選択します。

  8. [確認と 割り当て] タブで、 [確認と割り当て] を選択して ロールを割り当てます。

    ロールの割り当ての詳細については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください

インポートおよびエクスポートのジョブに REST API または SDK を使用する

インポートおよびエクスポート ジョブを作成するために Azure IoT REST API を使用できるようになりました。 要求本文で次のプロパティを指定する必要があります。

  • storageAuthenticationType: 値を identityBased に設定します。
  • inputBlobContainerUri: このプロパティは、インポート ジョブでのみ設定します。
  • outputBlobContainerUri: このプロパティは、インポートとエクスポートの両方のジョブに対して設定します。
  • identity: 値を、使用するマネージド ID に設定します。

Azure IoT Hub SDK では、サービス クライアントのレジストリ マネージャーでもこの機能がサポートされます。 次のコード スニペットでは、C# SDK を使用してインポート ジョブまたはエクスポート ジョブを開始する方法を示しています。

C# のコード スニペット

    // Create an export job
 
    using RegistryManager srcRegistryManager = RegistryManager.CreateFromConnectionString(hubConnectionString);
 
    JobProperties jobProperties = JobProperties.CreateForExportJob(
        outputBlobContainerUri: blobContainerUri,
        excludeKeysInExport: false,
        storageAuthenticationType: StorageAuthenticationType.IdentityBased,
        identity: new ManagedIdentity
        {
            userAssignedIdentity = userDefinedManagedIdentityResourceId
        });
    // Create an import job
    
    using RegistryManager destRegistryManager = RegistryManager.CreateFromConnectionString(hubConnectionString);
 
    JobProperties jobProperties = JobProperties.CreateForImportJob(
        inputBlobContainerUri: blobContainerUri,
        outputBlobContainerUri: blobContainerUri,
        storageAuthenticationType: StorageAuthenticationType.IdentityBased,
        identity: new ManagedIdentity
        {
            userAssignedIdentity = userDefinedManagedIdentityResourceId
        });

Python のコード スニペット

# see note below
iothub_job_manager = IoTHubJobManager("<IoT Hub connection string>")

# Create an import job
result = iothub_job_manager.create_import_export_job(JobProperties(
    type="import",
    input_blob_container_uri="<input container URI>",
    output_blob_container_uri="<output container URI>",
    storage_authentication_type="identityBased",
    identity=ManagedIdentity(
        user_assigned_identity="<resource ID of user assigned managed identity>"
    )
))

# Create an export job
result = iothub_job_manager.create_import_export_job(JobProperties(
    type="export",
    output_blob_container_uri="<output container URI>",
    storage_authentication_type="identityBased",
    exclude_keys_in_export=True,
    identity=ManagedIdentity(
        user_assigned_identity="<resource ID of user assigned managed identity>"
    ) 
))

注意

  • storageAuthenticationTypeidentityBased に設定され、userAssignedIdentity プロパティが null ではない場合、ジョブでは、指定されたユーザー割り当てマネージド ID が使用されます。
  • IoT ハブが、userAssignedIdentity で指定されたユーザー割り当てマネージド ID を使用して構成されていない場合、ジョブは失敗します。
  • storageAuthenticationTypeidentityBased に設定され、userAssignedIdentity が null の場合、ジョブではシステム割り当て ID が使用されます。
  • IoT ハブが、ユーザー割り当てマネージド ID を使用して構成されていない場合、ジョブは失敗します。
  • storageAuthenticationTypeidentityBased に設定され、ハブでユーザー割り当てシステム割り当てのどちらのマネージド ID も構成されていない場合、ジョブは失敗します。

SDK のサンプル

次のステップ

IoT Hub の機能の詳細について、下記のリンク使用してください。