Azure IoT Edge モジュールにデバイスのローカル ストレージへのアクセスを許可する

適用対象: IoT Edge 1.5 のチェックマーク IoT Edge 1.5 IoT Edge 1.4 チェックマーク 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 デバイス自体のストレージを使用できます。

永続ストレージを使用するようにシステム モジュールを構成する

既定では、IoT Edge システム モジュール、IoT Edge エージェント、IoT Edge ハブは、そのコンテナー インスタンスのエフェメラル ファイル システムに状態を保存します。 この状態は、コンテナー インスタンスがリサイクルされると失われます。たとえば、モジュール イメージのバージョンや createOptions が更新された場合などです。

運用環境のシナリオでは、ホスト ファイルシステム上の永続ストレージの場所を使用して、システム モジュールの状態を保存します。 これにより、ソリューションの堅牢性とクラウド メッセージ配信の確実性が向上します。

永続ストレージを使用するようにシステム モジュールを設定するには:

  1. IoT Edge ハブと IoT Edge エージェントの両方について、モジュール内のディレクトリを指す StorageFolder という名前の環境変数を追加します。

  2. IoT Edge ハブと IoT Edge エージェントの両方について、ホスト コンピューター上のローカル ディレクトリをモジュール内のディレクトリに接続するバインドを追加します。 次に例を示します。

    ローカル ストレージの作成オプションと環境変数の追加方法を示すスクリーンショット。

    <HostStoragePath><ModuleStoragePath> を実際のホストとモジュールのストレージ パスに置き換えます。 どちらの値も絶対パスにする必要があり、<HostStoragePath> が存在している必要があります。

配置マニフェストでローカル ストレージを直接構成できます。 たとえば、次のストレージ パスをマップする場合を考えます。

モジュール ホスト ストレージ パス モジュール ストレージ パス
edgeAgent /srv/edgeAgent /tmp/edgeAgent
edgeHub /srv/edgeHub /tmp/edgeHub

デプロイ マニフェストは次のようになります。

"systemModules": {
    "edgeAgent": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeAgent"
            }
        },
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeAgent:/tmp/edgeAgent\"]}}"
        },
        "type": "docker"
    },
    "edgeHub": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeHub"
            }
        },
        "restartPolicy": "always",
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeHub:/tmp/edgeHub\"],\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
        },
        "status": "running",
        "type": "docker"
    }
}

Note

スナップ インストールを使用している場合は、スナップにアクセスできるホスト ストレージ パスを選択してください。 たとえば、$HOME/snap/azure-iot-edge/current/modules/ のようにします。

ホスト システムのアクセス許可の自動管理

バージョン 1.4 以降では、StorageFolder をバックアップするホスト ストレージの所有権またはアクセス許可を手動で設定する必要はありません。 アクセス許可と所有権は、起動時にシステム モジュールによって自動的に管理されます。

Note

ホストにバインドされたストレージのアクセス許可の自動管理は、システム モジュール、IoT Edge エージェント、Edge ハブにのみ適用されます。 カスタム モジュールの場合、カスタム モジュール コンテナーが root ユーザーとして実行されていない場合には、バインドされたホスト ストレージのアクセス許可と所有権を手動で管理する必要があります。

カスタム モジュールがホスト ファイル システム上の永続ストレージにアクセスする必要がある場合は、モジュールの作成オプションを使用して、モジュール コンテナー内のストレージ フォルダーをホスト コンピューター上のフォルダーにバインドします。 次に例を示します。

{
  "HostConfig": {
    "Mounts": [
      {
        "Target": "<ModuleStoragePath>",
        "Source": "<HostStoragePath>",
        "Type": "bind",
        "ReadOnly": false
      }
    ]
  }
}

<HostStoragePath><ModuleStoragePath> を実際のホストとモジュールのストレージ パスに置き換えます。どちらの値も絶対パスにする必要があります。 オプションについて詳しくは、Docker エンジン マウントの仕様に関するページを参照してください。

ホスト システムのアクセス許可

モジュールで使用されるユーザー プロファイルに、ホスト システム ディレクトリに対する必要な読み取り、書き込み、実行のアクセス許可があることを確認します。 既定では、コンテナーは、必要なアクセス許可が既にある root ユーザーとして実行されます。 ただし、モジュールの Dockerfile で、ルート以外のユーザーの使用が指定されている場合があります。その場合、ホスト ストレージのアクセス許可を手動で構成する必要があります。

Linux システム上でディレクトリのアクセス許可を管理するには、chown を使用してディレクトリの所有者を変更してから chmod を使用してアクセス許可を変更するなど、いくつかの方法があります。 たとえば、ルート以外のユーザー ID 1000 として実行されているモジュールにホスト ストレージがアクセスできるようにするには、次のコマンドを使用します。

sudo chown 1000 <HostStoragePath>
sudo chmod 700 <HostStoragePath>

モジュール ストレージのデータを暗号化する

モジュールで IoT Edge デーモンのワークロード API が呼び出され、データが暗号化されるとき、その暗号化キーはモジュール ID とモジュールの生成 ID から派生されます。 生成 ID は、モジュールがデプロイから削除された後に、別のモジュールが同じモジュール ID で同じデバイスにデプロイされたとき、シークレットを保護するために使用されます。 モジュールの生成 ID は、 Azure CLI コマンド az iot hub module-identity show を使用して表示できます。

世代にわたってモジュールでファイルを共有したい場合は、暗号化の解除に失敗するので、シークレットが含まれていないようにする必要があります。

次のステップ

モジュールからホスト ストレージにアクセスするその他の例については、「IoT Edge 上の Azure Blob Storage を使用してエッジにデータを格納する」を参照してください。