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

適用対象:yes icon IoT Edge 1.1 yes icon IoT Edge 1.2

Azure Storage サービスを使用して、またはデバイスのコンテナー ストレージにデータを格納することに加えて、特にオフラインで操作しているときは、信頼性を向上させるために、ホスト IoT Edge デバイス自体のストレージを専用で使用することもできます。

モジュール ストレージからホスト システム上のストレージへのリンクを有効にするには、コンテナー内のストレージ フォルダーを指す、モジュール用の環境変数を作成します。 その後、作成オプションを使用して、ホスト コンピューター上のフォルダーにそのストレージ フォルダーをバインドします。

たとえば、IoT Edge ハブがデバイスのローカル ストレージにメッセージを格納し、後で取得できるようにする場合は、Azure portal の [ランタイムの設定] セクションで環境変数と作成オプションを構成できます。

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

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

    Add create options and environment variables for local storage

または、配置マニフェストでローカル ストレージを直接構成することもできます。 次に例を示します。

"systemModules": {
    "edgeAgent": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-agent:1.1",
            "createOptions": {
                "HostConfig": {
                    "Binds":["<HostStoragePath>:<ModuleStoragePath>"]
                }
            }
        },
        "type": "docker",
        "env": {
            "storageFolder": {
                "value": "<ModuleStoragePath>"
            }
        }
    },
    "edgeHub": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
            "createOptions": {
                "HostConfig": {
                    "Binds":["<HostStoragePath>:<ModuleStoragePath>"],
                    "PortBindings":{"5671/tcp":[{"HostPort":"5671"}],"8883/tcp":[{"HostPort":"8883"}],"443/tcp":[{"HostPort":"443"}]}}}
        },
        "type": "docker",
        "env": {
            "storageFolder": {
                "value": "<ModuleStoragePath>"
            }
        },
        "status": "running",
        "restartPolicy": "always"
    }
}

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

たとえば、Linux システムでは、"Binds":["/etc/iotedge/storage/:/iotedge/storage/"] は、ご利用のホスト システム上のディレクトリ /etc/iotedge/storage がコンテナー内のディレクトリ /iotedge/storage/ にマップされていることを意味します。 Windows システムでは、別の例として、"Binds":["C:\\temp:C:\\contemp"] は、ご利用のホスト システム上のディレクトリ C:\temp がコンテナー内のディレクトリ C:\contemp にマップされていることを意味します。

作成オプションの詳細については、Docker ドキュメントを参照してください。

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

Linux デバイスでは、モジュールのユーザー プロファイルが、ホスト システム ディレクトリに対して必要な読み取り、書き込み、および実行のアクセス許可を持っていることを確認します。 IoT Edge ハブがデバイスのローカル ストレージにメッセージを格納できるようにする前述の例に戻ると、ユーザー プロファイル UID 1000 にアクセス許可を付与する必要があります。 Linux システム上でディレクトリのアクセス許可を管理するには、chown を使用してディレクトリの所有者を変更してから chmod を使用してアクセス許可を変更するなど、いくつかの方法があります。たとえば、次のようにします。

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

Windows デバイスでは、ホスト システム ディレクトリ上でアクセス許可を構成する必要もあります。 PowerShell を使用してアクセス許可を設定できます。

$acl = get-acl <HostStoragePath>
$ace = new-object system.security.AccessControl.FileSystemAccessRule('Authenticated Users','FullControl','Allow')
$acl.AddAccessRule($ace)
$acl | Set-Acl

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

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

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

次のステップ

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