📱

docker-composeプロジェクトをAzure IoT Edgeにデプロイする

2024/10/29に公開

背景

現在とあるIoT関連案件で、エッジデバイスの運用としてAzure IoT Hub & Azure IoT Edgeを活用していました。

Azure IoT Edgeへデプロイするモジュール(コンテナ)は、Azure Container Registry(以下、ACR)から作成することを想定しています。

ここで作業用ローカルPCからコンテナイメージをACRに登録する際にdocker pushだとdocker-composeに対応していないので困り果てていました。。。

解決方法

iotedge-composeを使いましょう。
https://devblogs.microsoft.com/iotdev/convert-your-docker-compose-project-to-azure-iot-edge-solution/

使用例

iotedge-composeのインストール

pip install iotedge-compose

docker-composeプロジェクトを用意する

適当な場所に『test』というディレクトリを作成し、その中にdocker-compose.ymlDockerfileを配置する。

  • docker-compose.yml
version: '3'

services:
  hello_world:
    build: .
  • Dockerfile
FROM python:3.11
CMD ["echo", "Hello, World!"] 

iotedge-composeを実行する

『test』の親ディレクトリに移動し、以下のコマンドを実行すると、このdocker-composeプロジェクトがIoT Edgeプロジェクトに変換される

iotedge-compose -t project -i test/docker-compose.yml -o test-edge

-t project:タイプをprojectに指定(大抵のケースはこの指定でOK)
-i test/docker-compose.yml:入力となるDocker Composeファイルのパスを指定
-o test-edge:出力先をtest-edgeディレクトリを指定

IoT EdgeプロジェクトをVSCodeで開く

code test-edge

VSCodeでtest/.envtest/modules/hello_world/module.jsonを編集する(後述)

.envを編集する

CONTAINER_REGISTRY_USERNAME=<your ACR USERNAME>
CONTAINER_REGISTRY_PASSWORD=<your ACR PASSWORD>
CONTAINER_REGISTRY_ADDRESS=<your ACR ADDRESS>

module.jsonを編集する

{
    "$schema-version": "0.0.1",
    "description": "",
    "image": {
        "repository": "<your ACR ADDRESS>/hello_world",
        "tag": {
            "version": "0.0.1",
            "platforms": {
                "amd64": "Dockerfile"
            }
        },
        "buildOptions": [],
        "contextPath": "./"
    }
}

ACRにIoT EdgeプロジェクトをBuild&Pushする

deployment.template.jsonを右クリックして、以下の赤線をクリックする

Build&Pushが完了したら、実際にAzureポータルにてACRにPushされていることを確認する

モジュールをデプロイする

Azureポータルにて、IoT Hubリソース画面より任意のデバイスを選択して、『モジュールを設定する』をクリックする

名前に<your ACR USERNAME>、住所に<your ACR ADDRESS>を入力し、『追加』『IoT Edge モジュール』の順にクリック

モジュール名にhello_world(何でもよい)、イメージの URIに<your ACR ADDRESS>/hello_world(ACRのリポジトリURI)を記入し、『追加』をクリック

モジュール一覧画面に戻るので、『確認および作成』をクリックし、次の画面で『作成』をクリック

runningになっていればOK

アプリの出力結果を確認

PowerShellを管理者権限で起動し、Connect-EflowVmでEflowに接続する。

sudo iotedge logs hello_worldを実行すると出力結果を確認できる。

ヘッドウォータース

Discussion