IoT Edge モジュール上の Azure Blob Storage を自分のデバイスにデプロイする
適用対象: IoT Edge 1.5 IoT Edge 1.4
重要
サポートされているリリースは、IoT Edge 1.5 LTS と IoT Edge 1.4 LTS です。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日にサポートが終了します。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
IoT Edge デバイスにモジュールをデプロイするにはいくつかの方法があり、これらすべてが IoT Edge モジュールの Azure Blob Storage で機能します。 2 つの最も簡単な方法では、Azure portal または Visual Studio Code テンプレートを使用します。
前提条件
Azure サブスクリプション内の IoT ハブ。
IoT Edge デバイス。
IoT Edge デバイスがセットアップされていない場合は、Azure 仮想マシンで作成できます。 クイックスタートの記事のいずれかの手順に従って、仮想 Linux デバイスを作成するか、仮想 Windows デバイスを作成します。
Azure IoT Edge 拡張機能。 "Visual Studio Code 用の Azure IoT Edge Tools" 拡張機能は、メンテナンス モードになっています。
Visual Studio Code からデプロイする場合は Azure IoT Hub 拡張機能。
Azure portal からデプロイする
Azure portal では、配置マニフェストの作成から、IoT Edge デバイスへのデプロイのプッシュまでをガイドします。
デバイスを選択する
- Azure Portal にサインインし、IoT Hub に移動します。
- [デバイス管理] メニューで、[デバイス] を選択します。
- 一覧からターゲット IoT Edge デバイスを選択します。
- [Set Modules] \(モジュールの設定) を選択します。
配置マニフェストを構成する
配置マニフェストは、デプロイするモジュール、モジュール間でのデータ フロー、およびモジュール ツインの目的のプロパティを記述した JSON ドキュメントです。 Azure portal には、配置マニフェストを作成する手順を示すウィザードがあります。 3 つの手順があり、[モジュール]、[ルート]、[確認と作成] の各タブで実行します。
モジュールを追加する
ページの [IoT Edge モジュール] セクションで、[追加] ドロップダウンを選択し、[IoT Edge モジュール] を選択して、[IoT Edge モジュールの追加] ページを表示します。
[設定] タブで、モジュール名を入力し、コンテナー イメージ URI を指定します。
- IoT Edge モジュールの名前:
azureblobstorageoniotedge
- [イメージの URI] :
mcr.microsoft.com/azure-blob-storage:latest
この手順の説明に従って、[モジュール設定] タブ、[コンテナ作成オプション] タブ、および [モジュールツイン設定] タブで値を指定するまで、[追加] を選択しないでください。
重要
Azure IoT Edge は、モジュールを呼び出すときに大文字と小文字を区別し、Storage SDK も既定で小文字になります。 名前を小文字に変更すると、IoT Edge モジュール上の Azure Blob Storage への接続が中断されなくなります。
- IoT Edge モジュールの名前:
[コンテナーの作成オプション] タブを開きます。
次の JSON をコピーしてボックスに貼り付け、ストレージ アカウント情報とデバイス上のストレージのマウントを提供します。
{ "Env":[ "LOCAL_STORAGE_ACCOUNT_NAME=<local storage account name>", "LOCAL_STORAGE_ACCOUNT_KEY=<local storage account key>" ], "HostConfig":{ "Binds":[ "<mount>" ], "PortBindings":{ "11002/tcp":[{"HostPort":"11002"}] } } }
[コンテナーの作成オプション] にコピーした JSON を、次の情報で更新します。
<local storage account name>
を覚えやすい名前に置き換えます。 アカウント名は、小文字と数字の 3 文字から 24 文字の長さにする必要があります。 スペースは含めません。<local storage account key>
を 64 バイトの Base64 キーに置き換えます。 GeneratePlus などのツールを使ってキーを生成できます。 他のモジュールから BLOB ストレージにアクセスするには、これらの資格情報を使用します。コンテナーのオペレーティング システムに応じて
<mount>
を置き換えます。 BLOB モジュールによってそのデータが保存されるボリュームの名前またはご利用の IoT Edge デバイス上の既存のディレクトリへの絶対パスを指定します。 ストレージ マウントによって、提供したデバイス上の位置がモジュール内の設定された位置にマップされます。
Linux コンテナーの場合、形式は <ストレージのパスまたはボリューム>:/blobroot です。 次に例を示します。
- ボリューム マウント
my-volume:/blobroot
を使用します - バインド マウントを使用する:
/srv/containerdata:/blobroot
。 コンテナー ユーザーにディレクトリへのアクセス権を付与する手順に必ず従ってください
重要
IoT Edge モジュールの Blob Storage の特定の位置を指す、ストレージ マウント値の後半を変更しないでください。 ストレージ マウントは常に、Linux コンテナーの場合は :/blobroot で終わる必要があります。
IoT Edge では、モジュール コンテナーにアタッチされているボリュームは削除されません。 これは、アップグレード シナリオなど、コンテナー インスタンス間でデータを保持できるようにするための仕様上の動作です。 ただし、これらのボリュームが未使用のまま放置されるとディスク領域が不足し、それに伴うシステム エラーが発生する可能性があります。 シナリオで docker ボリュームを使う場合、特に運用環境のシナリオでは、docker volume prune や docker volume rm などの docker ツールを使って、未使用ボリュームを削除することをお勧めします。
[モジュール ツインの設定] タブで、以降の JSON をコピーし、ボックスに貼り付けます。
{ "deviceAutoDeleteProperties": { "deleteOn": <true, false>, "deleteAfterMinutes": <timeToLiveInMinutes>, "retainWhileUploading": <true,false> }, "deviceToCloudUploadProperties": { "uploadOn": <true, false>, "uploadOrder": "<NewestFirst, OldestFirst>", "cloudStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<your Azure Storage Account Name>;AccountKey=<your Azure Storage Account Key>; EndpointSuffix=<your end point suffix>", "storageContainersForUpload": { "<source container name1>": { "target": "<your-target-container-name>" } }, "deleteAfterUpload": <true,false> } }
プレースホルダーに示されているように、各プロパティを適切な値で構成します。 IoT Edge シミュレーターを使用している場合は、deviceToCloudUploadProperties および deviceAutoDeleteProperties で説明されているように、これらのプロパティの関連する環境変数に値を設定します。
ヒント
target
コンテナーの名前には名前付けの制限事項があります。たとえば、$
プレフィックスの使用はサポートされていません。 すべての制限事項を表示するには、コンテナー名を表示します。Note
コンテナー ターゲットが
storageContainersForUpload
で名前が指定されていないか null の場合、既定の名前がターゲットに割り当てられます。 コンテナーへのアップロードを停止する場合は、コンテナーをstorageContainersForUpload
から完全に削除する必要があります。 詳細については、「IoT Edge 上の Azure Blob Storage を使用してエッジにデータを格納する」のdeviceToCloudUploadProperties
セクションを参照してください。モジュールがデプロイされた後に deviceToCloudUploadProperties と deviceAutoDeleteProperties を構成する方法については、モジュール ツインの編集に関するページを参照してください。 目的のプロパティに関する詳細情報は、「必要なプロパティの定義または更新」をご覧ください。
[追加] を選択します。
次へ:ルート でルート のセクションに進みます。
ルートを指定する
既定のルートを保持し、[次へ: 確認と作成] を選択してレビュー セクションに進みます。
デプロイを確認する
確認のセクションには、前述の 2 つのセクションの選択項目に基づいて作成された JSON 配置マニフェストが表示されます。 追加しなかった 2 つのモジュール ($edgeAgent および $edgeHub) もあります。 これらの 2 つのモジュールは、IoT Edge ランタイムを構成し、すべてのデプロイの既定値として使用されます。
デプロイ情報を確認し、[作成] を選択します。
デプロイを確認する
デプロイを作成すると、IoT ハブのデバイス ページに戻ります。
- デプロイで対象にした IoT Edge デバイスを選択して、その詳細を開きます。
- デバイスの詳細で、BLOB ストレージ モジュールが [デプロイで指定] および [デバイス別に報告] の両方として一覧表示されていることを確認します。
モジュールがデバイス上で起動され、IoT Hub に報告されるまで、しばらく時間がかかる場合があります。 ページを更新して、最新の状態を表示します。
Visual Studio Code からのデプロイ
Azure IoT Edge では、エッジ ソリューションの開発に役立つ、Visual Studio Code のテンプレートが提供されます。 次の手順を使って、BLOB ストレージ モジュールで新しい IoT Edge ソリューションを作成し、配置マニフェストを構成します。
重要
Azure IoT Edge Visual Studio Code 拡張機能はメンテナンス モードです。
[ビュー]>[コマンド パレット] を選択します。
コマンド パレットで、Azure IoT Edge:New IoT Edge solution コマンドを入力して実行します。
コマンド パレットに表示されるメッセージに従って、ソリューションを作成します。
フィールド 値 フォルダーの選択 Visual Studio Code によってソリューション ファイルが作成される、開発マシン上の場所を選択します。 Provide a solution name (ソリューション名の指定) ソリューションのためにわかりやすい名前を入力するか、既定値の EdgeSolution をそのまま使用します。 Select module template (モジュール テンプレートの選択) 既存のモジュール (完全なイメージの URL を入力) を選択します。 Provide a module name (モジュール名の指定) azureblobstorageoniotedge のようにすべて小文字でモジュールの名前を入力します。
IoT Edge モジュール上の Azure Blob Storage に小文字の名前を使用することが重要です。 IoT Edge は、モジュールを参照するときに大文字と小文字を区別し、Storage SDK は既定で小文字になります。Provide Docker image for the module (モジュールの Docker イメージの指定) イメージの URI: mcr.microsoft.com/azure-blob-storage:latest を指定します。 Visual Studio Code は、指定された情報を取得し、IoT Edge ソリューションを作成して、それを新しいウィンドウに読み込みます。 ソリューション テンプレートによって、ご自分の BLOB ストレージ モジュール イメージを含む配置マニフェストのテンプレートが作成されますが、モジュールの作成オプションを構成する必要があります。
新しいソリューション ワークスペースで deployment.template.json を開いて、modules セクションを見つけます。 次の構成の変更を行います。
次のコードをコピーして、BLOB ストレージ モジュールの
createOptions
フィールドに貼り付けます。```json "Env":[ "LOCAL_STORAGE_ACCOUNT_NAME=<local storage account name>", "LOCAL_STORAGE_ACCOUNT_KEY=<local storage account key>" ], "HostConfig":{ "Binds": ["<mount>"], "PortBindings":{ "11002/tcp": [{"HostPort":"11002"}] } }
<local storage account name>
を覚えやすい名前に置き換えます。 アカウント名は、小文字と数字の 3 文字から 24 文字の長さにする必要があります。 スペースは含めません。<local storage account key>
を 64 バイトの Base64 キーに置き換えます。 GeneratePlus などのツールを使ってキーを生成できます。 他のモジュールから BLOB ストレージにアクセスするには、これらの資格情報を使用します。コンテナーのオペレーティング システムに応じて
<mount>
を置き換えます。 そのデータを格納する BLOB モジュールが必要なボリュームの名前またはご利用の IoT Edge デバイス上のディレクトリへの絶対パスを指定します。 ストレージ マウントによって、提供したデバイス上の位置がモジュール内の設定された位置にマップされます。Linux コンテナーの場合、形式は <ストレージのパスまたはボリューム>:/blobroot です。 次に例を示します。
- ボリューム マウント
my-volume:/blobroot
を使用します - バインド マウントを使用する:
/srv/containerdata:/blobroot
。 コンテナー ユーザーにディレクトリへのアクセス権を付与する手順に必ず従ってください
重要
IoT Edge モジュールの Blob Storage の特定の位置を指す、ストレージ マウント値の後半を変更しないでください。 ストレージ マウントは常に、Linux コンテナーの場合は :/blobroot で終わる必要があります。
IoT Edge では、モジュール コンテナーにアタッチされているボリュームは削除されません。 これは、アップグレード シナリオなど、コンテナー インスタンス間でデータを保持できるようにするための仕様上の動作です。 ただし、これらのボリュームが未使用のまま放置されるとディスク領域が不足し、それに伴うシステム エラーが発生する可能性があります。 シナリオで docker ボリュームを使う場合、特に運用環境のシナリオでは、docker volume prune や docker volume rm などの docker ツールを使って、未使用ボリュームを削除することをお勧めします。
- ボリューム マウント
次の JSON を deployment.template.json ファイルに追加して、モジュールの deviceToCloudUploadProperties と deviceAutoDeleteProperties を構成します。 各プロパティを適切な値で構成して、ファイルを保存します。 IoT Edge シミュレーターを使用している場合は、値を、これらのプロパティの関連する環境変数 (deviceToCloudUploadProperties と deviceAutoDeleteProperties の説明セクションに記載) に設定します。
"<your azureblobstorageoniotedge module name>":{ "properties.desired": { "deviceAutoDeleteProperties": { "deleteOn": <true, false>, "deleteAfterMinutes": <timeToLiveInMinutes>, "retainWhileUploading": <true, false> }, "deviceToCloudUploadProperties": { "uploadOn": <true, false>, "uploadOrder": "<NewestFirst, OldestFirst>", "cloudStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<your Azure Storage Account Name>;AccountKey=<your Azure Storage Account Key>;EndpointSuffix=<your end point suffix>", "storageContainersForUpload": { "<source container name1>": { "target": "<target container name1>" } }, "deleteAfterUpload": <true, false> } } }
モジュールがデプロイされた後に deviceToCloudUploadProperties と deviceAutoDeleteProperties を構成する方法については、モジュール ツインの編集に関するページを参照してください。 コンテナー作成オプション、再起動ポリシー、および必要な状態について詳しくは、「edgeAgent の必要なプロパティ」をご覧ください。
deployment.template.json ファイルを保存します。
[deployment.template.json] を右クリックして、[Generate IoT Edge deployment manifest]\(IoT Edge 配置マニフェストの生成\) を選択します。
Visual Studio Code では、deployment.template.json で指定した情報が取得され、それを使用して新しい配置マニフェスト ファイルが作成されます。 配置マニフェストは、ご利用のソリューション ワークスペース内の新しい config フォルダーに作成されます。 そのファイルを取得したら、「Azure CLI 2.0 を使用して Azure IoT Edge モジュールをデプロイする」の手順に従ってください。
複数のモジュール インスタンスのデプロイ
IoT Edge モジュールで Azure Blob Storage の複数のインスタンスをデプロイする場合は、別のストレージ パスを指定し、モジュールでバインドする HostPort
の値を変更する必要があります。 BLOB ストレージ モジュールでは常に、コンテナーでポート 11002 を公開しますが、ホスト上でバインドされるポートを宣言できます。
(Azure portal で) [コンテナーの作成オプション] または (Visual Studio Code の deployment.template.json ファイルで) createOptions フィールドを編集して、HostPort
の値を変更します。
"PortBindings":{
"11002/tcp": [{"HostPort":"<port number>"}]
}
追加の BLOB ストレージ モジュールに接続すると、更新されたホスト ポートをポイントするエンドポイントを変更します。
プロキシ サポートの構成
組織でプロキシ サーバーを使用している場合は、edgeAgent および edgeHub のランタイム モジュールのプロキシ サポートを構成する必要があります。 このプロセスには、次の 2 つのタスクが含まれます。
- デバイスでランタイム デーモンと IoT Edge エージェントを構成します。
- 配置マニフェスト JSON ファイルでモジュールの HTTPS_PROXY 環境変数を設定します。
このプロセスについては、「IoT Edge デバイスを構成してプロキシ サーバー経由で通信する」を参照してください。
さらに、Blob Storage モジュールでは、マニフェスト配置ファイルに HTTPS_PROXY 設定も必要です。 配置マニフェスト ファイルを直接編集することも、Azure portal を使用することもできます。
Azure portal で IoT Hub に移動し、[デバイス管理] メニューで [デバイス] を選択します
モジュールを構成するデバイスを選択します。
[Set Modules] \(モジュールの設定) を選択します。
ページの [IoT Edge モジュール] セクションで、BLOB Storage モジュールを選択します。
[IoT Edge モジュールの更新] ページで、[環境変数] タブを選択します。
[名前] に
HTTPS_PROXY
を、[値] にプロキシ URL を追加します。[更新]、[確認と作成] の順に選択します。
配置マニフェストでプロキシがモジュールに追加されていることを確認し、[作成] を選択します。
デバイス詳細ページからモジュールを選択して設定を確認し、[IoT Edge Modules Details]/(IoT Edge モジュールの詳細/) ページの下部にある [環境変数] タブを選択します。
次のステップ
IoT Edge 上の Azure Blob Storage の詳細を確認する。
配置マニフェストのしくみとその作成方法について詳しくは、「IoT Edge モジュールをどのように使用、構成、および再利用できるかを理解する」をご覧ください。