docker-composeプロジェクトをAzure IoT Edgeにデプロイする
背景
現在とあるIoT関連案件で、エッジデバイスの運用としてAzure IoT Hub & Azure IoT Edgeを活用していました。
Azure IoT Edgeへデプロイするモジュール(コンテナ)は、Azure Container Registry(以下、ACR)から作成することを想定しています。
ここで作業用ローカルPCからコンテナイメージをACRに登録する際にdocker pushだとdocker-composeに対応していないので困り果てていました。。。
解決方法
iotedge-composeを使いましょう。
使用例
iotedge-composeのインストール
pip install iotedge-compose
docker-composeプロジェクトを用意する
適当な場所に『test』というディレクトリを作成し、その中にdocker-compose.ymlとDockerfileを配置する。
- 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/.envとtest/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