AWS IoT Device Shadow サービス - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS IoT Device Shadow サービス

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

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

シャドウの使用

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

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

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

デバイスが頻繁にオフラインで、再接続後にデルタメッセージを受信するようにデバイスを設定する場合は、永続セッション機能を使用できます。永続セッションの有効期間の詳細については、「永続的セッションの有効期間」を参照してください。

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

Device Shadow サービスは、名前付きと名前のない、またはクラシックな、シャドウをサポートします。Thing オブジェクトは、複数の名前付きシャドウを持つことができます。また、名前のないシャドウを 1 つ以上持つことはできません。Thing オブジェクトは、予約済みの名前付きシャドウを持つこともできます。名前を更新できないという点を除けば、名前付きシャドウと同様に機能します。詳細については、「予約済みの名前付きシャドウ」を参照してください。

モノのオブジェクトは、名前付きシャドウと名前なしシャドウの両方を同時に持つことができます。ただし、それぞれにアクセスするAPIために使用される は少し異なるため、どのタイプのシャドウがソリューションに最適かを判断し、そのタイプのみを使用する方が効率的かもしれません。シャドウにアクセスAPIするための の詳細については、「」を参照してくださいシャドウトピック

名前付きシャドウを使用すると、Thing オブジェクトの状態をさまざまなビューで作成できます。たとえば、多数のプロパティを持つ Thing オブジェクトを、それぞれがシャドウ名で識別される論理的なプロパティのグループを持つシャドウに分割できます。また、プロパティを別のシャドウにグループ化し、ポリシーを使用してアクセスを制御することで、プロパティへのアクセスを制限することもできます。デバイスシャドウで使用するポリシーの詳細については、「AWS IoTのアクション、リソース、および条件キー」と「AWS IoT Core のポリシー」を参照してください。

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

フリートインデックスによるサポートは、名前のないシャドウと名前付きシャドウで異なります。詳細については、「Manage fleet indexing」(フリートインデックスの管理) を参照してください。

シャドウにアクセスする

すべてのシャドウには予約されたMQTTトピックがあり、シャドウの getupdate、および deleteアクションHTTPURLをサポートします。

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

  • desired

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

  • reported

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

  • delta

    AWS IoT は、deltaオブジェクト内の目的の状態と報告された状態の違いを報告します。

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

重要

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

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

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

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

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

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

重要

シャドウデータオブジェクトに含まれるデータは、モノの属性やモノのオブジェクトのデバイスが発行する可能性のあるMQTTメッセージの内容など、他のシャドウやその他のモノのオブジェクトプロパティとは独立しています。ただし、デバイスは必要に応じて異なるMQTTトピックやシャドウで同じデータをレポートできます。

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

メッセージの順序

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

初期状態ドキュメント:

{ "state": { "reported": { "color": "blue" } }, "version": 9, "timestamp": 123456776 }

更新 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」を参照してください。