AWS IoT Device Shadow サービス - AWS IoT

AWS IoT Device Shadow サービス

AWS IoT Device Shadow サービスは AWS IoT Thing オブジェクトにシャドウを追加します。シャドウは、デバイスが AWS IoT に接続されているかどうかにかかわらず、アプリやその他のサービスでデバイスの状態を利用できるようにします。AWS IoT Thing オブジェクトは複数の名前付きシャドウを持つことができるため、IoT ソリューションではデバイスを他のアプリやサービスに接続するためのオプションが増えます。

AWS IoT Thing オブジェクトには、明示的に作成されるまで名前付きシャドウはありません。ただし、モノが作成されると、名前のないクラシックなシャドウが作成されます。シャドウは、AWS IoT コンソールを使用して作成、更新、削除できます。デバイス、その他のウェブクライアント、サービスは、MQTT および予約された MQTT トピックDevice Shadow REST API を使用する HTTP、AWS IoT CLI を使用して、シャドウを作成、更新、削除できます。シャドウは AWS によってクラウドに保存されるため、デバイスが接続されていないかどうかにかかわらず、アプリやその他のクラウドサービスからデバイスの状態データを収集して報告できます。

シャドウの使用

シャドウは、デバイス、アプリ、その他のクラウドサービスでデータを共有するための信頼性の高いデータストアを提供します。これにより、デバイス、アプリ、その他のクラウドサービスが、デバイスの状態を失うことなく接続および切断できます。

デバイス、アプリ、その他のクラウドサービスは AWS IoT に接続している間、シャドウを介してデバイスの現在の状態にアクセスし、制御できます。たとえば、アプリはシャドウを更新することで、デバイスの状態の変更を要求できます。AWS IoT は、デバイスへの変更を示すメッセージを発行します。デバイスはこのメッセージを受信し、一致するように状態を更新し、更新された状態のメッセージを発行します。Device Shadow サービスは、この更新された状態を対応するシャドウに反映します。アプリはシャドウの更新をサブスクライブすることも、シャドウに現在の状態を照会することもできます。

デバイスがオフラインになった場合でも、アプリは AWS IoT およびデバイスのシャドウと通信できます。デバイスは再接続すると、シャドウの現在の状態を受信し、シャドウの状態と一致するように状態を更新し、更新された状態のメッセージを発行します。同様に、アプリがオフラインになり、デバイスがオフライン中に状態が変わると、デバイスはシャドウを更新したままにして、アプリが再接続したときに現在の状態のシャドウを照会できるようにします。

名前付きのシャドウまたは名前のないシャドウの使用の選択

Device Shadow サービスは、過去に使用されていたように、名前付きのクラシックなシャドウと名前のないクラシックなシャドウをサポートします。Thing オブジェクトは、複数の名前付きシャドウを持つことができます。また、名前のないクラシックなシャドウを 1 つ以上持つことはできません。Thing オブジェクトは、名前付きのシャドウと名前のないシャドウを同時に持つことができますが、それぞれにアクセスするために使用する API は若干異なるため、ソリューションに最適なシャドウのタイプを決定し、そのタイプのみを使用する方が効率的です。シャドウにアクセスするための API の詳細については、「シャドウトピック」を参照してください。

名前付きシャドウを使用すると、Thing オブジェクトの状態をさまざまなビューで作成できます。たとえば、多数のプロパティを持つ Thing オブジェクトを、それぞれがシャドウ名で識別される論理的なプロパティのグループを持つシャドウに分割できます。また、プロパティを別のシャドウにグループ化し、ポリシーを使用してアクセスを制御することで、プロパティへのアクセスを制限することもできます。

クラシックな名前のないシャドウは単純ですが、名前付きシャドウよりも多少制限があります。各 AWS IoT Thing オブジェクトは、名前のないシャドウを 1 つだけ持つことができます。IoT ソリューションでシャドウデータの必要性が限られている場合は、そのようにシャドウの使用を開始することができます。ただし、将来、シャドウを追加すると思われる場合は、最初から名前付きのシャドウを使用することを検討してください。

シャドウにアクセスする

すべてのシャドウには、予約された MQTT トピックHTTP URL があり、シャドウに対するgetupdatedelete アクションをサポートします。

シャドウは JSON シャドウドキュメントを使用してデータを格納および取得します。シャドウのドキュメントには、デバイスの状態の次の側面を説明する state プロパティが含まれています。

  • desired

    アプリは、desired オブジェクトを更新することによって、デバイスプロパティの desired 状態を指定します。

  • reported

    デバイスは、reported オブジェクト内の現在の状態を報告します。

  • delta

    AWS IoT は、delta オブジェクト内の desired 状態と reported 状態の違いを報告します。

シャドウに格納されるデータは、更新アクションのメッセージ本文の state プロパティによって決まります。それ以降の更新アクションでは、既存のデータオブジェクトの値を変更したり、シャドウの state オブジェクト内のキーやその他の要素を追加および削除したりできます。シャドウへのアクセス方法の詳細については、「デバイスでのシャドウの使用」および「アプリとサービスでのシャドウの使用」を参照してください。

重要

更新リクエストを行うアクセス許可は、信頼できるアプリとデバイスに制限する必要があります。これにより、シャドウの state プロパティが予期せず変更されるのを防ぐことができます。そうしないと、シャドウを使用するデバイスおよびアプリは、state プロパティのキーが変更されることを期待するように設計する必要があります。

デバイス、アプリ、その他のクラウドサービスでのシャドウの使用

デバイス、アプリ、その他のクラウドサービスでシャドウを使用するには、これらすべての一貫性と調整が必要です。AWS IoT Device Shadow サービスは、シャドウ状態を保存し、シャドウ状態が変化したときにメッセージを送信し、状態が変化するメッセージに応答します。IoT ソリューション内のデバイス、アプリ、その他のクラウドサービスは、その状態を管理し、デバイスシャドウの状態と整合性を維持する必要があります。

シャドウ状態データは動的であり、シャドウへのアクセス許可を持つデバイス、アプリ、その他のクラウドサービスによって変更できます。このため、各デバイス、アプリ、その他のクラウドサービスがシャドウとどのようにやり取りするかを検討することが重要です。以下に例を示します。

  • デバイスは、状態データをシャドウに伝達するときに、シャドウ状態の reported プロパティにのみ書き込む必要があります。

  • アプリおよびその他のクラウドサービスは、状態変更リクエストをシャドウを介してデバイスに通信するときのみ、desired プロパティに書き込む必要があります。

重要

シャドウデータオブジェクトに含まれるデータは、他のシャドウや Thing オブジェクトのプロパティ (Thing の属性や MQTT メッセージのコンテンツなど) から独立しています。ただし、デバイスは、必要に応じて、異なる MQTT トピックとシャドウで同じデータを報告できます。

複数のシャドウをサポートするデバイスは、異なるシャドウで報告するデータの整合性を維持する必要があります。

メッセージの順序

AWS IoT サービスからのメッセージが特定の順序でデバイスに到達するとは限りません。次のシナリオは、この場合に何が起こるかを示しています。

初期状態ドキュメント:

{ "state": { "reported": { "color": "blue" } }, "version": 10, "timestamp": 123456777 }

更新 1:

{ "state": { "desired": { "color": "RED" } }, "version": 10, "timestamp": 123456777 }

更新 2:

{ "state": { "desired": { "color": "GREEN" } }, "version": 11, "timestamp": 123456778 }

最終状態ドキュメント:

{ "state": { "reported": { "color": "GREEN" } }, "version": 12, "timestamp": 123456779 }

これにより、2 つの差分メッセージが生成されます。

{ "state": { "color": "RED" }, "version": 11, "timestamp": 123456778 }
{ "state": { "color": "GREEN" }, "version": 12, "timestamp": 123456779 }

デバイスは順不同でこれらのメッセージを受信する場合があります。これらのメッセージ内の状態は累積的であるため、デバイスは追跡しているものより古いバージョン番号が含まれるメッセージをすべて安全に破棄できます。デバイスはバージョン 11 の前にバージョン 12 の差分を受信した場合、バージョン 11 のメッセージを安全に破棄できます。

シャドウメッセージのトリム

デバイスに送信されるシャドウメッセージのサイズを小さくするには、デバイスに必要なフィールドのみを選択してから、デバイスのリッスン対象の MQTT トピックにメッセージを再パブリッシュするルールを定義します。

ルールは JSON で指定し、以下のようになります。

{ "sql": "SELECT state, version FROM '$aws/things/+/shadow/update/delta'", "ruleDisabled": false, "actions": [ { "republish": { "topic": "${topic(3)}/delta", "roleArn": "arn:aws:iam::123456789012:role/my-iot-role" } } ] }

SELECT ステートメントにより、指定したトピックにメッセージのどのフィールドが再パブリッシュされるかが決まります。すべての Shadow 名に一致させるには、"+" のワイルドカードを使用します。ルールでは、一致するすべてのメッセージが指定したトピックに再パブリッシュされるように定義しています。この場合、"topic()" 関数を使用して、再パブリッシュする先のトピックを指定しています。topic(3) は、元のトピック内のモノ名に評価されます。ルール作成の詳細については、「AWS IoT のルール 」を参照してください。