IoT Edge 上の Azure Blob Storage を使用してエッジにデータを格納する

適用対象:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

IoT Edge の Azure Blob Storage では、エッジでブロック BLOB および追加 BLOB ストレージのソリューションが提供されます。 ご利用の IoT Edge デバイス上の BLOB ストレージ モジュールは Azure の BLOB サービスのように動作しますが、その BLOB はご利用の IoT Edge デバイス上でローカルに格納されます。 同じ Azure Storage SDK メソッドまたは既に慣れている BLOB API 呼び出しを使用して、ご自分の BLOB にアクセスできます。 この記事では、ご利用の IoT Edge デバイス上で Blob service を実行する IoT Edge コンテナー上の Azure Blob Storage に関連する概念について説明します。

このモジュールは、次のシナリオで役立ちます。

  • 処理したりクラウドに転送したりできるようになるまで、データをローカル環境に格納する必要がある場合。 そうしたデータには、動画、画像、ファイナンス データ、病院データなど、あらゆる非構造化データが考えられます。
  • 接続に制限のある場所にデバイスがある場合。
  • 緊急時に可能な限り迅速に対応できるよう、データに低遅延でアクセスするためローカル環境でデータを効率的に処理する必要がある場合。
  • 帯域幅のコストを削減し、テラバイト単位のデータがクラウドに転送されないようにする場合。 データをローカルで処理し、処理されたデータのみをクラウドに送信することができます。

このモジュールには、deviceToCloudUpload 機能と deviceAutoDelete 機能が付属しています。

deviceToCloudUpload は構成可能な機能です。 この機能は、断続的なインターネット接続のサポートによりローカルの Blob Storage から Azure にデータを自動的にアップロードすることができます。 これにより次の操作を行うことができます。

  • deviceToCloudUpload 機能のオン/オフを切り替える。
  • データを Azure にコピーする順序 (NewestFirst や OldestFirst など) を選択する。
  • データのアップロード先の Azure Storage アカウントを選択する。
  • Azure にアップロードするコンテナーを指定する。 このモジュールでは、ソースとターゲットの両方のコンテナー名を指定できます。
  • クラウド ストレージへのアップロードが完了した後ですぐに BLOB を削除する機能を選択する
  • 完全な BLOB アップロード (Put Blob 操作を使用) とブロック レベルのアップロード (Put BlockPut Block List、および Append Block 操作を使用) を行う。

このモジュールは、BLOB がブロックで構成されている場合、ブロック レベルのアップロードを使用します。 一般的なシナリオのいくつかを次に示します。

  • アプリケーションにより、以前にアップロードしたブロック BLOB のいくつかのブロックが更新されるか、追加 BLOB に新しいブロックが追加されると、このモジュールでは、BLOB 全体ではなく更新されたブロックのみがアップロードされます。
  • BLOB のアップロード中にインターネット接続がなくなると、接続が戻ったときに、BLOB 全体ではなく残りのブロックのみアップロードされます。

BLOB のアップロード中に予期しないプロセスの終了 (電源障害など) が発生すると、モジュールがオンラインに戻ったときに、アップロード予定だったすべてのブロックが再度アップロードされます。

deviceAutoDelete は構成可能な機能です。 この機能では、指定した期限 (分単位) が過ぎると、モジュールによって BLOB がローカル ストレージから自動的に削除されます。 これにより次の操作を行うことができます。

  • deviceAutoDelete 機能のオン/オフを切り替える。
  • BLOB が自動的に削除されるまでの分単位の時間 (deleteAfterMinutes) を指定します。
  • deleteAfterMinutes 値が期限切れになった場合に、アップロード中は BLOB を保持する機能を選択する。

前提条件

Azure IoT Edge デバイス:

  • Linux デバイス または Windows デバイスのクイック スタートに記載された手順に従って、開発マシンまたは仮想マシンを IoT Edge デバイスとして使用できます。

  • サポートされているオペレーティング システムおよびアーキテクチャの一覧については、「Azure IoT Edge のサポートされるシステム」を参照してください。 IoT Edge モジュールの Azure Blob Storage では、次のアーキテクチャがサポートされます。

    • Windows AMD64
    • Linux AMD64
    • Linux ARM32
    • Linux ARM64

クラウド リソース:

Azure の Standard レベルの IoT Hub

deviceToCloudUpload および deviceAutoDelete のプロパティ

このモジュールの必要なプロパティを使用して、deviceToCloudUploadPropertiesdeviceAutoDeleteProperties を設定します。 必要なプロパティは、デプロイ中に設定したり、モジュール ツインを編集することで、再デプロイすることなく後で変更したりできます。 値が確実に正しく反映されるよう、reported configurationconfigurationValidation の "モジュール ツイン" をチェックすることをお勧めします。

deviceToCloudUploadProperties

この設定の名前は deviceToCloudUploadProperties です。 IoT Edge シミュレーターを使用している場合は、値をこれらのプロパティの関連する環境変数 (説明セクションに記載) に設定します。

プロパティ 指定可能な値 説明
uploadOn true、false 既定では false に設定されています。 この機能をオンにする場合は、このフィールドを true に設定します。

環境変数: deviceToCloudUploadProperties__uploadOn={false,true}
uploadOrder NewestFirst、OldestFirst データを Azure にコピーする順序を選択できます。 既定では OldestFirst に設定されています。 順序は BLOB の最終更新時刻によって決定されます。

環境変数: deviceToCloudUploadProperties__uploadOrder={NewestFirst,OldestFirst}
cloudStorageConnectionString "DefaultEndpointsProtocol=https;AccountName=<your Azure Storage Account Name>;AccountKey=<your Azure Storage Account Key>;EndpointSuffix=<your end point suffix>" は、データのアップロード先のストレージ アカウントを選択するための接続文字列です。 Azure Storage Account NameAzure Storage Account KeyEnd point suffix を指定します。 データのアップロード先の Azure の適切な EndpointSuffix を追加します。これはグローバル Azure、政府機関向け Azure、および Microsoft Azure Stack ごとに異なります。

ここで Azure Storage SAS 接続文字列を指定できます。 ただし、有効期限が切れた場合は、このプロパティを更新する必要があります。 SAS のアクセス許可には、コンテナーの作成アクセスと、BLOB の作成、書き込み、追加アクセスが含まれる場合があります。

環境変数: deviceToCloudUploadProperties__cloudStorageConnectionString=<connection string>
storageContainersForUpload "<source container name1>": {"target": "<target container name>"},

"<source container name1>": {"target": "%h-%d-%m-%c"},

"<source container name1>": {"target": "%d-%c"}
Azure にアップロードするコンテナーの名前を指定できます。 このモジュールでは、ソースとターゲットの両方のコンテナー名を指定できます。 ターゲット コンテナー名を指定しない場合は、 <IoTHubName>-<IotEdgeDeviceID>-<ModuleName>-<SourceContainerName> などのコンテナー名が自動的に割り当てられます。 ターゲット コンテナー名のテンプレート文字列を作成して、使用可能な値の列をチェックアウトできます。
* %h -> IoT Hub 名 (3 - 50 文字)。
* %d -> IoT Edge デバイス ID (1 - 129 文字)。
* %m -> モジュール名 (1 - 64 文字)。
* %c -> ソース コンテナー名 (3 - 63 文字)。

コンテナー名の最大サイズは 63 文字です。 コンテナーのサイズが 63 文字を超えると、ターゲット コンテナー名が自動的に割り当てられます。 この場合、各セクション (IoTHubName、IotEdgeDeviceID、ModuleName、SourceContainerName) の名前は 15 文字にトリミングされます。

環境変数: deviceToCloudUploadProperties__storageContainersForUpload__<sourceName>__target=<targetName>
deleteAfterUpload true、false 既定では false に設定されています。 true に設定すると、クラウド ストレージへのアップロードが完了すると、データが自動的に削除されます。

注意: 追加 BLOB を使用している場合、この設定によって、アップロードの成功後にローカル ストレージから追加 BLOB が削除され、それ以降、それらの BLOB へのブロック追加操作はすべて失敗します。 この設定を使用する際は、十分注意してください。 アプリケーションで追加操作がまれにしか行われない、または連続追加操作がサポートされていない場合は、これを有効にしないでください

環境変数: deviceToCloudUploadProperties__deleteAfterUpload={false,true}

deviceAutoDeleteProperties

この設定の名前は deviceAutoDeleteProperties です。 IoT Edge シミュレーターを使用している場合は、値をこれらのプロパティの関連する環境変数 (説明セクションに記載) に設定します。

プロパティ 指定可能な値 説明
deleteOn true、false 既定では false に設定されています。 この機能をオンにする場合は、このフィールドを true に設定します。

環境変数: deviceAutoDeleteProperties__deleteOn={false,true}
deleteAfterMinutes <minutes> 時間を分単位で指定します。 この値の有効期限が切れると、モジュールによってローカル ストレージから BLOB が自動的に削除されます。 現在許可されている最大時間 (分単位) は 35791 です。

環境変数: deviceAutoDeleteProperties__ deleteAfterMinutes=<minutes>
retainWhileUploading true、false 既定では、 true に設定されています。deleteAfterMinutes が切れた場合はクラウド ストレージへのアップロード中に BLOB が保持されます。 false に設定すると、 deleteAfterMinutes の有効期限が切れるとすぐにデータが削除されます。 注: このプロパティを機能させるには、UploadOn が true に設定されている必要があります。

注意: 追加 BLOB を使用している場合、値の有効期限が切れるとローカル ストレージから追加 BLOB が削除され、それ以降それらの BLOB に対する追加ブロック操作は失敗します。 アプリケーションによって実行される追加操作の予想される頻度に対して、有効期限の値が十分に大きいことを確認してください。

環境変数: deviceAutoDeleteProperties__retainWhileUploading={false,true}

ローカル ストレージとして SMB 共有を使用する

Windows ホストにこのモジュールの Windows コンテナーをデプロイするときに、ローカル ストレージ パスとして SMB 共有を指定できます。

SMB 共有と IoT デバイスが相互に信頼されたドメインにあることを確認してください。

New-SmbGlobalMapping PowerShell コマンドを実行して、Windows を実行している IoT デバイス上でローカルに SMB 共有をマップすることができます。

構成手順:

$creds = Get-Credential
New-SmbGlobalMapping -RemotePath <remote SMB path> -Credential $creds -LocalPath <Any available drive letter>

次に例を示します。

$creds = Get-Credential
New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:

このコマンドは、資格情報を使用してリモート SMB サーバーで認証を行います。 次に、リモート共有パスを G: ドライブ文字にマップします (その他の使用可能なドライブ文字も指定できます)。 これで、IoT デバイスのデータ ボリュームが G: ドライブのパスにマップされました。

IoT デバイスのユーザーがリモート SMB 共有に対して読み取りおよび書き込みできることを確認してください。

実際のデプロイでは、<storage mount> の値として G:/ContainerData:C:/BlobRoot を指定できます。

Linux のコンテナー ユーザーにディレクトリ アクセスを許可する

Linux コンテナーの作成オプションでストレージにボリューム マウントを使用する場合は、追加の手順を実行する必要はありませんが、バインド マウントを使用する場合は、サービスを正しく実行するためにこれらの手順が必要です。

ユーザーのアクセス権を作業の実行に必要な最小限のアクセス許可に制限する最小限の特権の原則に従って、このモジュールには、ユーザー (名前: absie、ID: 11000) とユーザー グループ (名前: absie、ID: 11000) が含まれています。 コンテナーがルートとして開始された場合 (既定のユーザーはルート)、サービスは低い特権の absie ユーザーとして開始されます。

この動作により、サービスが正常に動作するために、ホスト パス バインドのアクセス許可の構成が重要になります。構成によっては、アクセス拒否エラーが発生してサービスがクラッシュします。 ディレクトリ バインディングで使用されるパスには、コンテナー ユーザー (例: absie 11000) がアクセスできる必要があります。 ホストでコマンドを実行して、コンテナー ユーザーにディレクトリへのアクセス権を付与できます。

sudo chown -R 11000:11000 <blob-dir>
sudo chmod -R 700 <blob-dir>

次に例を示します。

sudo chown -R 11000:11000 /srv/containerdata
sudo chmod -R 700 /srv/containerdata

absie 以外のユーザーとしてサービスを実行する必要がある場合は、配置マニフェストの createOptions の "User" プロパティでカスタム ユーザー ID を指定できます。 このような場合は、既定値またはルート グループ ID 0 を使用します。

"createOptions": {
  "User": "<custom user ID>:0"
}

ここで、コンテナー ユーザーにディレクトリへのアクセスを許可します。

sudo chown -R <user ID>:<group ID> <blob-dir>
sudo chmod -R 700 <blob-dir>

ログ ファイルの構成

お使いのモジュールのログ ファイルの構成については、こちらの運用環境のベスト プラクティスをご覧ください。

ご自分の BLOB ストレージ モジュールに接続する

ご自分のモジュールに対して構成したアカウント名とアカウントキーを使用して、ご利用の IoT Edge デバイス上の BLOB ストレージにアクセスできます。

作成する任意のストレージ要求に対する BLOB エンドポイントとして、ご利用の IoT Edge デバイスを指定します。 構成した IoT Edge デバイス情報とアカウント名を使用して、明示的なストレージ エンドポイントへの接続文字列を作成できます。

  • Azure Blob Storage on IoT Edge モジュールが実行されているデバイスにデプロイされているモジュールの場合、BLOB エンドポイントは http://<module name>:11002/<account name> になります。
  • 別のデバイスで実行されているモジュールまたはアプリケーションの場合、実際のネットワークの適切なエンドポイントを選択する必要があります。 ネットワーク設定に応じて、外部モジュールまたはアプリケーションからのデータ トラフィックが Azure Blob Storage on IoT Edge モジュールを実行しているデバイスに到達できるようにエンドポイントの形式を選択します。 このシナリオの BLOB エンドポイントは次のいずれかです。
    • http://<device IP >:11002/<account name>
    • http://<IoT Edge device hostname>:11002/<account name>
    • http://<fully qualified domain name>:11002/<account name>

重要

Azure IoT Edge は、モジュールを呼び出すときに大文字と小文字を区別し、Storage SDK も既定で小文字になります。 Azure Marketplace でのモジュールの名前は AzureBlobStorageonIoTEdge ですが、名前を小文字に変更すると、IoT Edge モジュールの Azure Blob Storage への接続が中断されないことが保証されます。

Azure Blob Storage のクイックスタートのサンプル

Azure Blob Storage のドキュメントには、複数の言語のクイック スタートのサンプル コードが含まれています。 ご利用のローカル Blob Storage モジュールに接続するように BLOB エンドポイントを変更して、これらのサンプルを実行し、IoT Edge の Azure Blob Storage をテストできます。

次のクイック スタート サンプルでは IoT Edge からもサポートされる言語を使用するため、BLOB ストレージ モジュールと共に IoT Edge モジュールとして言語をデプロイできます。

  • .NET
    • IoT Edge モジュール (v1.4.0 以前) 上の Azure Blob Storage は、WindowsAzure.Storage 9.3.3 SDK と互換性があります。また、v1.4.1 では、Azure.Storage.Blobs 12.8.0 SDK もサポートされています。
  • Python
    • バージョン 2.1 より前の Python SDK には、このモジュールが BLOB の作成時刻を返さないという既知の問題があります。 この問題により、list_blobs (BLOB の一覧表示) などの一部のメソッドが機能しません。 回避策として、BLOB クライアントで API バージョンを「'2017-04-17'」に明示的に設定します。 例: block_blob_service._X_MS_VERSION = '2017-04-17'
    • 追加 BLOB のサンプル
  • Node.js
  • JS/HTML
  • Ruby
  • Go
  • PHP

Azure Storage Explorer を使用してお使いのローカル ストレージに接続する

Azure Storage Explorer を使用して、ご自身のローカル ストレージ アカウントに接続できます。

  1. Azure Storage Explorer をダウンロードしてインストールする

  2. Azure Storage Explorer の最新バージョンでは、BLOB ストレージ モジュールでサポートされていない新しいストレージ API バージョンが使用されています。 Azure Storage Explorer を起動します。 編集メニューを選択します。 [Azure Stack Hub API を対象にする] が確実に選択されているようにしてください。 そうでない場合は、[Azure Stack Hub を対照にする] を選択します。 Azure Storage Explorer を再起動して、変更を反映させます。 この構成は、IoT Edge 環境との互換性のために必要です。

  3. 接続文字列を使用して Azure Storage に接続します

  4. 接続文字列 (DefaultEndpointsProtocol=http;BlobEndpoint=http://<host device name>:11002/<your local account name>;AccountName=<your local account name>;AccountKey=<your local account key>;) を指定します

  5. 接続する手順を実行します。

  6. ご自分のローカル ストレージ アカウント内にコンテナーを作成します

  7. ブロック BLOB または追加 BLOB としてファイルのアップロードを開始します。

    Note

    このモジュールでは、ページ BLOB はサポートされていません。

  8. Storage Explorer で Azure Storage アカウントを接続するように選択することもできます。 この構成により、1 つのビューにローカル ストレージ アカウントと Azure ストレージ アカウントの両方を表示できます。

サポートされるストレージ操作

IoT Edge 上の BLOB ストレージ モジュールでは Azure Storage SDK が使用され、ブロック BLOB エンドポイント用の 2017-04-17 バージョンの Azure Storage API と一貫性があります。

すべての Azure Blob Storage の操作が、IoT Edge の Azure Blob Storage でサポートされるわけではないため、このセクションでは、それぞれの状態の一覧を示します。

取引先企業

サポート対象:

  • コンテナーをリストする

サポートされていません:

  • Blob service プロパティの取得と設定
  • BLOB 要求のプレフライト
  • Blob service の統計情報を取得する
  • アカウント情報を取得する

Containers

サポート対象:

  • コンテナーの作成と削除
  • コンテナーのプロパティとメタデータの取得
  • BLOB を一覧表示する
  • コンテナー ACL の取得と設定
  • コンテナー メタデータを設定する

サポートされていません:

  • リース コンテナー

BLOB

サポート対象:

  • BLOB の配置、取得、削除
  • BLOB プロパティの取得と設定
  • BLOB メタデータの取得と設定

サポートされていません:

  • BLOB のリリース
  • BLOB のスナップショット
  • BLOB のコピーとコピーの中止
  • BLOB の削除を取り消す
  • BLOB レベルの設定

ブロック BLOB

サポート対象:

  • ブロックの配置
  • ブロックリストの配置と取得

サポートされていません:

  • URL からブロックの配置

追加 BLOB

サポート対象:

  • ブロックの追加

サポートされていません:

  • URL からブロックの追加

Event Grid on IoT Edge の統合

注意事項

Event Grid on IoT Edge との統合はプレビュー段階です。

この Azure Blob Storage on IoT Edge モジュールを Event Grid on IoT Edge と統合できるようになりました。 この統合の詳細については、モジュールのデプロイ、イベントの発行、イベント配信の確認に関するチュートリアルを参照してください。

リリース ノート

こちらは、このモジュール用の Docker Hub のリリース ノートです。 バグの修正と修復に関連する詳細情報は、特定のバージョンのリリース ノートで確認できる場合があります。

次のステップ

Azure Blob Storage を IoT Edge にデプロイする方法を学習する

IoT Edge の Azure Blob Storage の リリース ノート ページで、最新の更新プログラムと最新情報をお知らせを確認してください。