↔️

Windows PCとWindows上のIoT Edgeモジュール間でファイル共有を行う

2024/02/05に公開

※2024/02/16 追記
「手順」において、共有フォルダの割り当て方法を修正しました。

ゴール:Windows PCに配置したファイルをWindows上のIoT Edgeモジュールから閲覧および編集ができる

Raspberry Piに入れた自作IoT Edgeモジュールを用いて、Raspberry Piに配置したファイルをIoT Edgeモジュールから閲覧や編集ができるようにしました。
そのモジュールをWindows PCに入れて実行することになり、ファイル共有処理も使用する必要が出ました。
本記事はその共有の方法についてまとめています。

説明すること

  • ゴールを達成するためのIoT Edgeモジュールのデプロイ設定
  • Windowsの共有フォルダおよびその中に入れる設定ファイルの中身

説明しないこと

  • Azure IoT Edgeモジュールの詳細な作り方
  • Pythonによるファイルの読み書き処理の実装方法

概要

Raspberry PiとRaspberry Pi上のIoT Edgeモジュールでのやり取り

IoT Edge モジュールはコンテナーベースのため、Dockerのときと同じようにモジュールコンテナー内のストレージ フォルダーをホストコンピューター上のフォルダーにバインドする必要があります。
https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-access-host-storage-from-module?view=iotedge-1.4#link-module-storage-to-device-storage-for-custom-modules

Azure IoT Edge for Linux on Windows (EFLOW)

Azure IoT Edge for Linux on Windows(EFLOW)は、Windows デバイスで Linux ワークロードを簡単に実行できるようにするソリューションです。これにより、Windows デバイスで Linux ベースの IoT Edge モジュールを実行できます。

EFLOW は Windows Subsystem for Linux (WSL) とは異なり、製品レベルのエンタープライズ ソリューションを提供します。Windows OS の上で完全に Linux カーネルを動作させることで、Linux と完全に互換性があり、企業が実運用で使用することを前提としたソリューションです。

これにより、組み込みシステムや産業用システムなど、様々な種類のデバイスで IoT ソリューションを展開することが可能になります。
https://learn.microsoft.com/ja-jp/azure/iot-edge/iot-edge-for-linux-on-windows?view=iotedge-1.4

Azure IoT Edge for Linux on Windows と Windows フォルダーを共有する

Azure IoT Edge for Linux on Windows (EFLOW) 仮想マシンは Windows ホスト OS から分離されており、仮想マシンはホスト ファイル システムにアクセスできません。既定では、EFLOW 仮想マシンには独自のファイル システムがあり、ホスト コンピューター上のフォルダーまたはファイルにアクセスできません。 "EFLOW ファイルとフォルダーの共有メカニズム" は、Windows ファイルとフォルダーを CBL-Mariner Linux EFLOW VM と共有する方法を提供します。

https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-share-windows-folder-to-vm?view=iotedge-1.4

「Raspberry Piに入れたIoT EdgeモジュールでRaspberry Pi内のファイルを共有」と「Windowsに入れたIoT EdgeモジュールでWindows上のファイルを共有」の比較


開発環境

  • Windows PC (Windows 11 Pro)
  • Visual Studio Code
  • Azure
    • IoTHub
    • Container Registry
  • Python 3.11.6

事前準備

IoTHubにIoTEdgeデバイスを1つ作成します。認証方法は対称キーにします。
https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-create-iot-edge-device?view=iotedge-1.4
Windows PCにIoT Edge for Linux on Windowsをインストールし、上記で作成したIoTEdgeデバイスの認証情報を用いてデバイス設定します。
https://learn.microsoft.com/ja-jp/azure/iot-edge/how-to-provision-single-device-linux-on-windows-symmetric?view=iotedge-1.4&tabs=azure-portal
新しいIoTEdgeモジュールをVSCodeを用いて作成します(モジュールの作り方の説明はここでは省きます)。
https://learn.microsoft.com/ja-jp/azure/iot-edge/tutorial-develop-for-linux?view=iotedge-1.4&tabs=python&pivots=iotedge-dev-ext
モジュールのデプロイ時に環境変数を使うため、deployment.template.jsonと同じ階層に.envを作成します。
モジュール作成時にContainer Registryを設定した場合は、development.template.jsonに以下のようなパラメータ設定されています。

development.template.json
"acrtest": {
    "username": "$CONTAINER_REGISTRY_USERNAME",
    "password": "$CONTAINER_REGISTRY_PASSWORD",
    "address": "acrtest.azurecr.io"
}

その場合は.envに以下のように環境変数を設定してあげます。

.env
CONTAINER_REGISTRY_USERNAME="acrtest"
CONTAINER_REGISTRY_PASSWORD="acrtestのパスワード"

例えばTestIoTEdgeというディレクトリ下でモジュールを作成すると、以下のようなディレクトリ構成になるかと思います。

TestIoTEdge/
├── config
├── deployment.debug.template.json
├── deployment.template.json
├── .env
├── .gitignore
├── modules
    ├── TestModule
        ├── Dockerfile.amd64
        ├── Dockerfile.amd64.debug
        ├── Dockerfile.arm32v7
        ├── Dockerfile.arm32v7.debug
        ├── Dockerfile.arm64v8
        ├── Dockerfile.arm64v8.debug
        ├── main.py
        ├── module.json
        ├── requirements.txt

手順

  1. Windows PC内に共有用フォルダをC:\\Shared\\EFLOW-Sharedに作成します。
  2. 1で作成したフォルダにsharedFolder.json、Read-Accessフォルダ(読み取り専用フォルダ)、およびRead-Write-Accessフォルダ(読み書き可能フォルダ)を作成します。
  3. sharedFolders.jsonに以下の内容を記載して保存します。
sharedFolders.json
[
    {
        "sharedFolderRoot": "C:\\Shared\\EFLOW-Shared",
        "sharedFolders": [
            {
                "hostFolderPath": "Read-Access",
                "readOnly": true,
                "targetFolderOnGuest": "/tmp/host-read-access"
            },
            {
                "hostFolderPath": "Read-Write-Access",
                "readOnly": false,
                "targetFolderOnGuest": "/tmp/host-read-write-access"
            }
        ]
    }
]
  1. 読取専用で共有したいファイルをRead-Accessフォルダにコピーします。同様に、読み書き両方で共有したいファイルをRead-Write-Accessフォルダにコピーします。今回は、Read-Write-Accessフォルダに以下のテキストが入ったhello-test.txtというファイルを置きます。ファイルの文字コードはUTF-8で、改行コードはLFで保存します。
hello-test.txt
hello!
  1. Windows端末において、PowerShellを管理者で実行します。
  2. sharedFolders.jsonを用いて、共有フォルダを作成します。
Add-EflowVmSharedFolder -sharedFoldersJsonPath "C:\Shared\EFLOW-Shared\sharedFolders.json"
  1. .envにHOST_DOCUMENTS_PATHという環境変数を設定し、Edgeモジュールで使用したいファイルが入っているhostFolderPathフォルダに対応した、sharedFolder.jsonで指定されているtargetFolderOnGuestのパスを記載します。
TestIoTEdge/.env
CONTAINER_REGISTRY_USERNAME="acrtest"
CONTAINER_REGISTRY_PASSWORD="acrtestのパスワード"
# 追記
HOST_DOCUMENTS_PATH="/tmp/host-read-write-access"
  1. TestModuleディレクトリにモジュールで使用するための.envファイルを作成し、その中に「IoT EdgeのVM上で管理したいファイル名」と「そのファイルを置いておくディレクトリ」を記載します。
modules/TestModule/.env
MANAGE_CONTROL_FLAG_JSON_PATH="/data"
MANAGE_CONTROL_FLAG_JSON_FILENAME="hello-test.txt"
  1. development.template.jsonの中にmodules/TestModule/createOptionsがあるため、以下のように設定します。
development.template.json
"modules": {
  "TestModule": {
    "version": "1.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
      "image": "${MODULES.TestModule}",
      "createOptions": {
        "HostConfig": {
          "Binds": [
            "$HOST_DOCUMENTS_PATH:/data"
          ]
        }
      }
    }
  }
}

10./data/hello-test.txtを読み書きできる処理をmain.pyに記載します。
11. これを設定した状態でIoT Edgeモジュールをデプロイすると、WindowsのC:\\Shared\\EFLOW-Shared\\Read-Write-Accessフォルダに入っているhello-test.txtをAzure IoT Edge を実行している Linux 仮想マシンにバインドすることができ、そこからモジュール内で対象のファイルを読み書きすることができます。

おわりに

この記事ではWindows PCとWindows上のIoT Edgeモジュール間でファイル共有を行う方法を説明しました。

ヘッドウォータース

Discussion