Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

目次

...

Table of Contents
minLevel1
maxLevel4

はじめに

...

ここではAzure IoT Edgeコンテナを利用してiPRO Camera SDKアプリのビルドし、動作確認する手順を説明します。また、このチュートリアルではSDKのインストールディレクトリを${SDK_DIR}として記載します。

Info

このチュートリアルはSDK ver.2.00以降のみ対応しています。SDK ver.2.00未満では利用できませんので注意ください。

動作確認手順

...

Visual Studio Code上で新規のIoT Edge Solutionを作成する

以下は参考にするサンプルアプリがC版はskeleton_sample_app、Python版はadditional_info_sample_app、作成するEdge Solutionがtest_appの場合について説明します。注意点としてEdge Solutionの名称はすべて小文字である必要があります。である必要があります。詳細は下記を参照ください。
https://docs.docker.jp/engine/reference/commandline/tag.html

C版/Python版アプリの説明

Info

C版/Python版いずれのアプリも動作確認方法はほぼ同様です。C版を例に説明しますが、異なる部分は適宜説明します。また、アプリのパスは以下の通りですので、適宜読み替えてください。

C版アプリのパス
${SDK_DIR}/src/adamapp

Python版アプリのパス
${SDK_DIR}/src/adamapp-py

...

Info

フォルダ名は test_app のように全て小文字でないと動作しません。ご注意ください。でないと動作しません。詳細は下記を参照ください。
https://docs.docker.jp/engine/reference/commandline/tag.html

Visual Studio CodeのEXPLORERからコピーしたフォルダ(test_app)を右クリックし、「Find in Folder…」を選択し、SEARCHウィンドウを表示します。

...

作成したイメージをプッシュするコンテナレジストリの情報を入力します。

Info

このドキュメントでは開発とテストを素早く実施するために、Azure Container Registryの管理者ログイン資格情報を使用して説明しています。運用環境では、サービスプリンシパルやリポジトリスコープトークンのような最小特権の認証オプションを使用することをお勧めします。詳細はこちらをご参照ください。

Azure Portal にログインし、対象とするコンテナレジストリを選択します。下記画面は例です。

...

左側のメニューから 「設定」 - 「アクセスキー」を表示します。

...

表示された情報をもとに、以下を入力します。開発環境構築において、i-PRO が運営するコンテナレジストリを利用される場合、以下の説明にある各項目は下表の値をご利用ください。 ご自身でコンテナレジストリを用意する場合は、使用するコンテナレジストリのドキュメントを参照し値を取得してください。

コンテナレジストリ名

iprocamsdk

ログインサーバー

iprocamsdk.azurecr.io

ユーザー名

[別途通知したユーザー名]

password

[別途通知したパスワード]

リポジトリ名

[別途通知したリポジトリ名]

取得した情報をもとに、以下を入力します。

  • ${SDK_DIR}\src\adamapp\test_app\container\deployment.template.json
    内の “registryCredentials” を以下のように入力します。 「コンテナレジストリ名」はAzure Portalの「レジストリ名」を小文字にしたもの (「ログインサーバー」の .azurecr.ioよりも前の文字列と同じ) となります。

    Code Block
    "registryCredentials": {
      "[コンテナレジストリ名]": {
        "username": "$CONTAINER_REGISTRY_USERNAME_[コンテナレジストリ名]",
        "password": "$CONTAINER_REGISTRY_PASSWORD_[コンテナレジストリ名]",
        "address": "[ログインサーバー]"
      }
    }

    例えばコンテナレジストリ名がiprocv5xcontainerregistry、コンテナレジストリログインサーバーがiprocv5xcontainerregistry.azurecr.io の場合は以下のようになる。

    Image Removed

     例えば i-PRO が運営するコンテナレジストリの場合は以下のようになります。 

    image-20240314-074242.pngImage Added

  • ${SDK_DIR}\src\adamapp\test_app\container\modules\test_app\module.json
    内の “repository” を以下のように入力します。

    Code Block
    "repository": "[ログインサーバー]/[リポジトリ名]/test_app"

    コンテナレジストリログインサーバーがiprocv5xcontainerregistry例えばコンテナレジストリログインサーバーが iprocamsdk.azurecr.io の場合は以下のようになる。

    Image Removed

    io、リポジトリ名が dev/company-aの場合は以下のようになります。

    image-20240314-094005.pngImage Added

  • ${SDK_DIR}\src\adamapp\test_app\container
    ディレクトリ内に.envファイルを作成し、コンテナレジストリのユーザー名、パスワードを記載して保存します。

    Code Block
    CONTAINER_REGISTRY_USERNAME_[コンテナレジストリ名]=[ユーザー名]
    CONTAINER_REGISTRY_PASSWORD_[コンテナレジストリ名]=[password]

    例を以下に示します。

    20240124-110902.pngImage Removedenv.PNGImage Added

...

アプリのコーディング

このままVisual Studio Code上で任意にコーディングを行います。

...

Code Block
${SDK_DIR}\src\adamapp\test_app\Makefile
変更前
PROG_NAME= SkeletonSampleApp
変更後
PROG_NAME= TestApp

${SDK_DIR}\src\adamapp\test_app\configuration.txt
変更前
APPLICATION	SkeletonSampleApp
変更後
APPLICATION	TestApp

${SDK_DIR}\src\adamapp\test_app\container\deployment.template.json
変更前
"APPLICATION_NAME=SkeletonSampleApp"
変更後
"APPLICATION_NAME=TestApp"

  

アプリのビルド

ビルドを行う際はAzure IoT拡張機能の組込み機能を使用します。Visual Studio Codeのエクスプローラで
${SDK_DIR}\src\adamapp\test_app\container\deployment.template.jsonを右クリックするとビルドメニューが表示されます。

「Build IoT Edge Solution」を選択します。この操作ではビルドのみ実施されます。初回のビルドの場合は、コンテナレジストリへのログインが要求されます。 以下はコンテナレジストリがiprocv5xcontainerregistry.azurecr.ioの場合の例です。

SDKで提供しているDockerfile では、i-PRO コンテナレジストリ上からイメージを取得してイメージのビルドを行いますので、初回のビルドの場合は、コンテナレジストリへのログインが要求されます。 以下はエラーメッセージの例です。

Code Block
ERROR: failed to solve: iprocv5xcontainerregistryiprocamsdk.azurecr.io/sdk/cadamappbase:1.0.0.2: failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized

この時はVisual Studio Codeの端末上で下記コマンドを入力します。

Code Block
docker login iprocv5xcontainerregistryiprocamsdk.azurecr.io

続いて表示されるUsernameおよび Passwordを入力します。コンテナレジストリのIDとパスワードを入力します。

...

Passwordを入力します。コンテナレジストリのIDとパスワードを入力します。i-PROのコンテナレジストリを利用する場合は、通知されたユーザー名・パスワードでログインしてください。

Code Block
Username: [ユーザー名]
Password: [password]

独自のコンテナレジストリを利用する場合は、以下を入力してください。

Code Block
Username: sdk-containeradam-ro
Password: H291gWcZ7Tg6Eph+TbTrsDKyYgHLtWq1vQHPuxIOZb+ACRADu2w4

Login Succeeded と表示されたらログイン成功です。

Note

Username 及び Password を他人に通知しないでください。

また、変更される可能性がありますので、常に最新情報をご確認ください。

次に${SDK_DIR}\src\adamapp\test_app\container\deployment.template.jsonを右クリックして、
「Build and Push IoT Edge Solution」を選択します。この操作ではビルドとコンテナレジストリへのプッシュを行います。

ビルドは、${SDK_DIR}\src\adamapp\test_app\ 以下にある Dockerfile.arm64v8 azureIoT ファイルに記載の通りにDocker buildx buildが実行されることで行われます。Dockerfile.の後の環境名(arm64v8)は上記の手順で選択されたアーキテクチャが選択されています。(Visual Studio Codeの下部に現在のアーキテクチャが表示されます)

...

Visual Studio Codeの下部に現在のアーキテクチャが表示されます)

...

Info

独自のコンテナレジストリを使用する場合、Build and Push IoT Edge Solutionを行うと、プッシュに失敗します。

これは、同時に複数のコンテナレジストリにログインできない制約があるためです。

したがって、この場合はBuild IoT Edge Solutionでイメージをビルドした後、プッシュ先のコンテナレジストリにログインしなおし、手動でイメージをプッシュしてください。

ビルドしたイメージの確認

ビルドが成功すれば、そのイメージは docker images で存在が確認できます。下記は一例です。

Code Block
$ docker images
REPOSITORY                                                             TAG             IMAGE ID       CREATED          SIZE
iprocv5xcontainerregistry.azurecr.io/azureiot/test_app  0.0.5-arm64v8   f1772ccfed77   35 minutes ago   91.4MB

   

カメラへのデプロイ

左下の「AZURE IOT HUB」以下からデプロイしたいデバイスを選択し、右クリックして「1つのIoT Edgeに配置」を選択することで、カメラへデプロイされます。デプロイする内容は
${SDK_DIR}\src\adamapp\test_app\container\deployment.template.json に従います。

...

Deployment Succeeded と表示されたらデプロイ成功です。

...

Azure上でランタイム状態の確認

Azure Portal にログインして、IoT Hub - IoT Edge画面で追加したIoT Edgeデバイスを選択します。

...

Info

デプロイしてしばらくはランタイムの状態は「エラー」になります。「running」になるまで時間が必要です。ただし、「running」になるまでに必要な時間はアプリに依存します。

アプリの動作確認

カメラと接続可能なPCで下記URLにアクセスします。

...

下記のようにアプリ動作を確認できます。下記はskeleton_sample_appを動作させた例です。

...

Azure IoT Explorerを用いたContainer版Adamappの制御

...

マイクロソフトが公開している、Azure IoT Explorerを使って、Container版Adamappの制御や確認が可能です。以下では、Azure IoT Exporlorのインストールと初期設定について記載します。

インストール

Azure IoT エクスプローラーをインストールして使用する - Azure IoT に従い、PCにAzure IoT Explorerをインストールします。

 

初期設定

Azure IoT Explorerを起動すると、以下のような初期画面が出るので、「Connect via IoT Hub connection string」を選択します。

...

表示されたデバイス (カメラ) リストから、確認したいデバイスを選択します。

ModuleTwinによる設定値の確認

アプリの設定値 (AppPrefs.json) に記載した設定値は、Azure IoTのModuleTwinという仕組みを使用してクラウドから確認できます。

...

対象のコンテナの情報がjson形式で表示されます。appPrefs.jsonに記載した情報は、”properties”.”reported”.”aplField”.”preference” 内に表示されます。

Info

設定値は読み取り専用となります。

 

動作スケジュールの設定

アプリケーションを動作する時間帯を ModuleTwinを使用して設定します。

...

  • 入力後は画面上部の「Save」を押すことでカメラに設定が反映されます。

  • 最大8個まで設定可能です。

  • 設定されたいずれかの時間内である場合、Container AdamAppが動作します。AdamApp for Azure IoT Edgeが動作します。

  • 推論終了時間が推論開始時間よりも後の場合、推論終了時間は次の日を表します。

  • scheduleFieldが空の場合は常時動作となります。

  • 記載内容が不正の場合、アプリケーションは起動しません。

  • 停止・開始の判断は15秒間隔で実施されます。したがって、開始・停止時刻は最大15秒の遅延が発生します。

デバイスからクラウド通信によるテレメトリデータの送信

テレメトリデータの送信

  • Container AdamAppのみ有効な AdamApp for Azure IoT Edgeのみ有効な ADAM_SendTelemetry() 関数を呼び出すことでデバイスtoクラウド通信によるテレメトリデータを送信することができます。

  • このAPIの引数にはJSON形式で値を指定してください。詳細はAPI仕様書をご覧ください。

  • デバイスtoクラウド通信はAzure IoT Hubの設定により通信回数に制限があります。詳細は、Azure IoT Hub クォータと調整について | Microsoft Learn をご確認ください。

  • 通信を制御するために、デフォルトでは送信をOFFに設定しています。クラウドに送信するためにはまず送信機能をONにする必要があります。

  • 送信機能をONにする方法は Module direct method 及び Module twin desired property の二つの方法があります。以下をご参照ください。

Module direct methodでONにする方法

Azure IoT Explorerで対象の Container Adamappを選択します。Adamapp for Azure IoT Edgeを選択します。

左側メニューから「Module direct method」を選択します。以下の画面でダイレクトメソッドが送信できます。

...

結果はポップアップ表示される。statusが200になっていれば成功です。

...

 

Module twin desired propertyで設定する方法

Azure IoT Explorerで対象のContainer AdamappのModule Adamapp for Azure IoT EdgeのModule twinを表示します。

“properties”.”desired”.”aplFileld” 内に以下のように設定します。

...

Info
  • 送信をやめる場合は、”telemetry” に false を設定してください。

  • Module twin では設定が反映されるまで数秒~10秒程度かかります。

  • Module twin はカメラとの設定値を常に同期させるように動作します。このため、desiredプロパティにtelemetry設定が残っている場合、 Module direct methodの設定を上書きします。 Module direct methodの設定を有効にするためには、 “telemetry”: ““ を設定して項目を削除してください。

 

設定値を確認する方法

設定値は、Module twinで確認できます。”properties”.”reported”.”aplField”.”azureSettings”.”telemetry” の値を確認してください。

...

 

受信したテレメトリデータの確認

Azure IoT Explorerで対象のContainer Adamappを選択します。Adamapp for Azure IoT Edgeを選択します。

左側のメニューから「Telemetry」を選択します。

...

アプリのADAM_SendTelemetry()で送信されたテレメトリを受信すると、ウィンドウ内に表示されます。ADAM_SendTelemetryに設定した文字列は、payloadキーの値として設定されます。

...

 

ログの確認方法

...

アプリのログ

アプリ内でADAM_DEBUG_PRINT()によって出力されるメッセージや、アプリからリンクしているライブラリが出力するログを見ることができます。エラーとなった場合も確認が可能です。

  • ホーム - Microsoft Azure にアクセスします。

  • 対象のIoT Hubを選択します。

  • 左側の「デバイス管理」「IoT Edge」から対象のカメラを選択します。

  • 下のモジュールのリストからログを見たいアプリ名の「ランタイムの状態」のリンクをクリックします。

...

Note

Container AdamappのログはAdamapp for Azure IoT EdgeのログはUDPLog - Technology Partner - Confluence (atlassian.net)で確認することはできません。

カメラのpflog

カメラ内のログを確認することで、Container Adamappが正しく動作していない場合の動作解析を行うこともできます。ログ取得方法は下記の実行ボタンより取得可能です。Adamapp for Azure IoT Edgeが正しく動作していない場合の動作解析を行うこともできます。ログ取得方法は下記の実行ボタンより取得可能です。

...

複数あるログファイルのうち、Container Adamappに関連の高いログファイルを紹介します。Adamapp for Azure IoT Edgeに関連の高いログファイルを紹介します。

  • cadam (ファイル名が pf_cadam, pf_cadamCgi から始まるファイル)
    cadamはContainer Adamappの管理をするプロセスとなります。Adamapp for Azure IoT Edgeの管理をするプロセスとなります。

  • Azure IoT Edgeランタイム (ファイル名が pf_aziot-certd, pf_aziot-edged, pf_aziot-identityd, pf_aziot-keyd から始まるファイル)
    Azure IoT EdgeランタイムはAzure IoT Hubとの通信を行います。

  • Docker (ファイル名が pf_docker, pf_containerd, pf_opa から始まるファイル)
    Dockerの動作に関するログとなります。opaはセキュリティチェックのために使用しており、作成した配置マニフェストに、カメラのセキュリティポリシーに違反する内容が記載されていた場合、このファイルにログが出力されます。

コンテナのセキュリティ強化

...

ここではコンテナアプリケーションの開発において、コンテナのセキュリティを強化するための手法について記載します。

...

No.

セキュリティ対策

説明

1

ベースイメージの選択

軽量で、信頼性の高いベースイメージを選択します。公式イメージまたはセキュリティが強化されたイメージを使用することを検討してください。i-PROのSDKではベースとなるイメージを提供していますので、追加で必要なものを除きそれらを使用してください。

2

イメージの脆弱性スキャン

コンテナイメージを定期的にツールでスキャンし、脆弱性を特定して修正します。

3

セキュアなDockerfileの作成

不要なパッケージをインストールしない、COPYではなくADDを使用する、ユーザ権限を最小限にするなど、Dockerfileをセキュアに作成します。このようなプラクティスは上記の脆弱性ツールにより多くが検出できます。

4

セキュリティコンテキストの適用

コンテナに適切な権限とリソース制限を設定することで、リスクを最小限に抑えます。i-PROカメラはこれらの設定内容を制限をしており、許可範囲外の設定でコンテナを起動しようとするとエラーとなります。このエラーを避けるために、i-PROから提供されるテンプレート設定をご使用ください。

5

コンテナのネットワークセキュリティ

ネットワーク設定を適切に構成し、不要なポートを開放しないようにします。また、コンテナ間の通信にもセキュリティポリシーを適用します。

6

ロギングと監視

コンテナの監視とログ収集を行い、異常やセキュリティインシデントを迅速に検出できるようにします。適切な範囲内の量、内容での出力ログの実装が必要です。

7

機密データの対策

機密データをコンテナ内に保持しないようにします。機密データを扱いたい場合やアプリケーションの設定を安全に管理するためには、セキュアなストレージソリューションを使用する等の対策が必要です。i-PROカメラでは一手段として named volume によるデータの保存環境を提供しています。

8

CI/CDパイプラインのセキュリティ

ビルド、テスト、デプロイの各ステージでセキュリティチェックを実施し、不正な操作や脆弱性のあるコードを検出・修正します。先述の脆弱性のスキャンツールの使用もその一つです。CI/CDパイプラインに適切なアクセス制御を設定し、セキュリティのベストプラクティスを遵守してください。

9

SBOMの作成と管理

脆弱性の管理やサプライチェーンリスクマネジメントのために、SBOMを作成・管理し、イメージに含まれるOSSを把握することを推奨します。

コンテナイメージに対して脆弱性チェッカーを実行する

コンテナのセキュリティを強化する方法の一つとして、コンテナイメージ内の脆弱性をツールを用いて抽出し、それら脆弱性を可能な限り取り除いたり修正したりする方法があります。

...

また、本図では脆弱性チェックの対象として、自身の開発プロダクトであるアプリコンテナイメージだけでなく、その開発途中でマルチビルド等の目的でベースとして使用するコンテナイメージ(例: Debian の公式イメージなど) についても対象としています。その理由は使用するパッケージに対しての脆弱性を漏れなく調べるためなのですが、詳細は改めてTrivyの説明の節において記述します。

Trivy: 包括的な脆弱性スキャナー

Trivyは、コンテナイメージやファイルシステムに存在する脆弱性を検出するオープンソースのスキャナです。主にOSパッケージやプログラミング言語のライブラリに関連する脆弱性を対象にしています。TrivyはAqua Security社によって開発・メンテナンスされており、コンテナ開発者にとって信頼性の高いツールの一つです。

...

以上、Trivy のようなツールを利用してコンテナイメージに含まれる脆弱性を定期的にチェックし、セキュリティリスクを低減させることが重要です。また、CI/CDパイプラインにTrivyを組み込むことで、自動化された脆弱性検出を実現し、開発プロセス全体のセキュリティを向上させることができます。

Dockle: コンテナイメージセキュリティリンター

Dockle は、コンテナイメージのセキュリティベストプラクティスに基づいて、潜在的な問題を特定するオープンソースのツールです。Dockleは、Dockerfile やイメージ設定など、主にシステム関連の脆弱性を検出します。GoodwithTech 社によって開発・メンテナンスされており、Trivy と同様にコンテナ開発者にとって有益なツールの一つです。

...

以上、Trivy と同様に Dockle のようなツールを利用してコンテナイメージに含まれるシステム関連の問題を定期的にチェックし、セキュリティリスクを低減させることが重要です。また、CI/CD パイプラインに Dockle を組み込むことで、自動化されたセキュリティベストプラクティスのチェックを実現し、開発プロセス全体のセキュリティを向上させることができます。

ホストリソースへのアクセスを強制的に制限する

セキュリティ上の理由から、i-PROカメラ上で動作するコンテナはアクセス可能なi-PROカメラのホスト側の権限やリソースが強制的に制限されています。Docker API に対し、i-PROに許可されていない権限やリソースの場所、範囲外の値のオプションを指定したコンテナを起動しようとした場合、ホスト側のチェック機構がそれら要求を拒否する仕組みが搭載されています (下記の図を参照)。

...

上記の制約下において、i-PROが許可しているオプション一式が事前設定されているテンプレートを SDK のビルド環境にて提供しています。このテンプレートにはコンテナアプリケーションが起動許可されるために必要かつ十分な設定となっており、上記のような権限やリソースに関する設定は変更せずにそのまま使用可能となっています (コンテナ名などの個別対応が必要なものを除く)。開発されるコンテナアプリケーションからアクセスが必要な権限やリソースに対して、上記テンプレートに事前設定されていない場合や、ご自身で追加、変更した設定がi-PROカメラのホスト側から拒否される場合には、設計、設定の見直しをお願いします。

WSL環境でうまくいかない場合のチェックポイント

...

WSL環境でうまくいかない場合は以下をチェックしてください。

  • Visual Studio Codeの「LOCAL」の拡張機能で以下が有効になっていること

    • Dev Containers

    • Remote - SSH, Remote - SSH: Editing Configuration FIles, Remote - Tunnels, Remote Development, Remote Explorer

    • WSL

  • Visual Studio Codeの「WSL: UBUNTU-20.04 」の拡張機能で以下が有効になっていること

    • Azure Account

    • Azure IoT Edge

    • Azure IoT Hub

  • Visual Studio Codeの画面左下が「WSL: Ubuntu-20.04」と表示されていること

  • Build IoT Edge Solutionでpermission denied と表示される場合、対象のディレクトリに現在のユーザーのアクセス権があるかどうか確認する。

    Code Block
    sudo chown -r ipro:ipro [開発ディレクトリ]
    ※ipro:ipro は例ですので、各環境に合わせて設定ください。

    を実行して所有者を変更。

商標について

サイトで使用している商標について掲載します。

Docker and the Docker logo are trademarks or registered trademarks of Docker, Inc. in the United States and/or other countries. Docker, Inc. and other parties may also have trademark rights in other terms used herein

...