Amazon Web Services ブログ

AWS IoT Greengrass を使用してエッジでリモート ジョブ監視アプリケーションを開発する (パート 2)

このブログは、Julia HuMartin LehoferJoyson Neville LewisTanya Lobo ParmarRajeev Pulleti によって書かれた Developing a Remote Job Monitoring Application at the edge using AWS IoT Greengrass (part 2) を翻訳したものです。

イントロダクション

この 2 回目のブログ投稿では、AWS パートナー、TensorIoT、および AWS プロフェッショナルサービスが共同で開発したソリューションである AWS IoT Greengrass V2 を使用したエッジでのユーザーインターフェイス (UI) アプリケーションを引き続き紹介します。

ブログのパート 1 には、このアプリケーションのユースケース 1 の次の手順が含まれています。JSON ファイルアップロードコンポーネントと UI アプリケーションを介して IoT ジョブメタデータを取り込みます。

  • Amazon Simple Storage Service (Amazon S3) バケット、AWS IoT Greengrass V2 および依存関係をセットアップする方法。
  • エッジデバイスで UI および JSON ファイルアップロード アプリケーションを起動する方法。

このパート 2 の投稿では、エッジでのこの UI アプリケーションの次のユースケース 2 の構築を続けます。

ユースケース 2 のソリューション概要

オペレーターは、ストリーミング IoT データに基づいてほぼリアルタイムで判断する必要があります。データをインタラクティブな UI アプリケーションで低レイテンシーで表示できれば、オペレーターが正しい決定を下すのに役立ちます。このアプリケーションを使用すると、オペレータは現場で遅滞なく適切な判断を下し、プラントの運用効率を向上させることができます。

このエッジ UI アプリケーションには、風力タービン施設からの出力をシミュレートするダミーのパブリッシャーコンポーネントがあります。このダミーパブリッシャーからのパブリッシュ頻度は 10 秒に 1 回です。WebSocket コンポーネントは、AWS IoT AWS IoT Greengrass V2 とのプロセス間通信 (IPC) pubsub を介してダミーパブリッシャーからのストリーミングデータにサブスクライブし、WebSocket 通信を介してエッジ UI アプリにデータを送信します。フロントエンドアプリは IPC pubsub 通信をサポートしていないため、リアルタイムの IoT データをバックエンドサーバーから asyncio 経由でエッジでホストされているフロントエンドアプリに継続的にストリーミングするために、WebSocket 通信を選択しました。パブリッシャーコンポーネントから受信したストリーミングデータの速度を考慮して、python モジュールキューを使用して、メッセージをバックエンドサーバーに提供する前に、First-In-First-Outを使用してメッセージを格納します。WebSocket 通信に加えて、JavaScript MQTT クライアントライブラリなどのローカルブローカーを Web アプリケーションに使用できるようになりました。

このダミーのパブリッシャーコンポーネントは、デモンストレーション目的でのみ使用されることに注意してください。産業プラントの設定では、風力タービンへの適切な産業用データコネクタ (SCADA システムなど) に置き換えられます。

このブログでは、AWS IoT Greengrass V2 のビルド済みログマネージャーコンポーネントと Amazon CloudWatch を使用して、この AWS IoT Greengrass V2 コンポーネントのヘルスステータスを管理する方法も示します。

次の手順 6 ~ 9 では、次の方法について説明します。

  • 風力タービン施設からの出力をシミュレートするダミーのパブリッシャーコンポーネントを起動します。このダミー パブリッシャーからのパブリッシュ頻度は 10 秒に 1 回です。
  • AWS IoT Amazon Greengrass V2 で IPC pubsub 経由でダミーパブリッシャーからのストリーミング データにサブスクライブする WebSocket コンポーネントを起動し、WebSocket 通信経由でエッジ UI アプリにデータを送信します。
  • ログマネージャーコンポーネントのデプロイを構成して、エッジコンポーネントの正常性を監視します。
  • IoT ジョブモニターアプリケーションをテストします。

前提条件

ユースケース 2 用にこの UI アプリケーションを構築するには、パート 1 で説明したように、エッジデバイスに AWS IoT Greengrass V2 と依存関係をインストールする必要があります。また、パート 1 の顧客 UI コンポーネントをエッジデバイスで起動する必要があります。これらの手順を完了していない場合は、先に進む前にパート 1 の手順 1 ~ 5 を確認してください。

ユースケース 2 の手順

次の手順では、リアルタイムの IoT ジョブ監視のためにエッジで UI アプリを開発するための詳細な手順を説明します。この投稿では、簡潔にするために主要なソリューションのマイルストーンを取り上げていますが、読者は詳細とソースコードについて GitHub リポジトリにアクセスする必要があることに注意してください。

ステップ 6: ダミー パブリッシャーを起動する

風力タービンの出力をシミュレートするために、ダミーのパブリッシャーコンポーネントは、風力タービンの測定値: 品質管理、ツールの状態、動作パラメータ、電力曲線、有効電力の lv、風速、風向といった測定値に関連するランダムなデータをパブリッシュします。このコンポーネントを起動するには、次の手順を使用してください。

1. GIT リポジトリAmazon Elastic Compute Cloud (Amazon EC2) インスタンスに clone されたディレクトリで、ディレクトリを components/com.example.Publisher/aws-gg-deploy に変更します。

2. _setEnv() セクションで次のプレースホルダーをカスタマイズした値に置き換えて、デプロイスクリプト deploy-edge.sh を変更します。

YOUR_AWS_ACCOUNT_NUMBER 
YOUR_AWS_REGION 
S3_BUCKET for edge component artifacts 
ROLE_ARN

Ctrl-X を押してから Y を押して、変更した deploy-edge.sh ファイルを同じ名前で保存します。

3. 次のスクリプトを実行して、このコンポーネントをデプロイします。:

export AWS_ACCESS_KEY_ID=REPLACE-WITH-YOUR-AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY= REPLACE-WITH-YOUR-AWS_SECRET_ACCESS_KEY
export AWS_SESSION_TOKEN= REPLACE-WITH-YOUR-AWS_SESSION_TOKEN
chmod 744 deploy-edge.sh
./deploy-edge.sh

この bash スクリプトが完了するまでに約 10 秒かかります。存在したら、AWS IoT Greengrass コンポーネントのログファイルをチェックして、ダミーのパブリッシャーコンポーネントがメッセージを発行することを確認してください。:

sudo tail –200f ./greengrass/v2/logs/com.uipublisher.log

10 秒ごとに 1 回の頻度で発行された新しい JSON メッセージでログが更新されていることがわかります。WebSocket コンポーネントがサブスクライブするために、メッセージは IPC トピック: runscreen/topic に送信されます。

図 1: パブリッシャーコンポーネントによってパブリッシュされたメッセージを示すログファイル

ステップ 7: WebSocket コンポーネントを起動する

WebSocket コンポーネントは、IPC トピック: runscreen/topic にサブスクライブし、測定値を含むメッセージを受信します。このコンポーネントは、asyncio サーバー経由でメッセージデータを提供するため、UI は WebSocket サーバーからデータを受信できます。

WebSocket コンポーネントを起動するには:

1.ディレクトリを GIT リポジトリが Amazon EC2 インスタンスに複製された、ディレクトリ components/com.websocketApp/aws-gg-deploy に変更します。

2. _setEnv() セクションで次のプレースホルダーをカスタマイズした値に置き換えて、デプロイスクリプト deploy-edge.sh を変更します。:

YOUR_AWS_ACCOUNT_NUMBER
YOUR_AWS_REGION
S3_BUCKET for edge component artifacts
ROLE_ARN

Ctrl-X を押してから Y を押して、変更した deploy-edge.sh ファイルを同じ名前で保存します。

3. 次のスクリプトを実行して、このコンポーネントをデプロイします。:

export AWS_ACCESS_KEY_ID=REPLACE-WITH-YOUR-AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY= REPLACE-WITH-YOUR-AWS_SECRET_ACCESS_KEY
export AWS_SESSION_TOKEN= REPLACE-WITH-YOUR-AWS_SESSION_TOKEN
chmod 744 deploy-edge.sh
./deploy-edge.sh

この bash スクリプトが完了するまでに約 10 秒かかります。存在したら、AWS IoT Core コンソールで次のコンポーネントが作成されていることを確認してください。:

図 2: WebSocket コンポーネントのステータス

ステップ 8: ログ マネージャー コンポーネントの展開を構成する

ログマネージャーコンポーネント (aws.greengrass.LogManager) は、コンポーネントログを AWS IoT Greengrass コアデバイスから Amazon CloudWatch ログにアップロードします。このビルド済みコンポーネントは、開発者の労力を最小限に抑えて、カスタムコンポーネントのステータスを効果的に監視できます。ログマネージャーコンポーネントは、パブリックコンポーネントのリストからコンポーネントを選択することで、AWS IoT Core から現在のデプロイに追加できます。

図 3: ログマネージャーコンポーネントのステータス

ログマネージャーコンポーネントを選択し、configure component を選択して構成を変更します。

構成マージで、個々のコンポーネントのコンポーネントログの次の構成を追加します:

{
  "logsUploaderConfiguration": {
    "componentLogsConfigurationMap": {
      "com.example.Publisher ": {
        "minimumLogLevel": "INFO",
        "diskSpaceLimit": "20",
        "diskSpaceLimitUnit": "MB",
        "deleteLogFileAfterCloudUpload": "false"
      },
      "com.WebsocketApp ": {
        "minimumLogLevel": "INFO",
        "diskSpaceLimit": "20",
        "diskSpaceLimitUnit": "MB",
        "deleteLogFileAfterCloudUpload": "false"
      },
      "com.fileUploader ": {
        "minimumLogLevel": "INFO",
        "diskSpaceLimit": "20",
        "diskSpaceLimitUnit": "MB",
        "deleteLogFileAfterCloudUpload": "false"
      }
    }
  }
}

図 4: ログマネージャーコンポーネントの構成の更新

その他の構成変更の選択肢については、このドキュメントを参照してください。

ログマネージャーで再デプロイした後、コンポーネントログは Amazon CloudWatch ログに次のように表示されます。:

図 5: CloudWatch ロググループのコンポーネントログ

開発者は、Amazon CloudWatch メトリクスを設定してコンポーネントのログを監視し、Amazon CloudWatch のダッシュボードでメトリクスを視覚化することで、コンポーネントの正常性ダッシュボードを開発することもできます。

ステップ 9: IoT ジョブモニター UI ページをテストする

パート 1 では、JSON ファイルをアップロードして、IoT ジョブのメタデータを提供できます。 JSON ファイルが UI ページ: http://localhost:8080 /fileUpload を介してアップロードされた後、UI アプリケーションは自動的に 2 番目の UI ページ: http://localhost:8080 /Job に切り替わります。このページには、センサーデータを含む、WebSocket サーバーから取得されたストリーミングデータが表示されます。たとえば、パワーカーブ、風速、風向、LV有効電力といったものです。検査ジョブのステータスが正常に表示されている場合、UI ページには、以下のように関連するジョブ情報が緑色のフォントで表示されます。:

図 6: ジョブページには通常のジョブステータスが表示されます。

検査ジョブのステータスが異常な場合、UI ページは赤で表示され、品質管理の結果は Action Needed として表示されます。

図 7: ジョブページにジョブステータスが異常として表示されます。

この http://localhost:8080 /Job UI ページを使用すると、検査担当者はほぼリアルタイムのストリーミングセンサーデータを使用してリモートジョブ監視を実行できます。また、UI から品質管理情報を取得して、詳細な診断を行うこともできます。

クリーンアップ

(1) AWS IoT

AWS IoT の下にある AWS IoT Core コンソールを開きます。

  1. AWS IoT Greengrass Core Device タブで、DemoJetson コアデバイスを選択し、右上の delete をクリックします。
  2. Manage >Thing Group で、Thing Group から DemoJetsonGroup を削除します。
  3. Manage >Things の下にあるモノを削除します: DemoJetson
  4. Policies > GreengrassV2IoTThingPolicyGreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias を削除します
  5. Secure > Role Aliases の下で、GreengrassV2TokenExchangeRoleAlias を削除します

(2) Amazon S3

  1. Amazon S3 コンソールに移動し、以前ブログで使用したコンポーネント用のバケットを見つけます。
  2. コンポーネント用のバケットを空にします。
  3. コンポーネント用のバケットを削除します。
  4. ストリームマネージャーからのデータでバケットを空にします。
  5. ストリームマネージャーからデータを含むバケットを削除します。

(3) Amazon EC2 termination

  1. Amazon EC2 コンソールに移動します。
  2. Instance State で Stop Instance を選択して、インスタンスを停止します。
  3. インスタンスが停止したら、Instance State で Terminate Instance を選択します。

(4) IAM Roles

  1. IAM コンソールに移動します。
  2. Ubuntu EC2 インスタンスから作成された IAM ロールを削除します。
  3. AWS EC2 SSM アクセス ポリシーを削除します。
  4. Amazon Greengrass V2 用に作成された IAM ユーザーを削除します。
  5. Amazon Greengrass V2 ユーザーにアタッチされたポリシーを削除します。

(5) Amazon CloudWatch

  1. 関連する CloudWatch メトリクスを Amazon CloudWatch コンソールから削除する

これで、ブログ用に作成されたリソースの削除が完了しました。

次のステップに向けて

1. このブログでは、デモンストレーション目的でダミーパブリッシャーを使用して、風力タービンのデータソースをシミュレートしています。このアプリケーションを産業環境で実装する場合、さまざまなデータソースを使用できます。 (PLC、コントローラー、従来のデータサーバーなど)データソースコネクタとして使用できる Greengrass コミュニティコンポーネントがいくつかあります。このようなコミュニティコンポーネントは、AWS IoT Greengrass v2 を介してエッジデバイスにデプロイできます。

2. このブログで説明されている WebSocket コンポーネントは、さらに拡張して、カスタムデータ分析ワークフローを含めることができます。

まとめ

この 2 部構成のシリーズでは、リモート IoT ジョブの監視とプロセスの利点と課題を確認しました。このような課題に対処するために、エッジソリューションでの UI アプリケーションを提案しました。AWS プロフェッショナルサービスと AWS パートナーである TensorIoT によって共同開発されています。ソリューション開発段階で、両社の開発者は最新の AWS IoT Greengrass V2 ランタイムを使用して、IoT エッジアプリケーションの開発を大幅に加速しました。このアプリケーションで開発されたモジュール化されたコンポーネントは、AWS IoT Device Management と AWS IoT Greengrass を使用して、何千もの IoT デバイスに簡単にデプロイおよび更新できます。将来、TensorIoT は、この IoT UI アプリをエッジで開発する際に学んだ経験に基づいて、さまざまなユースケース向けのカスタムアプリケーションをさらに構築できるようになります。

Julia Hu は、アマゾンウェブサービスのシニア AI/ML ソリューションアーキテクトです。彼女は IoT アーキテクチャと応用データサイエンスの分野で豊富な経験を持ち、機械学習と IoT 技術分野コミュニティの両方に参加しています。彼女は、新興企業から大企業まで、さまざまな顧客と協力して、エッジとクラウドで AWSome IoT 機械学習 (ML) ソリューションを開発しています。彼女は、最新の IoT およびビッグデータテクノロジを活用して、ML ソリューションをスケールアップし、待ち時間を短縮し、業界での採用を加速することを楽しんでいます。
Martin Lehofer は、Amazon Web Services の産業データのプラクティスマネージャーです。Martinは、幅広い業種とアプリケーションで、予知保全、データ分析、分散コンピューティングから人工知能まで幅広いインダストリアル IoT の経験を持っています。AWS プロフェッショナルサービスで、Martin はアーキテクトとエンジニアのチームを率いて、戦略的な産業顧客がデータ分析を使用してビジネス成果を達成できるように支援しています。
Joyson Neville Lewis は、AWS プロフェッショナルサービスの IoT データアーキテクトです。彼はソフトウェア/データ エンジニアとして働いた後、会話型 AI および産業用 IoT の分野に飛び込み、企業と協力して、音声アシスタント/チャットボットおよび IoT ソリューションを使用してビジネスと AI の間の点を結びつけました。
Tanya Lobo Parmar は、TensorIoT のディレクターであり、EMEA 地域での運用を監督しています。彼女は、AWS クラウドを使用して近代化および成長するために、ヨーロッパ市場でより多くの顧客を獲得することに重点を置いています。また、IoT、機械学習、マネージド AI の挑戦的なプロジェクトの管理も楽しんでいます。
Vidya Ramaswamy は AWS パートナーである TensorIoT のシニアソフトウェアエンジニアであり、ソフトウェア開発で 8 年以上の経験があります。彼女はさまざまな IoT ソリューションのコーディングと開発を楽しんでいます。
Rajeev Pulleti は TensorIoT のフロントエンドエンジニアであり、Swift、Objective-C、Javascript に精通しています。

このブログは、ソリューションアーキテクトの戸塚智哉が翻訳しました。