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