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における機械学習の活用

今回のチュートリアルでは、以下の内容を実施します。

  1. 開発マシンのセットアップ
  2. Visual Studio Code 用のIoT Edge拡張機能を使って新しいプロジェクトを作成
  3. プロジェクトをビルドしてAzure Container Registryに格納
  4. 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をインストールします。

  1. Docker Desktop for Windowsの公式サイトからインストーラーをダウンロードします
  2. インストーラーを実行してインストールを完了します
  3. インストール後に再起動を求められるので再起動します(再起動後も引き続きセットアップが続く場合があります)
  4. インストール完了後、Dockerのチュートリアルでリポジトリのクローンやコンテナーの実行を試してDocker Hubへのサインインとイメージのプッシュが正常に動作することを確認します

Step 2: Visual Studio CodeへのIoT Edge拡張機能の追加

Visual Studio Codeに対してAzure IoT Edge拡張機能をインストールします。

  1. Visual Studio Codeを開き、拡張機能マーケットプレースを開きます
  2. 「Azure IoT Edge」を検索してインストールします
  3. インストール後、コマンドパレット(Ctrl+Shift+P)を開き、「Azure IoT Hub: Select IoT Hub」を検索します
  4. 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を作成します。

  1. Azureポータルにサインインし、「コンテナーレジストリ」リソースを新規作成します
  2. 以下の設定で作成します
設定項目
リソースグループ既存のリソースグループに合わせる
場所東日本(Japan East)等
SKUBasic
  1. 作成完了後、コンテナーレジストリの「設定」→「アクセスキー」に移動します
  2. 「管理者ユーザー」を有効にします
  3. 表示されるログインサーバー名、ユーザー名、パスワードを控えておきます(後のステップで使用します)

Step 4: 新しいIoT Edgeソリューションの作成

Visual Studio Codeでカスタムモジュールプロジェクトを作成します。

  1. コマンドパレット(Ctrl+Shift+P)を開き、「Azure IoT Edge: New IoT Edge Solution」を選択します
  2. ソリューションを保存するフォルダーを選択します
  3. ソリューション名を入力します(デフォルトのままで可)
  4. モジュールテンプレートとして「C# Module」を選択します
  5. モジュール名を入力します(例:SampleModule
  6. Dockerイメージのリポジトリを入力します。フォーマットは以下のとおりです
<>/<>

例:

myregistry.azurecr.io/samplemodule

注意: .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: テスト用の温度センサーシミュレーターモジュール

メッセージのルーティングは以下のように設定されています。

SimulatSIeaodmTTpelHmeupMbeord(auutlpuesrte(rSieenanpmsu)otr)output)

つまり、SimulatedTemperatureSensorが出力したメッセージがSampleModuleに入力され、SampleModuleがそのままIoT Hubに転送するパイプラインが構成されます。


Step 6: ソリューションのビルドとコンテナーレジストリへのプッシュ

  1. ターミナルを開き、以下のコマンドでAzure Container Registryにログインします
docker login <ログインサーバー名> -u <ユーザー名> -p <パスワード>
  1. Visual Studio Codeのエクスプローラーで deployment.template.json を右クリックし、「Build and Push IoT Edge Solution」を選択します

  2. ビルドとプッシュが完了すると、コンテナーレジストリにイメージが格納されます。Azureポータルのコンテナーレジストリ「リポジトリ」からイメージが登録されていることを確認できます。

バージョン管理について モジュールを修正した場合は、module.jsonのバージョン番号を更新してから再ビルド・プッシュすることで、新しいタグ付きイメージが作成されます。


Step 7: IoT EdgeデバイスとなるLinux仮想マシンのセットアップ

新しいLinux仮想マシンにIoT Edgeをインストールします。

7-1. IoT Hubに新しいデバイスを登録する

  1. Visual Studio CodeのAzure IoT HubエクスプローラーからIoT Hubを選択します
  2. 「Create IoT Edge Device」を実行して新しいデバイスを追加します
  3. 作成されたデバイスの接続文字列を控えておきます

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からデバイスにモジュールをデプロイします。

  1. config フォルダー内に生成された deployment.json を右クリックします
  2. 「Create Deployment for Single Device」を選択します
  3. 対象の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 というメッセージルーティングが正常に動作することを確認しました

次のステップでは、このテンプレートをベースにしたカスタムコードモジュールの開発に進みます。