目次
...
Table of Contents | ||||
---|---|---|---|---|
|
はじめに
...
ここでは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版アプリのパス Python版アプリのパス |
...
${SDK_DIR}
\src\adamapp\test_app\container\deployment.template.json
内の “registryCredentials” を以下のように入力します。Code Block "registryCredentials": { "[コンテナレジストリ名]": { "username": "$CONTAINER_REGISTRY_USERNAME_[コンテナレジストリ名]", "password": "$CONTAINER_REGISTRY_PASSWORD_[コンテナレジストリ名]", "address": "[ログインサーバー]" } }
例えば i-PRO が運営するコンテナレジストリの場合は以下のようになります。
${SDK_DIR}
\src\adamapp\test_app\container\modules\test_app\module.json
内の “repository” を以下のように入力します。Code Block "repository": "[ログインサーバー]/[リポジトリ名]/test_app"
例えばコンテナレジストリログインサーバーが iprocamsdk.azurecr.io、リポジトリ名が dev/company-aの場合は以下のようになります。
${SDK_DIR}
\src\adamapp\test_app\container
ディレクトリ内に.envファイルを作成し、コンテナレジストリのユーザー名、パスワードを記載して保存します。Code Block CONTAINER_REGISTRY_USERNAME_[コンテナレジストリ名]=[ユーザー名] CONTAINER_REGISTRY_PASSWORD_[コンテナレジストリ名]=[password]
例を以下に示します。
アプリのコーディング
このまま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を右クリックするとビルドメニューが表示されます。
...
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 |
---|
|
設定値を確認する方法
設定値は、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
...