Linuxコンテナーを使用してIoT Edgeモジュールを開発する
この記事の内容
- Azure IoT Edgeモジュール開発のための開発環境セットアップ手順を解説します
- Docker Desktop for Windows と Visual Studio Code を使った開発フローを紹介します
- C#でカスタムIoT Edgeモジュールを作成し、Azure Container Registryにプッシュします
- Linux仮想マシン上にIoT Edgeをインストールし、モジュールをデプロイします
- テンプレートモジュールとTemperatureSensorモジュール間のメッセージルーティングを確認します
概要
本記事はAzure IoT Edgeのチュートリアルシリーズの一部です。今回は「開発環境をセットアップしてLinuxコンテナーを使用した開発をする」チュートリアルを実施します。
チュートリアルの全体像は以下のとおりです。
- 開発環境のセットアップ(本記事)
- カスタムコードモジュールの開発
- Azure Functionsをモジュールとしてデプロイ
- IoT Edgeにおける機械学習の活用
今回のチュートリアルでは、以下の内容を実施します。
- 開発マシンのセットアップ
- Visual Studio Code 用のIoT Edge拡張機能を使って新しいプロジェクトを作成
- プロジェクトをビルドしてAzure Container Registryに格納
- IoT Edgeデバイスにデプロイ
前回のクイックスタートでは既存のコンテナーイメージをそのまま展開しましたが、今回は自分でイメージをビルドし、Azure Container Registryに格納してからデプロイするところまでを行います。
前提条件
本チュートリアルを開始する前に、以下の環境が準備されていることを確認してください。
開発マシン
- Docker対応OS(Windows/Mac/Linux)
- Git
- Visual Studio Code
- Visual Studio Code 用 C# 拡張機能
- .NET Core 2.1 SDK(※3.1では動作しないケースがあるため2.1を推奨)
Azureリソース
- IoT Hub(前回のクイックスタートで作成済みのものを流用可能)
- IoT Edgeデバイス(前回のチュートリアルで作成済みのLinux仮想マシンを利用可能)
ターゲット環境の意識について 開発OS(Windows/Mac/Linuxのいずれでも可)にかかわらず、IoT Edgeモジュールが最終的に動作するターゲット環境はLinuxです。そのため、開発・テスト段階でもLinuxコンテナー上で動作確認することが重要です。本記事ではWindowsで開発を行い、コンテナーのOSはLinuxを指定する構成で進めます。
Step 1: コンテナーエンジンのインストール
Microsoftが推奨するDocker Desktop for Windowsをインストールします。
- Docker Desktop for Windowsの公式サイトからインストーラーをダウンロードします
- インストーラーを実行してインストールを完了します
- インストール後に再起動を求められるので再起動します(再起動後も引き続きセットアップが続く場合があります)
- インストール完了後、Dockerのチュートリアルでリポジトリのクローンやコンテナーの実行を試してDocker Hubへのサインインとイメージのプッシュが正常に動作することを確認します
Step 2: Visual Studio CodeへのIoT Edge拡張機能の追加
Visual Studio Codeに対してAzure IoT Edge拡張機能をインストールします。
- Visual Studio Codeを開き、拡張機能マーケットプレースを開きます
- 「Azure IoT Edge」を検索してインストールします
- インストール後、コマンドパレット(
Ctrl+Shift+P)を開き、「Azure IoT Hub: Select IoT Hub」を検索します - Azureにサインインし、対象のサブスクリプションとIoT Hubを選択します
IoT HubがまだAzureに存在しない場合は、Azureポータルから新規作成します。作成後、Visual Studio Codeのコマンドパレットから対象のIoT Hubを選択してください。
Visual Studio CodeのAzure IoT Hubエクスプローラーにデバイス一覧が表示されるようになります(初回はデバイスが未登録の状態です)。
Step 3: Azure Container Registryの作成
カスタムモジュールのコンテナーイメージを格納するAzure Container Registryを作成します。
- Azureポータルにサインインし、「コンテナーレジストリ」リソースを新規作成します
- 以下の設定で作成します
| 設定項目 | 値 |
|---|---|
| リソースグループ | 既存のリソースグループに合わせる |
| 場所 | 東日本(Japan East)等 |
| SKU | Basic |
- 作成完了後、コンテナーレジストリの「設定」→「アクセスキー」に移動します
- 「管理者ユーザー」を有効にします
- 表示されるログインサーバー名、ユーザー名、パスワードを控えておきます(後のステップで使用します)
Step 4: 新しいIoT Edgeソリューションの作成
Visual Studio Codeでカスタムモジュールプロジェクトを作成します。
- コマンドパレット(
Ctrl+Shift+P)を開き、「Azure IoT Edge: New IoT Edge Solution」を選択します - ソリューションを保存するフォルダーを選択します
- ソリューション名を入力します(デフォルトのままで可)
- モジュールテンプレートとして「C# Module」を選択します
- モジュール名を入力します(例:
SampleModule) - Dockerイメージのリポジトリを入力します。フォーマットは以下のとおりです
例:
注意: .NET Coreのバージョンについて テンプレートのビルドには.NET Core 2.1 SDKが必要です。3.1では正常に動作しないケースがあるため、事前に2.1をインストールしておいてください。
Step 5: 作成されたファイルの確認
プロジェクト作成後、生成されたファイルの構造を確認します。
モジュールのロジック(Program.cs)
テンプレートとして生成されるモジュールは、メッセージを受け取ってそのまま次のモジュールに転送するシンプルな実装になっています。
deployment.template.json
デプロイ構成ファイルには以下のモジュールが定義されています。
- edgeAgent: IoT Edgeエージェント
- edgeHub: IoT Edgeハブ
- SampleModule: 今回作成したカスタムモジュール
- SimulatedTemperatureSensor: テスト用の温度センサーシミュレーターモジュール
メッセージのルーティングは以下のように設定されています。
つまり、SimulatedTemperatureSensorが出力したメッセージがSampleModuleに入力され、SampleModuleがそのままIoT Hubに転送するパイプラインが構成されます。
Step 6: ソリューションのビルドとコンテナーレジストリへのプッシュ
- ターミナルを開き、以下のコマンドでAzure Container Registryにログインします
docker login <ログインサーバー名> -u <ユーザー名> -p <パスワード>
Visual Studio Codeのエクスプローラーで
deployment.template.jsonを右クリックし、「Build and Push IoT Edge Solution」を選択しますビルドとプッシュが完了すると、コンテナーレジストリにイメージが格納されます。Azureポータルのコンテナーレジストリ「リポジトリ」からイメージが登録されていることを確認できます。
バージョン管理について モジュールを修正した場合は、
module.jsonのバージョン番号を更新してから再ビルド・プッシュすることで、新しいタグ付きイメージが作成されます。
Step 7: IoT EdgeデバイスとなるLinux仮想マシンのセットアップ
新しいLinux仮想マシンにIoT Edgeをインストールします。
7-1. IoT Hubに新しいデバイスを登録する
- Visual Studio CodeのAzure IoT HubエクスプローラーからIoT Hubを選択します
- 「Create IoT Edge Device」を実行して新しいデバイスを追加します
- 作成されたデバイスの接続文字列を控えておきます
7-2. Ubuntu 18.04仮想マシンを作成する
Azureポータルから Ubuntu Server 18.04 LTS の仮想マシンを作成します。
7-3. IoT Edgeのインストール
仮想マシンにSSH接続し、以下の手順でIoT Edgeをインストールします。
# Microsoftパッケージリポジトリを追加
curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list
sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
# Microsoft GPGパブリックキーをインストール
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
# コンテナーランタイムのインストール
sudo apt-get update
sudo apt-get install moby-engine
sudo apt-get install moby-cli
# IoT Edgeセキュリティデーモンのインストール
sudo apt-get install iotedge
7-4. IoT Edge構成ファイルの設定
sudo nano /etc/iotedge/config.yaml
ファイル内の provisioning セクションにデバイス接続文字列を設定します。
provisioning:
source: "manual"
device_connection_string: "<控えておいたデバイス接続文字列>"
設定後、IoT Edgeデーモンを再起動します。
sudo systemctl restart iotedge
7-5. 動作確認
sudo iotedge list
edgeAgent がRunning状態で表示されていれば正常に動作しています。
Step 8: モジュールのデプロイ
Visual Studio Codeからデバイスにモジュールをデプロイします。
configフォルダー内に生成されたdeployment.jsonを右クリックします- 「Create Deployment for Single Device」を選択します
- 対象のIoT Edgeデバイスを選択します
デプロイが完了すると、Visual Studio CodeのAzure IoT HubエクスプローラーでデバイスにSampleModuleとSimulatedTemperatureSensorが追加されていることが確認できます。
Step 9: メッセージフローの確認
Visual Studio CodeのAzure IoT Hubエクスプローラーで「Start Monitoring Built-in Event Endpoint」を実行すると、IoT Hubに届いているメッセージを確認できます。
SimulatedTemperatureSensorが出力したメッセージがSampleModuleを経由してIoT Hubに届いていることが確認できれば、一連のパイプラインが正常に動作しています。
まとめ
本記事では、Azure IoT Edgeモジュール開発のための環境構築から、デプロイ・動作確認まで一通りの手順を実施しました。
- Docker Desktop for Windows をインストールし、コンテナーエンジンを用意しました
- Visual Studio Code + Azure IoT Edge拡張機能 を使って、C#のIoT Edgeソリューションを新規作成しました
- .NET Core 2.1 SDK が必要であることを確認しました(3.1では動作しないケースがあります)
- Azure Container Registry を作成し、ビルドしたモジュールイメージをプッシュしました
- Linux仮想マシン(Ubuntu 18.04) にIoT Edgeをインストールし、新しいデバイスとして登録しました
- SimulatedTemperatureSensor → SampleModule → IoT Hub というメッセージルーティングが正常に動作することを確認しました
次のステップでは、このテンプレートをベースにしたカスタムコードモジュールの開発に進みます。