Amazon Web Services ブログ

AWS IoT Greengrass PubSub SDK を使用して分散 IoT アプリケーションを開発する方法

この記事は Dean Colcott によって書かれた How to develop distributed IoT applications using the AWS IoT Greengrass PubSub SDK を翻訳したものです。

はじめに

IoT アプリケーションは、分散サービスがイベントトリガーメッセージを介して通信する Publish/Subscribe (PubSub) モデルと同義です。PubSub モデルは設計の柔軟性を提供し、イベント駆動型の分散 IoT システムに最適です。しかし、この柔軟性は、システム、サービス、およびチーム全体に依存関係を生み出す多くの設計上の決定を開発者の手に委ねます。この投稿では、 AWS IoT Greengrass PubSub SDK for Python を使用して、 AWS IoT Greengrass によってデプロイおよび管理される分散 IoT PubSub アプリケーションの開発を加速し、簡素化する方法を学習します。

ソリューションの概要

Python 用 AWS IoT Greengrass PubSub SDK (以下、SDK と呼びます) は、AWS IoT Greengrass V2 コンポーネント用の Python ライブラリとして利用でき、確固とした思想に基づいた IoT PubSub アプリケーションアーキテクチャを提供します。本 SDK は AWS IoT Greengrass PubSub 機能を抽象化し、AWS IoT Greengrass IPC/MQTT メッセージをユーザー定義のアプリケーションコールバックに自動的にルーティングするためのデータ駆動型メッセージフォーマットを定義します。これにより、SDK は、PubSub トピックスキーマを目的のインターフェイス機能から切り離すノー/ローコードなメッセージングサービスを提供します。

以下の図は、AWS IoT Greengrass PubSub SDK for Python のアーキテクチャの概要を示しています。

一般的な IoT PubSub サービスでは、メッセージペイロードのフォーマットとトピックスキーマが API 機能と密接に結びついています。このアプローチを使用すると、上流の依存関係を管理するのが複雑で困難になります。また大きな課題として、PubSub メッセージの処理とルーティングを管理する定型コードを繰り返し開発する必要があります。

次の図は、メッセージフォーマットとトピック、および個々のサービス機能が緊密な統合と依存関係を持つ、典型的な分散 IoT アプリケーションのサービスインターフェイスを示しています。

AWS IoT Greengrass PubSub SDK for Python は、以下を提供することでこれらの主要な依存関係と課題を解決します。

  1. 定義済みのメッセージフォーマット: SDK は、PubSub トピックをインターフェイス機能から切り離すためのデータ駆動型メッセージルーティングをサポートする制御フィールドを備えた、定義済みでありながら拡張可能なメッセージフォーマットを提供します。
  2. 簡略化されたトピックスキーマ: SDK は、データ駆動型のメッセージルーティングによって可能になった単一の ingress および egress トピックで構成される、シンプルでありながら拡張可能なトピックスキーマを定義します。
  3. メッセージングサービスの定形コード: SDK は AWS IoT Greengrass IPC および MQTT PubSub 機能を抽象化し、PubSub メッセージを処理してユーザー定義のアプリケーションコールバックにルーティングします。

次の図は、AWS IoT Greengrass PubSub SDK を使用することでメッセージフォーマットとトピックスキーマがサービス機能に結合されなくなった上図と同様のサービスインターフェイスを示しています。これは、データ駆動型のメッセージルーティングによって可能になり、これらの公開されたサービス属性に対する上流依存と変更管理を排除します。

PubSub メッセージの処理とルーティング

メッセージフォーマット

本 SDK のメッセージルーティングは、以下に示す所定のメッセージ形式の route フィールドによって制御されます。

{
  "sdk_version": "0.1.0",
  "message_id": "20220403170948930231",
  "status": 200,
  "route": "MyPubSubMessageHandler.pubsub_message_callback_function",
  "message": {
    "my-message-param01": "param01",
    "my-message-param02": "param02"
  }
}


route
フィールドは、Class.Function の名前空間規約を使用し、アプリケーションロジック内の (単なる Python の) コールバック関数としてルートターゲットを記述します。

  1. sdk_version: 分散システム全体でメッセージのバージョン管理を提供します。デフォルトでは、SDK はメジャーバージョンが異なるメッセージを拒否します。
  2. message_id: これは通常、タイムスタンプですが、任意のユーザー定義文字列を使用できます。この属性は、非同期のリクエスト/レスポンスパターンでメッセージを追跡するために使用されます。
  3. status: メッセージ要求、応答、または更新のステータスを表します。message_id と併用すると、success/failure トピックや、これに対応するメッセージフォーマットを必要とせずに、非同期のリクエスト/レスポンスメッセージ内でステータスを報告できます。
  4. route: すでに説明されているように、Class.Function の名前空間規約で、ユーザー定義のアプリケーションコールバックに PubSub メッセージをルーティングするために SDK によって使用されます。
  5. message: SDK のフォーマットメッセージにおける、ユーザー定義のペイロードフィールドです。SDK はこれを変更せず、他のフィールドとともにユーザー定義のコールバックに転送します。

次の図は、SDK 定義のメッセージフォーマットが、どのようにユーザー定義のアプリケーションコールバックにメッセージをルーティングするのかを詳しく説明しています。

  1. SDK とともにデプロイされた AWS IoT Greengrass コンポーネントは、SystemMessageHandler.health_check という有効な route フィールドを持つフォーマットに従ったメッセージを受信します。
  2. SDK はメッセージを処理し、フォーマットと  SDK バージョンをチェックし、route がユーザー定義のアプリケーションコールバックと一致するかどうかを判断し、それに応じてメッセージをルーティングします。
  3. PubSub メッセージは health_check 関数に転送され、すべての SDK メッセージフィールドはユーザーアプリケーションロジックによる処理用にパラメータ化されます。
  4. ここでは、health_check 関数が、新たなレスポンスをフォーマットに従って作成して、受け取ったペイロードの健全性と、新たな route を設定し、上流システムの message_id を反映すると仮定します。
  5. SDK は health_check 関数からメッセージ発行リクエストを受け取り、メッセージを適切な PubSub トピックに転送します。

このデータ駆動型メッセージルーティングにより、わずかな変更だけでサービスインターフェイスの機能を更新できます。たとえば、上記のシステムヘルスチェックリクエストをサポートするインターフェイスを追加するには、アプリケーションのメッセージハンドラに適切なコールバック関数を追加し、ルートを上流のサービスに伝えます。PubSub トピックスキーマに変更はなく、コードの変更はごくわずかで、中断がなく、既存のインターフェイス機能との下位互換性があります。

トピックスキーマ

メッセージベースのルーティングフィールドにより、本 SDK のトピックスキーマは Ingress および Egress トピックの 2 つのトピックのみで構成できます。

  • Ingress トピック: BASE_TOPIC/AWS_IOT_THING_NAME/ingress
  • Egress トピック: BASE_TOPIC/AWS_IOT_THING_NAME/egress

ここで、BASE_TOPIC は、SDK を利用した AWS IoT Greengrass コンポーネントを初期化するときに提供される、ユーザー定義のパラメータ化されたフィールドです。通常は、コンポーネント名を設定します。

この単純なトピックスキーマは、コンポーネントレシピ (JSON) ファイルからのパラメータ注入によって拡張できるため、コード変更なしでトピックスキーマの変更やカスタムサブスクリプションが可能です。このようにして、SDK はサービス間のインターフェースを管理するため、開発者は高品質のアプリケーションロジックの提供に専念できます。

AWS IoT Greengrass PubSub SDK のデプロイ

AWS IoT Greengrass PubSub SDK を開始してデプロイする最も簡単な方法は、SDK GitHub リポジトリで提供されているサンプルコンポーネントを複製し、AWS IoT Greengrass Development Kit (GDK) を介してデプロイすることです。このプロセスを詳細に説明するリソースは 2 つあります。

  • SDK サンプルディレクトリ: SDK がインストールされたサンプル AWS IoT Greengrass コンポーネントを提供します。単一のコンポーネントをデプロイし、シンプルな MQTT PubSub リクエスト/レスポンスメッセージを送信するには、サンプルディレクトリで提供されるガイドに従ってください。
  • Build a Distributed IoT Application with the AWS IoT Greengrass PubSub SDK ワークショップ: このワークショップでは、SDK を使用して Amazon SQS と統合したスマートファクトリー用の分散 IoT PubSub アプリケーションを構築します。

参考文献

AWS IoT Greengrass PubSub SDK には、以下のリンクで提供される詳細な開発者ガイドと API ドキュメントが付属しています。

AWS IoT Greengrass と AWS IoT の詳細については、次のリンクを参照してください。

まとめ

この投稿では、分散 IoT PubSub アプリケーションを設計する際に開発者が直面する一般的な課題について説明しました。AWS IoT Greengrass PubSub SDK を紹介し、このソリューションを使用することでこれらの課題や依存関係の多くにどのように対処できるかを説明しました。構築を開始するには、Build a Distributed IoT Application with the AWS IoT Greengrass PubSub SDK ワークショップを試すことをお勧めします。

著者について


Dean Colcott は、アマゾン ウェブ サービス (AWS) における IoT およびロボティクスのシニアスペシャリストソリューションアーキテクトであり、分散アプリケーションとフルスタック開発、ビデオ分析とコンピュータービジョン、産業用 IoT とエンタープライズデータプラットフォームを専門分野としています。エンタープライズデータ戦略の一環として、IoT や産業データ、データを生成する物理資産から関連性、価値、洞察をもたらすことにフォーカスしています。


この記事はソリューションアーキテクトの岡本晋太朗が翻訳しました。