

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

# AWS IoT Device Shadow サービス
<a name="iot-device-shadows"></a>

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

AWS IoT Thing オブジェクトには、明示的に作成されるまでシャドウはありません。シャドウは、 AWS IoT コンソールを使用して作成、更新、削除できます。デバイス、その他のウェブクライアント、サービスは、MQTT および[予約された MQTT トピック](reserved-topics.md#reserved-topics-shadow)、[Device Shadow REST API](device-shadow-rest-api.md) を使用する HTTP、[AWS CLI for AWS IoT](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot-data/index.html) を使用して、シャドウを作成、更新、削除できます。シャドウは によってクラウド AWS に保存されるため、デバイスが接続されているかどうかにかかわらず、アプリケーションやその他のクラウドサービスからデバイス状態データを収集してレポートできます。

## シャドウの使用
<a name="device-shadow-using"></a>

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

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

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

デバイスが頻繁にオフラインで、再接続後にデルタメッセージを受信するようにデバイスを設定する場合は、永続セッション機能を使用できます。永続セッションの有効期間の詳細については、「[永続的セッションの有効期間](https://docs.aws.amazon.com//general/latest/gr/iot-core.html#message-broker-limits)」を参照してください。

### 名前付きのシャドウまたは名前のないシャドウの使用の選択
<a name="iot-device-shadow-named"></a>

Device Shadow サービスは、名前付きと名前のない、またはクラシックな、シャドウをサポートします。Thing オブジェクトは、複数の名前付きシャドウを持つことができます。また、名前のないシャドウを 1 つ以上持つことはできません。Thing オブジェクトは、予約済みの名前付きシャドウを持つこともできます。名前を更新できないという点を除けば、名前付きシャドウと同様に機能します。詳細については、「[予約済みの名前付きシャドウ](https://docs.aws.amazon.com/iot/latest/developerguide/preparing-to-use-software-package-catalog.html#reserved-named-shadow)」を参照してください。

Thing オブジェクトは、名前付きのシャドウと名前のないシャドウを同時に持つことができますが、それぞれにアクセスするために使用する API は若干異なるため、ソリューションに最適なシャドウのタイプを決定し、そのタイプのみを使用する方が効率的です。シャドウにアクセスするための API の詳細については、「[シャドウトピック](reserved-topics.md#reserved-topics-shadow)」を参照してください。

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

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

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

### シャドウにアクセスする
<a name="device-shadow-using-access"></a>

すべてのシャドウには、予約された [MQTT トピック](reserved-topics.md#reserved-topics-shadow)と [HTTP URL](device-shadow-rest-api.md) があり、シャドウに対する `get`、`update`、`delete` のアクションをサポートします。

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

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

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

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

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

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

### デバイス、アプリ、その他のクラウドサービスでのシャドウの使用
<a name="device-shadow-implementing"></a>

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

シャドウ状態データは動的であり、シャドウへのアクセス許可を持つデバイス、アプリ、その他のクラウドサービスによって変更できます。このため、各デバイス、アプリ、その他のクラウドサービスがシャドウとどのようにやり取りするかを検討することが重要です。以下に例を示します。
+ *デバイス*は、状態データをシャドウに伝達するときに、シャドウ状態の `reported` プロパティにのみ書き込む必要があります。
+ *アプリおよびその他のクラウドサービス*は、状態変更リクエストをシャドウを介してデバイスに通信するときのみ、`desired` プロパティに書き込む必要があります。

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

### メッセージの順序
<a name="message-ordering"></a>

 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 のメッセージを安全に破棄できます。

### シャドウメッセージのトリム
<a name="device-shadow-trim-messages"></a>

デバイスに送信されるシャドウメッセージのサイズを小さくするには、デバイスに必要なフィールドのみを選択してから、デバイスのリッスン対象の 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](iot-rules.md)」を参照してください。