次の方法で共有


Azure IoT Hub を使用してデバイスからクラウドにファイルをアップロードする

この記事では、次の方法を示します。

  • Azure IoT のデバイスとサービスの SDK、および IoT Hub のファイル アップロード機能を使って、ファイルを Azure Blob Storage にアップロードします。
  • Azure IoT サービス SDK を使って、ファイルが正常にアップロードされたことを IoT Hub に通知し、IoT Hub からファイル アップロード通知を受け取るバックエンド サービスを作成します。

一部のシナリオでは、デバイスが送信するデータを、IoT Hub が受け付ける比較的小さな device-to-cloud メッセージに、簡単にマップすることはできません。 IoT Hub のファイル アップロード機能を使うと、大きいデータまたは複雑なデータをクラウドに移動できます。 次に例を示します。

  • ビデオ
  • イメージを含む大きなファイル
  • 高頻度でサンプリングされる振動データ
  • 何らかの形式の前処理済みデータ

これらのファイルは通常、Azure Data FactoryHadoop スタックなどのツールを使ってクラウドでバッチ処理されます。 デバイスからファイルをアップロードする必要がある場合も、IoT Hub のセキュリティと信頼性を利用できます。 この記事では、その方法について説明します。

この記事は、この記事内から参照される実行可能な SDK サンプルを補完するためのものです。

詳細については、以下を参照してください:

重要

X.509 証明機関 (CA) 認証を使用するデバイスのファイル アップロード機能はパブリック プレビュー段階であり、プレビュー モードを有効にする必要があります。 これは、Azure デバイス プロビジョニング サービスで x.509 拇印認証または x.509 証明書の構成証明を使用するデバイスで一般提供されています。 IoT Hub での X.509 認証の詳細については、「サポートされている X.509 証明書」を参照してください。

前提条件

  • IoT ハブ SDK の一部の呼び出しでは、IoT Hub のプライマリ接続文字列が必要であるため、接続文字列を記録しておきます。

  • 登録済みのデバイス。 SDK の一部の呼び出しでは、デバイスのプライマリ接続文字列が必要であるため、接続文字列を記録しておきます。

  • IoT Hub のサービス接続アクセス許可: ファイル アップロード通知メッセージを受け取るには、バックエンド サービスにサービス接続アクセス許可が必要です。 既定では、どの IoT Hub も、このアクセス許可を付与する service という名前の共有アクセス ポリシーがある状態で作成されます。 詳しくは、「IoT ハブに接続する」をご覧ください。

  • Azure ストレージ アカウントAzure Blob Storage コンテナーをリンクして、IoT ハブでファイルのアップロードを構成します。 これらの構成は、Azure portalAzure CLI、または Azure PowerShell を使って行うことができます。

概要

この使い方には、2 つのセクションが含まれています。

  • デバイス アプリケーションからファイルをアップロードする
  • バックエンド アプリケーションでファイル アップロード通知を受け取る

デバイス アプリケーションからファイルをアップロードする

このセクションでは、Azure IoT SDK for .NET の DeviceClient クラスを使って、デバイスから IoT ハブにファイルをアップロードする方法を説明します。

デバイスから IoT ハブへのファイルのアップロードは、次の手順で行います。

  1. IoT Hub に接続する
  2. IoT ハブから SAS URI を取得する
  3. ファイルを Azure Storage にアップロードする
  4. ファイルのアップロード状態を IoT ハブに通知する

デバイスを IoT Hub に接続する

デバイス アプリは、以下の方法を使用して IoT Hub で認証することができます。

  • X.509 証明書
  • 共有アクセス キー

X.509 証明書を使用して認証する

X.509 証明書を使用してデバイスを IoT Hub に接続するには:

  1. DeviceAuthenticationWithX509Certificate を使用して、デバイスと証明書の情報を含むオブジェクトを作成します。 DeviceAuthenticationWithX509Certificate は、DeviceClient.Create に対する 2 番目のパラメーターとして渡されます (手順 2)。

  2. DeviceClient.Create を使用することで、X.509 証明書を使用してデバイスを IoT Hub に接続します。

この例では、デバイスと証明書の情報は、DeviceClient.Create に渡される auth DeviceAuthenticationWithX509Certificate オブジェクトに設定されます。

この例では、分かりやすさのために、証明書入力パラメーターの値をローカル変数として表しています。 運用システムでは、機密性の高い入力パラメーターは環境変数やその他のより安全な保存場所に保存してください。 たとえば、Environment.GetEnvironmentVariable("HOSTNAME") を使用してホスト名環境変数を読み取ります。

RootCertPath = "~/certificates/certs/sensor-thl-001-device.cert.pem";
Intermediate1CertPath = "~/certificates/certs/sensor-thl-001-device.intermediate1.cert.pem";
Intermediate2CertPath = "~/certificates/certs/sensor-thl-001-device.intermediate2.cert.pem";
DevicePfxPath = "~/certificates/certs/sensor-thl-001-device.cert.pfx";
DevicePfxPassword = "1234";
DeviceName = "MyDevice";
HostName = "xxxxx.azure-devices.net";

var chainCerts = new X509Certificate2Collection();
chainCerts.Add(new X509Certificate2(RootCertPath));
chainCerts.Add(new X509Certificate2(Intermediate1CertPath));
chainCerts.Add(new X509Certificate2(Intermediate2CertPath));
using var deviceCert = new X509Certificate2(DevicePfxPath, DevicePfxPassword);
using var auth = new DeviceAuthenticationWithX509Certificate(DeviceName, deviceCert, chainCerts);

using var deviceClient = DeviceClient.Create(
    HostName,
    auth,
    TransportType.Amqp);

証明書認証の詳細については、以下を参照してください。

コード サンプル

デバイスの X.509 証明書認証の実際に動作するサンプルについては、以下を参照してください。

共有アクセス キーを使用して認証する

CreateFromConnectionString を呼び出して、デバイスに接続します。 デバイスのプライマリ接続文字列を渡します。

AMQP は既定のトランスポート プロトコルです。

static string connectionString = "{device primary connection string}";
deviceClient = DeviceClient.CreateFromConnectionString(connectionString);

IoT ハブから SAS URI を取得する

GetFileUploadSasUriAsync を呼び出して、ファイルのアップロードの詳細を取得します。 SAS URI は、次のステップでデバイスから Blob Storage にファイルをアップロードするために使われます。

const string filePath = "TestPayload.txt";
using var fileStreamSource = new FileStream(filePath, FileMode.Open);
var fileName = Path.GetFileName(fileStreamSource.Name);
var fileUploadSasUriRequest = new FileUploadSasUriRequest
{
    BlobName = fileName
};

FileUploadSasUriResponse sasUri = await _deviceClient.GetFileUploadSasUriAsync(fileUploadSasUriRequest, System.Threading.CancellationToken cancellationToken = default);
Uri uploadUri = sasUri.GetBlobUri();

ファイルを Azure Storage にアップロードする

ファイルを Azure Storage にアップロードするには:

  1. ファイル アップロード URI を渡して、blockBlobClient オブジェクトを作成します。

  2. UploadAsync メソッドを使い、SAS URI を渡して、ファイルを Blob Storage にアップロードします。 必要に応じて、BLOB アップロード オプションとキャンセル トークン パラメーターを追加できます。

Azure Blob クライアントは、ファイルを Azure Storage にアップロードするプロトコルとして、常に HTTPS を使います。

この例では、BlockBlobClient に SAS URI を渡して Azure Storage ブロック BLOB クライアントを作成し、ファイルをアップロードします。

var blockBlobClient = new BlockBlobClient(uploadUri);
await blockBlobClient.UploadAsync(fileStreamSource, null, null);

ファイルのアップロード状態を IoT ハブに通知する

CompleteFileUploadAsync を使い、FileUploadCompletionNotification オブジェクトを渡して、デバイス クライアントがアップロードを完了したことを IoT Hub に通知します。 IsSuccess フラグは、アップロードが成功したかどうかを示します。 通知が送信された後、IoT ハブはアップロードに関連付けられているリソース (SAS URI) を解放します。

ファイル アップロード通知が有効になっている場合、IoT ハブは、ファイル アップロード通知用に構成されているバックエンド サービスに、ファイル アップロード通知メッセージを送信します。

var successfulFileUploadCompletionNotification = new FileUploadCompletionNotification
{
    // Mandatory. Must be the same value as the correlation id returned in the sas uri response
    CorrelationId = sasUri.CorrelationId,

    // Mandatory. Will be present when service client receives this file upload notification
    IsSuccess = true,

    // Optional, user defined status code. Will be present when service client receives this file upload notification
    StatusCode = 200,

    // Optional, user-defined status description. Will be present when service client receives this file upload notification
    StatusDescription = "Success"
};

await _deviceClient.CompleteFileUploadAsync(successfulFileUploadCompletionNotification);

SDK のファイル アップロード サンプル

SDK には、このファイル アップロード サンプルが含まれています。

バックエンド アプリケーションでファイル アップロード通知を受け取る

IoT ハブからファイル アップロード通知メッセージを受け取るバックエンド サービスを作成できます。

ServiceClient クラスには、サービスがファイルアップロード通知を受け取るために使用できるメソッドが含まれています。

サービス NuGet パッケージを追加する

バックエンド サービス アプリケーションには、Microsoft.Azure.Devices NuGet パッケージが必要です。

IoT Hub に接続する

次の方法を使用して、バックエンド サービスを IoT Hub に接続できます。

  • 共有アクセス ポリシー
  • Microsoft Entra

重要

この記事では、Shared Access Signature を使用してサービスに接続する手順について説明しています。 この認証方法はテストと評価には便利ですが、サービスに対する認証方法としては、Microsoft Entra ID またはマネージド ID を使用する方が安全です。 詳細については、「セキュリティのベスト プラクティス」の「クラウドのセキュリティ」 を参照してください。>

共有アクセス ポリシーを使用して接続する

CreateFromConnectionString を使用して、バックエンド アプリケーションをデバイスに接続します。 アプリケーションにはサービス接続アクセス許可が必要です。 この共有アクセス ポリシー接続文字列を、fromConnectionString のパラメーターとして指定します。 共有アクセス ポリシーの詳細については、「Shared Access Signature を使用して IoT Hub へのアクセスを制御する」を参照してください。

次に例を示します。

using Microsoft.Azure.Devices;
static ServiceClient serviceClient;
static string connectionString = "{Shared access policy connection string}";
serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

Microsoft Entra を使用して接続する

Microsoft Entra を使用するバックエンド アプリは、IoT Hub に接続する前に、認証に成功してセキュリティ トークンの資格情報を取得する必要があります。 このトークンは、IoT Hub 接続メソッドに渡されます。 IoT Hub 用の Microsoft Entra の設定と使用に関する一般的な情報については、「Microsoft Entra ID を使用した IoT Hub へのアクセス制御」を参照してください。

Microsoft Entra アプリを構成する

優先する認証資格情報用に構成された Microsoft Entra アプリを設定する必要があります。 このアプリには、バックエンド アプリケーションで認証に使用されるクライアント シークレットなどのパラメーターが含まれています。 使用可能なアプリ認証構成は次のとおりです。

  • クライアント シークレット
  • [証明書]
  • フェデレーション ID 資格情報

Microsoft Entra アプリでは、実行される操作に応じて、特定のロールのアクセス許可が必要になる場合があります。 たとえば、IoT Hub デバイスとモジュール ツインへの読み取りと書き込みアクセスを有効にするには、IoT Hub ツイン共同作成者が必要です。 詳細については、「Azure RBAC ロールの割り当てを使用して IoT Hub へのアクセスを管理する」を参照してください。

Microsoft Entra アプリの設定の詳細については、「クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する」を参照してください。

DefaultAzureCredential を使用して認証する

Microsoft Entra を使用してバックエンド アプリケーションを認証する最も簡単な方法は、DefaultAzureCredential を使用することですが、特定の TokenCredential や削減された ChainedTokenCredential など、運用環境では別の方法を使用することをお勧めします。 わかりやすくするために、このセクションでは、 DefaultAzureCredential とクライアント シークレットを使用した認証について説明します。 DefaultAzureCredential を使用する長所と短所の詳細については、「DefaultAzureCredential の使用ガイダンス」を参照してください。

DefaultAzureCredential では、さまざまな認証メカニズムがサポートされ、実行されている環境に基づいて適切な資格情報の種類が決まります。 有効な資格情報が見つかるまで、複数の種類の資格情報の使用を順番に試みます。

Microsoft Entra には、次の NuGet パッケージと、対応する using ステートメントが必要です。

  • Azure.Core
  • Azure.Identity
using Azure.Core;
using Azure.Identity;

この例では、Microsoft Entra アプリ登録のクライアント シークレット、クライアント ID、テナント ID が環境変数に追加されます。 これらの環境変数は、アプリケーションを認証するために DefaultAzureCredential で使用されます。 Microsoft Entra 認証が成功した結果、セキュリティ トークン資格情報が IoT Hub 接続メソッドに渡されます。

string clientSecretValue = "xxxxxxxxxxxxxxx";
string clientID = "xxxxxxxxxxxxxx";
string tenantID = "xxxxxxxxxxxxx";

Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", clientSecretValue);
Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", clientID);
Environment.SetEnvironmentVariable("AZURE_TENANT_ID", tenantID);

TokenCredential tokenCredential = new DefaultAzureCredential();

結果として得られる TokenCredential は、Microsoft Entra 資格情報を受け入れる SDK クライアントの IoT Hub メソッドに接続するために渡すことができます。

次の例では、ServiceClient 接続オブジェクトを作成するために、TokenCredentialServiceClient.Create に渡されます。

string hostname = "xxxxxxxxxx.azure-devices.net";
using var serviceClient = ServiceClient.Create(hostname, tokenCredential, TransportType.Amqp);

次の例では、RegistryManager オブジェクトを作成するために、TokenCredentialRegistryManager.Create に渡されます。

string hostname = "xxxxxxxxxx.azure-devices.net";
registryManager = RegistryManager.Create(hostname, tokenCredential);
コード サンプル

Microsoft Entra サービス認証の作業サンプルについては、ロール ベースの認証のサンプルのページを参照してください。

ファイル アップロード通知を受け取る

ファイル アップロード通知を受け取るには:

  1. CancellationToken を作成します。
  2. GetFileNotificationReceiver を呼び出して、通知レシーバーを作成します。
  3. ReceiveAsync を含むループを使って、ファイル アップロード通知を待機します。

次に例を示します。

// Define the cancellation token
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;

// Create a notification receiver
var notificationReceiver = serviceClient.GetFileNotificationReceiver();
Console.WriteLine("\nReceiving file upload notification from service");

// Check for file upload notifications
while (true)
{
    var fileUploadNotification = await notificationReceiver.ReceiveAsync(token);
    if (fileUploadNotification == null) continue;
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("Received file upload notification: {0}", 
        string.Join(", ", fileUploadNotification.BlobName));
    Console.ResetColor();
    await notificationReceiver.CompleteAsync(fileUploadNotification);
}

SDK のファイルアップロード レシーバーのサンプル

SDK には、ファイル アップロード レシーバーのサンプルが含まれています。

概要

この使い方には、2 つのセクションが含まれています。

  • デバイス アプリケーションからファイルをアップロードする
  • バックエンド アプリケーションでファイル アップロード通知を受け取る

デバイス アプリケーションからファイルをアップロードする

このセクションでは、Azure IoT SDK for Java の DeviceClient クラスを使って、デバイスから IoT ハブにファイルをアップロードする方法を説明します。

デバイスから IoT ハブへのファイルのアップロードは、次の手順で行います。

  1. デバイスを IoT Hub に接続する
  2. IoT ハブから SAS URI を取得する
  3. ファイルを Azure Storage にアップロードする
  4. IoT ハブにファイル アップロード状態通知を送信する

デバイスを IoT Hub に接続する

デバイス アプリは、以下の方法を使用して IoT Hub で認証することができます。

  • X.509 証明書
  • 共有アクセス キー

X.509 証明書を使用して認証する

X.509 証明書を使用してデバイスを IoT Hub に接続するには:

  1. buildSSLContext を使用して SSLContext オブジェクトをビルドします。
  2. SSLContext 情報を ClientOptions オブジェクトに追加します。
  3. ClientOptions 情報を使用して DeviceClient を呼び出して、デバイスから IoT Hub への接続を作成します。

この例では、分かりやすさのために、証明書入力パラメーターの値をローカル変数として表しています。 運用システムでは、機密性の高い入力パラメーターは環境変数やその他のより安全な保存場所に保存してください。 たとえば、Environment.GetEnvironmentVariable("PUBLICKEY") を使用して公開キー証明書文字列の環境変数を読み取ります。

private static final String publicKeyCertificateString =
        "-----BEGIN CERTIFICATE-----\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "-----END CERTIFICATE-----\n";

//PEM encoded representation of the private key
private static final String privateKeyString =
        "-----BEGIN EC PRIVATE KEY-----\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "-----END EC PRIVATE KEY-----\n";

SSLContext sslContext = SSLContextBuilder.buildSSLContext(publicKeyCertificateString, privateKeyString);
ClientOptions clientOptions = ClientOptions.builder().sslContext(sslContext).build();
DeviceClient client = new DeviceClient(connString, protocol, clientOptions);

証明書認証の詳細については、以下を参照してください。

コード サンプル

デバイスの X.509 証明書認証の実際に動作するサンプルについては、以下を参照してください。

共有アクセス キーを使用して認証する

ファイル アップロード操作では常に HTTPS が使われますが、DeviceClient では、テレメトリ、デバイス メソッド、デバイス ツインなどの他のサービス用の IotHubClientProtocol を定義できます。

IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;

DeviceClient をインスタンス化し、デバイスのプライマリ接続文字列を使ってデバイスに接続します。

String connString = "{IoT hub connection string}";
DeviceClient client = new DeviceClient(connString, protocol);

IoT ハブから SAS URI を取得する

getFileUploadSasUri を呼び出して、FileUploadSasUriResponse オブジェクトを取得します。

FileUploadSasUriResponse には、これらのメソッドと戻り値が含まれます。 戻り値は、ファイル アップロード メソッドに渡すことができます。

メソッド 戻り値
getCorrelationId() 関連付け ID
getContainerName() コンテナー名
getBlobName() BLOB 名
getBlobUri() Blob URI

次に例を示します。

FileUploadSasUriResponse sasUriResponse = client.getFileUploadSasUri(new FileUploadSasUriRequest(file.getName()));

System.out.println("Successfully got SAS URI from IoT hub");
System.out.println("Correlation Id: " + sasUriResponse.getCorrelationId());
System.out.println("Container name: " + sasUriResponse.getContainerName());
System.out.println("Blob name: " + sasUriResponse.getBlobName());
System.out.println("Blob Uri: " + sasUriResponse.getBlobUri());

ファイルを Azure Storage にアップロードする

BLOB URI エンドポイントを BlobClientBuilder.buildclient に渡して、BlobClient オブジェクトを作成します。

BlobClient blobClient =
    new BlobClientBuilder()
        .endpoint(sasUriResponse.getBlobUri().toString())
        .buildClient();

uploadFromFile を呼び出して、ファイルを Blob Storage にアップロードします。

String fullFileName = "Path of the file to upload";
blobClient.uploadFromFile(fullFileName);

IoT ハブにファイル アップロード状態通知を送信する

ファイルのアップロードを試みた後で、アップロード状態通知を IoT ハブに送信します。

FileUploadCompletionNotification オブジェクトを作成します。 correlationIdisSuccess ファイル アップロード成功状態を渡します。 ファイルのアップロードが成功したときは isSuccesstrue 値を渡し、そうでないときは false を渡します。

ファイルのアップロードが失敗した場合でも、FileUploadCompletionNotification を呼び出す必要があります。 IoT ハブで同時にアクティブにできる SAS URI の数は固定です。 ファイルのアップロードが完了したら、他の SAS URI を生成できるように、SAS URI を解放する必要があります。 この API で解放されなかった SAS URI は、IoT ハブで SAS URI に対して構成されているが有効期間に基づいて、最終的に自動的に解放されます。

この例では、成功状態を渡しています。

FileUploadCompletionNotification completionNotification = new FileUploadCompletionNotification(sasUriResponse.getCorrelationId(), true);
client.completeFileUpload(completionNotification);

クライアントを閉じる

client リソースを解放します。

client.closeNow();

バックエンド アプリケーションを作成する

このセクションでは、バックエンド アプリケーションでファイル アップロード通知を受け取る方法について説明します。

ServiceClient クラスには、サービスがファイルアップロード通知を受け取るために使用できるメソッドが含まれています。

import ステートメントを追加する

次の import ステートメントを追加して、Azure IoT Java SDK と例外ハンドラーを使用します。

import com.microsoft.azure.sdk.iot.service.*;
import java.io.IOException;
import java.net.URISyntaxException;

IoT ハブに接続します

次の方法を使用して、バックエンド サービスを IoT Hub に接続できます。

  • 共有アクセス ポリシー
  • Microsoft Entra

重要

この記事では、Shared Access Signature を使用してサービスに接続する手順について説明しています。 この認証方法はテストと評価には便利ですが、サービスに対する認証方法としては、Microsoft Entra ID またはマネージド ID を使用する方が安全です。 詳細については、「セキュリティのベスト プラクティス」の「クラウドのセキュリティ」 を参照してください。>

共有アクセス ポリシーを使用して接続する

接続プロトコルを定義する

IotHubServiceClientProtocol を使用して、サービス クライアントが IoT Hub と通信するために使用するアプリケーション層プロトコルを定義します。

IotHubServiceClientProtocol は、AMQPS または AMQPS_WS 列挙型のみを受け入れます。

private static final IotHubServiceClientProtocol protocol =    
    IotHubServiceClientProtocol.AMQPS;
ServiceClient オブジェクトを作成する

IoT Hub 接続文字列とプロトコルを指定して、ServiceClient オブジェクトを作成します。

デバイス上のファイルを IoT Hub にアップロードするには、サービスにサービス接続アクセス許可が必要です。 既定では、どの IoT Hub も、このアクセス許可を付与する service という名前の共有アクセス ポリシーがある状態で作成されます。

ServiceClient コンストラクターに対するパラメーターとして、サービス共有アクセス ポリシーを指定します。 共有アクセス ポリシーの詳細については、「Shared Access Signature を使用して IoT Hub へのアクセスを制御する」を参照してください。

String iotHubConnectionString = "HostName=xxxxx.azure-devices.net;SharedAccessKeyName=service;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxx";
private static final ServiceClient serviceClient (iotHubConnectionString, protocol);
アプリケーションと IoT Hub の間の接続を開く

AMQP センダー接続を開きます。 このメソッドは、アプリケーションと IoT Hub の間の接続を作成します。

serviceClient.open();

Microsoft Entra を使用して接続する

Microsoft Entra を使用するバックエンド アプリは、IoT Hub に接続する前に、認証に成功してセキュリティ トークンの資格情報を取得する必要があります。 このトークンは、IoT Hub 接続メソッドに渡されます。 IoT Hub 用の Microsoft Entra の設定と使用に関する一般的な情報については、「Microsoft Entra ID を使用した IoT Hub へのアクセス制御」を参照してください。

Java SDK 認証の概要については、「Java と Azure ID を使用した Azure 認証」を参照してください。

わかりやすくするために、このセクションでは、クライアント シークレットを使用した認証について説明します。

Microsoft Entra アプリを構成する

優先する認証資格情報用に構成された Microsoft Entra アプリを設定する必要があります。 このアプリには、バックエンド アプリケーションで認証に使用されるクライアント シークレットなどのパラメーターが含まれています。 使用可能なアプリ認証構成は次のとおりです。

  • クライアント シークレット
  • [証明書]
  • フェデレーション ID 資格情報

Microsoft Entra アプリでは、実行される操作に応じて、特定のロールのアクセス許可が必要になる場合があります。 たとえば、IoT Hub デバイスとモジュール ツインへの読み取りと書き込みアクセスを有効にするには、IoT Hub ツイン共同作成者が必要です。 詳細については、「Azure RBAC ロールの割り当てを使用して IoT Hub へのアクセスを管理する」を参照してください。

Microsoft Entra アプリの設定の詳細については、「クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する」を参照してください。

DefaultAzureCredential を使用して認証する

Microsoft Entra を使用してバックエンド アプリケーションを認証する最も簡単な方法は、DefaultAzureCredential を使用することですが、特定の TokenCredential や削減された ChainedTokenCredential など、運用環境では別の方法を使用することをお勧めします。 DefaultAzureCredential を使用する長所と短所の詳細については、「Java 用 Azure ID クライアント ライブラリの資格情報チェーン」を参照してください。

DefaultAzureCredential では、さまざまな認証メカニズムがサポートされ、実行されている環境に基づいて適切な資格情報の種類が決まります。 有効な資格情報が見つかるまで、複数の種類の資格情報の使用を順番に試みます。

Microsoft Entra アプリの資格情報は、DefaultAzureCredentialBuilder を使用して認証できます。 クライアント シークレット tenantID、clientID、クライアント シークレットの値などの接続パラメーターを環境変数として保存します。 TokenCredential が作成されたら、それを 'credential' パラメーターとして ServiceClient またはその他のビルダーに渡します。

この例では、DefaultAzureCredentialBuilder は、DefaultAzureCredential で説明されている一覧から接続の認証を試みます。 Microsoft Entra 認証が成功した結果として、セキュリティ トークン資格情報が ServiceClient などのコンストラクターに渡されます。

TokenCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();
ClientSecretCredentialBuilder を使用して認証する

クライアント シークレット情報を使用して資格情報を作成するには、ClientSecretCredentialBuilder を使用できます。 成功した場合、このメソッドは ServiceClient またはその他のビルダーに 'credential' パラメーターとして渡すことができる TokenCredential を返します。

この例では、Microsoft Entra アプリ登録のクライアント シークレット、クライアント ID、テナント ID の値が環境変数に追加されました。 これらの環境変数は、資格情報を構築するために ClientSecretCredentialBuilder によって使用されます。

string clientSecretValue = System.getenv("AZURE_CLIENT_SECRET");
string clientID = System.getenv("AZURE_CLIENT_ID");
string tenantID = System.getenv("AZURE_TENANT_ID");

TokenCredential credential =
     new ClientSecretCredentialBuilder()
          .tenantId(tenantID)
          .clientId(clientID)
          .clientSecret(clientSecretValue)
          .build();
その他の認証クラス

Java SDK には、Microsoft Entra でバックエンド アプリを認証する次のクラスも含まれています。

コード サンプル

Microsoft Entra サービス認証の作業サンプルについては、「ロール ベースの認証のサンプルのページを参照してください。

ファイル アップロードの状態を調べる

ファイル アップロードの状態を調べるには:

  1. getFileUploadNotificationReceiver オブジェクトを作成します。
  2. open を使って IoT ハブに接続します。
  3. receive を呼び出して、ファイル アップロードの状態を調べます。 このメソッドは、fileUploadNotification オブジェクトを返します。 アップロード通知を受け取った場合は、fileUploadNotification メソッドを使ってアップロード状態フィールドを表示できます。

次に例を示します。

FileUploadNotificationReceiver receiver = serviceClient.getFileUploadNotificationReceiver();
receiver.open();
FileUploadNotification fileUploadNotification = receiver.receive(2000);

if (fileUploadNotification != null)
{
    System.out.println("File Upload notification received");
    System.out.println("Device Id : " + fileUploadNotification.getDeviceId());
    System.out.println("Blob Uri: " + fileUploadNotification.getBlobUri());
    System.out.println("Blob Name: " + fileUploadNotification.getBlobName());
    System.out.println("Last Updated : " + fileUploadNotification.getLastUpdatedTimeDate());
    System.out.println("Blob Size (Bytes): " + fileUploadNotification.getBlobSizeInBytes());
    System.out.println("Enqueued Time: " + fileUploadNotification.getEnqueuedTimeUtcDate());
}
else
{
    System.out.println("No file upload notification");
}

// Close the receiver object
receiver.close();

SDK のファイル アップロード サンプル

Java でのファイル アップロードについては 2つのサンプルがあります。

パッケージをインストールする

関連するコードを呼び出す前に、azure-iot-device ライブラリをインストールする必要があります。

pip install azure-iot-device

azure.storage.blob パッケージは、ファイルのアップロードを実行するために使われます。

pip install azure.storage.blob

デバイス アプリケーションからファイルをアップロードする

このセクションでは、Azure IoT SDK for Python の IoTHubDeviceClient クラスを使って、デバイスから IoT ハブにファイルをアップロードする方法を説明します。

ライブラリをインポートする

import os
from azure.iot.device import IoTHubDeviceClient
from azure.core.exceptions import AzureError
from azure.storage.blob import BlobClient

デバイスを IoT Hub に接続する

デバイス アプリは、以下の方法を使用して IoT Hub で認証することができます。

  • X.509 証明書
  • 共有アクセス キー

X.509 証明書を使用して認証する

X.509 証明書を使用してデバイスを IoT Hub に接続するには:

  1. create_from_x509_certificate を使用して X.509 証明書パラメーターを追加します
  2. connect を呼び出して、デバイス クライアントを接続します

この例では、分かりやすさのために、証明書入力パラメーターの値をローカル変数として表しています。 運用システムでは、機密性の高い入力パラメーターは環境変数やその他のより安全な保存場所に保存してください。 たとえば、os.getenv("HOSTNAME") を使用してホスト名環境変数を読み取ります。

# The Azure IoT hub name
hostname = "xxxxx.azure-devices.net"

# The device that has been created on the portal using X509 CA signing or self-signing capabilities
device_id = "MyDevice"

# The X.509 certificate file name
cert_file = "~/certificates/certs/sensor-thl-001-device.cert.pfx"
key_file = "~/certificates/certs/sensor-thl-001-device.cert.key"
# The optional certificate pass phrase
pass_phrase = "1234"

x509 = X509(
    cert_file,
    key_file,
    pass_phrase,
)

# The client object is used to interact with your Azure IoT hub.
device_client = IoTHubDeviceClient.create_from_x509_certificate(
    hostname=hostname, device_id=device_id, x509=x509
)

# Connect to IoT Hub
await device_client.connect()

証明書認証の詳細については、以下を参照してください。

コード サンプル

デバイスの X.509 証明書認証の実際に動作するサンプルについては、非同期ハブ シナリオでファイル名が x509 で終わっている例を参照してください。

共有アクセス キーを使用して認証する

デバイスを IoT Hub に接続するには:

  1. create_from_connection_string を呼び出して、デバイスのプライマリ接続文字列を追加します。
  2. connect を呼び出して、デバイス クライアントを接続します。

次に例を示します。

# Add your IoT hub primary connection string
CONNECTION_STRING = "{Device primary connection string}"
device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)

# Connect the client
device_client.connect()

Blob Storage の情報を取得する

get_storage_info_for_blob を呼び出して、リンクされた Azure ストレージ アカウントに関する情報を IoT ハブから取得します。 この情報には、ホスト名、コンテナー名、BLOB 名、および SAS トークンが含まれます。 get_storage_info_for_blob メソッドは、notify_blob_upload_status メソッドで使われる correlation_id も返します。 correlation_id は、ユーザーが作業している BLOB を IoT Hub でマークする方法です。

# Get the storage info for the blob
PATH_TO_FILE = "{Full path to local file}"
blob_name = os.path.basename(PATH_TO_FILE)
blob_info = device_client.get_storage_info_for_blob(blob_name)

Blob Storage にファイルをアップロードする

Blob Storage にファイルをアップロードするには:

  1. from_blob_url を使って、BLOB URL から BlobClient オブジェクトを作成します。
  2. upload_blob を呼び出して、ファイルを Blob Storage にアップロードします。

この例では、blob_info 構造体を解析して、BlobClient の初期化に使う URL を作成します。 次に、upload_blob を呼び出して、Blob Storage にファイルをアップロードします。

try:
    sas_url = "https://{}/{}/{}{}".format(
        blob_info["hostName"],
        blob_info["containerName"],
        blob_info["blobName"],
        blob_info["sasToken"]
    )

    print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))

    # Upload the specified file
    with BlobClient.from_blob_url(sas_url) as blob_client:
        with open(file_name, "rb") as f:
            result = blob_client.upload_blob(f, overwrite=True)
            return (True, result)

except FileNotFoundError as ex:
    # catch file not found and add an HTTP status code to return in notification to IoT hub
    ex.status_code = 404
    return (False, ex)

except AzureError as ex:
    # catch Azure errors that might result from the upload operation
    return (False, ex)

アップロードの状態を IoT ハブに通知する

notify_blob_upload_status を使って、Blob Storage の操作の状態を IoT ハブに通知します。 get_storage_info_for_blob メソッドで取得した correlation_id を渡します。 correlation_id は、ファイル アップロード タスクの状態に関する通知をリッスンしている可能性があるサービスに通知するために、IoT ハブによって使われます。

この例では、ファイルのアップロードが成功したことを IoT ハブに通知します。

device_client.notify_blob_upload_status(storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)

デバイス クライアントをシャットダウンする

クライアントをシャットダウンします。 このメソッドを呼び出すと、それ以降のクライアント呼び出しの試みでは、ClientError が発生します。

device_client.shutdown()

SDK のファイル アップロード サンプル

この SDK には、ファイル アップロードのサンプルが 2 つ含まれています。

概要

この記事では、Azure IoT SDK for Node.js を使用して、ファイルをアップロードするデバイス アプリを作成し、バックエンド サービス アプリケーションでファイル アップロード通知を受け取る方法について説明します。

デバイス アプリケーションを作成する

このセクションでは、Azure IoT SDK for Node.js の azure-iot-device パッケージを使って、デバイスから IoT ハブにファイルをアップロードする方法を説明します。

SDK パッケージをインストールする

このコマンドを実行して、azure-iot-device デバイス SDK、azure-iot-device-mqtt@azure/storage-blob パッケージを開発用コンピューターにインストールします。

npm install azure-iot-device azure-iot-device-mqtt @azure/storage-blob --save

azure-iot-device パッケージには、IoT デバイスとやり取りするオブジェクトが含まれています。

デバイスから IoT ハブへのファイルのアップロードは、次の手順で行います。

  1. デバイスを IoT Hub に接続する
  2. IoT Hub から BLOB Shared Access Signature (SAS) トークンを取得する
  3. ファイルを Azure Storage にアップロードする
  4. IoT ハブにファイル アップロード状態通知を送信する

モジュールを作成する

インストールしたパッケージを使って、クライアント、プロトコル、エラー、パスの各モジュールを作成します。

const Protocol = require('azure-iot-device-mqtt').Mqtt;
const errors = require('azure-iot-common').errors;
const path = require('path');

デバイスを IoT Hub に接続する

デバイス アプリは、以下の方法を使用して IoT Hub で認証することができます。

  • X.509 証明書
  • 共有アクセス キー

X.509 証明書を使用して認証する

X.509 証明書は、デバイスから IoT Hub への接続トランスポートにアタッチされます。

X.509 証明書を使用するデバイスから IoT Hub への接続を構成するには:

  1. fromConnectionString を呼び出して、デバイス接続文字列とトランスポートの種類を追加します。 デバイス接続文字列に x509=true を追加して、証明書が DeviceClientOptions に追加されていることを示します。 (例: HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true)。
  2. 証明書の詳細を使用して JSON 変数を構成し、それを DeviceClientOptions に渡します。
  3. setOptions を呼び出して、X.509 証明書とキー (および必要に応じてパスフレーズ) をクライアント トランスポートに追加します。
  4. open を呼び出して、デバイスから IoT Hub への接続を開きます。

次の例は、JSON 変数内の証明書構成情報を示しています。 証明書構成に関する optionssetOptions に渡され、open を使用して接続が開かれます。

var options = {
   cert: myX509Certificate,
   key: myX509Key,
   passphrase: passphrase,
   http: {
     receivePolicy: {
       interval: 10
     }
   }
 }
 client.setOptions(options, callback);
 client.open(connectCallback);

証明書認証の詳細については、以下を参照してください。

コード サンプル

デバイスの X.509 証明書認証の実際に動作するサンプルについては、「シンプルなデバイス X.509 のサンプル」を参照してください。

共有アクセス キーを使用して認証する

トランスポート プロトコルを選択する

Client オブジェクトでは、次のプロトコルがサポートされます。

  • Amqp
  • Http - Http を使用する場合、Client インスタンスは IoT Hub からのメッセージを頻繁にはチェックしません (少なくとも 25 分ごと)。
  • Mqtt
  • MqttWs
  • AmqpWs

必要なトランスポート プロトコルを開発マシンにインストールします。

たとえば、次のコマンドを使用すると、Amqp プロトコルをインストールできます。

npm install azure-iot-device-amqp --save

MQTT、AMQP、および HTTPS のサポートの相違点の詳細については、「cloud-to-device 通信に関するガイダンス」と「通信プロトコルの選択」を参照してください。

クライアント オブジェクトの作成

インストールされたパッケージを使用して Client オブジェクトを作成します。

次に例を示します。

const Client = require('azure-iot-device').Client;
プロトコル オブジェクトを作成する

インストールされたトランスポート パッケージを使用して Protocol オブジェクトを作成します。

この例では、AMQP プロトコルを割り当てます。

const Protocol = require('azure-iot-device-amqp').Amqp;
デバイスの接続文字列とトランスポート プロトコルを追加する

fromConnectionString を呼び出して、デバイス接続パラメーターを指定します。

  • connStr - デバイスの接続文字列。
  • transportCtor - トランスポート プロトコル。

この例では、Amqp トランスポート プロトコルを使用します。

const deviceConnectionString = "{IoT hub device connection string}"
const Protocol = require('azure-iot-device-mqtt').Amqp;
let client = Client.fromConnectionString(deviceConnectionString, Protocol);
IoT Hub への接続を開く

open メソッドを使用して、IoT デバイスと IoT Hub の間の接続を開きます。

次に例を示します。

client.open(function(err) {
  if (err) {
    console.error('error connecting to hub: ' + err);
    process.exit(1);
  }
})

IoT Hub から SAS トークンを取得する

getBlobSharedAccessSignature を使って、リンクされたストレージ アカウントの SAS トークンを IoT ハブから取得します。

次に例を示します。

// make sure you set these environment variables prior to running the sample.
const localFilePath = process.env.PATH_TO_FILE;
const storageBlobName = path.basename(localFilePath);
const blobInfo = await client.getBlobSharedAccessSignature(storageBlobName);
if (!blobInfo) {
throw new errors.ArgumentError('Invalid upload parameters');
}

ファイルを IoT ハブにアップロードする

デバイスから IoT ハブにファイルをアップロードするには:

  1. ストリーム パイプラインを作成する
  2. BLOB URL を構築する
  3. Blob Storage にファイルをアップロードするための BlockBlobClient を作成する
  4. uploadFile を呼び出して、ファイルを Blob Storage にアップロードする
  5. notifyBlobUploadStatus を呼び出して、アップロードが成功または失敗したことを IoT ハブに通知する

次に例を示します。

// Open the pipeline
const pipeline = newPipeline(new AnonymousCredential(), {
retryOptions: { maxTries: 4 },
telemetry: { value: 'HighLevelSample V1.0.0' }, // Customized telemetry string
keepAliveOptions: { enable: false }
});

// Construct the blob URL
const { hostName, containerName, blobName, sasToken } = blobInfo;
const blobUrl = `https://${hostName}/${containerName}/${blobName}${sasToken}`;

// Create the BlockBlobClient for file upload to Blob Storage
const blobClient = new BlockBlobClient(blobUrl, pipeline);

// Setup blank status notification arguments to be filled in on success/failure
let isSuccess;
let statusCode;
let statusDescription;

const uploadStatus = await blobClient.uploadFile(localFilePath);
console.log('uploadStreamToBlockBlob success');

  try {
    const uploadStatus = await blobClient.uploadFile(localFilePath);
    console.log('uploadStreamToBlockBlob success');

    // Save successful status notification arguments
    isSuccess = true;
    statusCode = uploadStatus._response.status;
    statusDescription = uploadStatus._response.bodyAsText;

    // Notify IoT hub of upload to blob status (success)
    console.log('notifyBlobUploadStatus success');
  }
  catch (err) {
    isSuccess = false;
    statusCode = err.code;
    statusDescription = err.message;

    console.log('notifyBlobUploadStatus failed');
    console.log(err);
  }

// Send file upload status notification to IoT hub
await client.notifyBlobUploadStatus(blobInfo.correlationId, isSuccess, statusCode, statusDescription);

ローカル ファイルを BLOB ストレージにアップロードする

ローカル ファイルをコンピューターから BLOB ストレージにアップロードできます

const deviceClient = Client.fromConnectionString(deviceConnectionString, Protocol);
uploadToBlob(localFilePath, deviceClient)
  .catch((err) => {
    console.log(err);
  })
  .finally(() => {
    process.exit();
  });

SDK のファイル アップロード サンプル

この SDK には、BLOB への高度なアップロードのサンプルが含まれています。

バックエンド アプリケーションを作成する

このセクションでは、バックエンド アプリケーションでファイル アップロード通知を受け取る方法について説明します。

ServiceClient クラスには、サービスがファイルアップロード通知を受け取るために使用できるメソッドが含まれています。

サービス SDK パッケージをインストールする

次のコマンドを実行して、開発マシンに azure-iothub をインストールします。

npm install azure-iothub --save

IoT Hub に接続する

次の方法を使用して、バックエンド サービスを IoT Hub に接続できます。

  • 共有アクセス ポリシー
  • Microsoft Entra

重要

この記事では、Shared Access Signature を使用してサービスに接続する手順について説明しています。 この認証方法はテストと評価には便利ですが、サービスに対する認証方法としては、Microsoft Entra ID またはマネージド ID を使用する方が安全です。 詳細については、「セキュリティのベスト プラクティス」の「クラウドのセキュリティ」 を参照してください。>

共有アクセス ポリシーを使用して接続する

fromConnectionString を使用して IoT Hub に接続します。

デバイスからファイルをアップロードするには、サービスにサービス接続アクセス許可が必要です。 既定では、どの IoT Hub も、このアクセス許可を付与する service という名前の共有アクセス ポリシーがある状態で作成されます。

CreateFromConnectionString に対するパラメーターとして、サービス共有アクセス ポリシー接続文字列を指定します。 共有アクセス ポリシーの詳細については、「Shared Access Signature を使用して IoT Hub へのアクセスを制御する」を参照してください。

var Client = require('azure-iothub').Client;
var connectionString = '{IoT hub shared access policy connection string}';
var client = Client.fromConnectionString(connectionString);

Microsoft Entra を使用して接続する

Microsoft Entra を使用するバックエンド アプリは、IoT Hub に接続する前に、認証に成功してセキュリティ トークンの資格情報を取得する必要があります。 このトークンは、IoT Hub 接続メソッドに渡されます。 IoT Hub 用の Microsoft Entra の設定と使用に関する一般的な情報については、「Microsoft Entra ID を使用した IoT Hub へのアクセス制御」を参照してください。

Node.js SDK 認証の概要については、次を参照してください。

Microsoft Entra アプリを構成する

優先する認証資格情報用に構成された Microsoft Entra アプリを設定する必要があります。 このアプリには、バックエンド アプリケーションで認証に使用されるクライアント シークレットなどのパラメーターが含まれています。 使用可能なアプリ認証構成は次のとおりです。

  • クライアント シークレット
  • [証明書]
  • フェデレーション ID 資格情報

Microsoft Entra アプリでは、実行される操作に応じて、特定のロールのアクセス許可が必要になる場合があります。 たとえば、IoT Hub デバイスとモジュール ツインへの読み取りと書き込みアクセスを有効にするには、IoT Hub ツイン共同作成者が必要です。 詳細については、「Azure RBAC ロールの割り当てを使用して IoT Hub へのアクセスを管理する」を参照してください。

Microsoft Entra アプリの設定の詳細については、「クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する」を参照してください。

DefaultAzureCredential を使用して認証する

Microsoft Entra を使用してバックエンド アプリケーションを認証する最も簡単な方法は、DefaultAzureCredential を使用することですが、特定の TokenCredential や削減された ChainedTokenCredential など、運用環境では別の方法を使用することをお勧めします。 わかりやすくするために、このセクションでは、 DefaultAzureCredential とクライアント シークレットを使用した認証について説明します。 DefaultAzureCredential を使用する長所と短所の詳細については、「JavaScript 用 Azure ID クライアント ライブラリの資格情報チェーン」を参照してください

DefaultAzureCredential では、さまざまな認証メカニズムがサポートされ、実行されている環境に基づいて適切な資格情報の種類が決まります。 有効な資格情報が見つかるまで、複数の種類の資格情報の使用を順番に試みます。

Microsoft Entra には、次のパッケージが必要です。

npm install --save @azure/identity

この例では、Microsoft Entra アプリ登録のクライアント シークレット、クライアント ID、テナント ID が環境変数に追加されました。 これらの環境変数は、アプリケーションを認証するために DefaultAzureCredential で使用されます。 Microsoft Entra 認証が成功した結果、セキュリティ トークン資格情報が IoT Hub 接続メソッドに渡されます。

import { DefaultAzureCredential } from "@azure/identity";

// Azure SDK clients accept the credential as a parameter
const credential = new DefaultAzureCredential();

結果として得られる資格情報トークンは、Microsoft Entra 資格情報を受け入れる SDK クライアントの IoT Hub に接続するために fromTokenCredential に渡すことができます。

fromTokenCredential には、次の 2 つのパラメーターが必要です。

  • Azure サービス URL - Azure サービスの URL は、https:// プレフィックスのない {Your Entra domain URL}.azure-devices.net 形式にする必要があります。 たとえば、MyAzureDomain.azure-devices.net のようにします。
  • Azure 資格情報トークン

次の例では、Azure 資格情報は DefaultAzureCredential を使用して取得されます。 その後、Azure ドメインの URL と資格情報が Registry.fromTokenCredential に指定され、IoT Hub への接続が作成されます。

const { DefaultAzureCredential } = require("@azure/identity");

let Registry = require('azure-iothub').Registry;

// Define the client secret values
clientSecretValue = 'xxxxxxxxxxxxxxx'
clientID = 'xxxxxxxxxxxxxx'
tenantID = 'xxxxxxxxxxxxx'

// Set environment variables
process.env['AZURE_CLIENT_SECRET'] = clientSecretValue;
process.env['AZURE_CLIENT_ID'] = clientID;
process.env['AZURE_TENANT_ID'] = tenantID;

// Acquire a credential object
const credential = new DefaultAzureCredential()

// Create an instance of the IoTHub registry
hostName = 'MyAzureDomain.azure-devices.net';
let registry = Registry.fromTokenCredential(hostName,credential);
コード サンプル

Microsoft Entra サービス認証の作業サンプルについては、 Azure ID の例に関するページを参照してください。

ファイル アップロード通知コールバック レシーバーを作成する

ファイル アップロード通知コールバック レシーバーを作成するには:

  1. getFileNotificationReceiver を呼び出します。 通知メッセージが受け取られた際に呼び出されるファイル アップロード コールバック メソッドの名前を指定します。
  2. コールバック メソッドでファイル アップロード通知を処理します。

この例では、receiveFileUploadNotification 通知コールバック レシーバーを設定します。 レシーバーは、ファイル アップロード状態の情報を解釈して、ステータス メッセージをコンソールに出力します。

//Set up the receiveFileUploadNotification notification message callback receiver
serviceClient.getFileNotificationReceiver(function receiveFileUploadNotification(err, receiver){
if (err) {
  console.error('error getting the file notification receiver: ' + err.toString());
} else {
  receiver.on('message', function (msg) {
    console.log('File upload from device:')
    console.log(msg.getData().toString('utf-8'));
    receiver.complete(msg, function (err) {
      if (err) {
        console.error('Could not finish the upload: ' + err.message);
      } else {
        console.log('Upload complete');
      }
    });
  });
}

SDK のファイル アップロード通知のサンプル

SDK には、ファイル アップロードのサンプルが含まれています。