

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

# デバイスシャドウとやり取り
<a name="interact-with-shadows"></a>

Greengrass コアデバイスはコンポーネントを使用して、[AWS IoT デバイスシャドウ](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)とやり取りできます。「シャドウ」は、AWS IoT モノの現在または目的の状態に関する情報を保存する JSON ドキュメントです。シャドウは、デバイスが AWS IoT に接続されているかどうかにかかわらず、他の AWS IoT Greengrass コンポーネントでデバイスの状態を利用できるようにします。AWS IoT デバイスは、それぞれ独自に従来の名前なしシャドウを持ちます。また、デバイスごとに名前付きシャドウを複数作成することもできます。

デバイスおよびサービスは、MQTT および[予約された MQTT シャドウトピック](https://docs.aws.amazon.com/iot/latest/developerguide/reserved-topics.html#reserved-topics-shadow)、[Device Shadow REST API](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-rest-api.html) を使用する HTTP、[AWS CLI for AWS IoT](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot-data/index.html) を使用して、クラウドシャドウを作成、更新、削除できます。

[シャドウマネージャー](shadow-manager-component.md)コンポーネントを使用すると、Greengrass コンポーネントは[ローカルシャドウサービス](ipc-local-shadows.md)およびローカルパブリッシュ/サブスクライブシャドウトピックを使用して、ローカルシャドウを作成、更新、削除できるようになります。シャドウマネージャーは、これらのローカルシャドウドキュメントのコアデバイスへの保存を管理し、クラウドシャドウとシャドウの状態情報を同期する処理を行います。

シャドウマネージャーコンポーネントを使用すると、コアデバイスに接続する[クライアントデバイス](interact-with-local-iot-devices.md)の、ローカルシャドウの管理もできるようになります。シャドウマネージャがクライアントデバイスのシャドウを管理できるようにするには、ローカルの MQTT ブローカーと、ローカルのパブリッシュ/サブスクライブサービスとの間でメッセージをリレーできるように、[MQTT ブリッジコンポーネント](mqtt-bridge-component.md)を設定します。詳細については、「[クライアントデバイスシャドウとやり取りして同期する](work-with-client-device-shadows.md)」を参照してください。

AWS IoT デバイスシャドウコンセプトの詳細については、「*AWS IoT デベロッパーガイド*」の「[AWS IoT Device Shadow service](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)」を参照してください。

**Topics**
+ [コンポーネントのシャドウとやり取りする](interact-with-shadows-in-components.md)
+ [ローカルデバイスシャドウを と同期する AWS IoT Core](sync-shadows-with-iot-core.md)

# コンポーネントのシャドウとやり取りする
<a name="interact-with-shadows-in-components"></a>

ローカルシャドウサービスを使用して、ローカルシャドウドキュメントと、クライアントデバイスシャドウドキュメントの、読み取りと変更を実行する、カスタムコンポーネント (Lambda 関数コンポーネントなど) を開発できます。

カスタムコンポーネントは、 の AWS IoT Greengrass Core IPC ライブラリを使用してローカルシャドウサービスとやり取りします AWS IoT Device SDK。[シャドウマネージャー](shadow-manager-component.md)コンポーネントを使用すると、コアデバイスでローカルシャドウサービスを有効にできます。

Greengrass コアデバイスにシャドウマネージャーコンポーネントをデプロイするには、`aws.greengrass.ShadowManager` コンポーネントを含む[デプロイを作成](create-deployments.md)します。

**注記**  
デフォルトでは、シャドウマネージャーコンポーネントをデプロイすると、ローカルシャドウのオペレーションのみが有効になります。 AWS IoT Greengrass がコアデバイスシャドウまたはクライアントデバイスのシャドウのシャドウ状態情報を の対応するクラウドシャドウドキュメントに同期できるようにするには AWS IoT Core、 `synchronize`パラメータを含むシャドウマネージャーコンポーネントの設定更新を作成する必要があります。詳細については、「[ローカルデバイスシャドウを と同期する AWS IoT Core](sync-shadows-with-iot-core.md)」を参照してください。

**Topics**
+ [シャドウの状態の取得と変更](#interact-shadow-states)
+ [シャドウの状態の変化に対応する](#react-shadow-events)

## シャドウの状態の取得と変更
<a name="interact-shadow-states"></a>

シャドウ IPC 操作は、ローカルシャドウドキュメントの状態情報を取得および更新します。シャドウマネージャーコンポーネントは、これらのシャドウドキュメントのコアデバイスへの保存処理を行います。

**ローカルシャドウの状態を変更するには**

1. カスタムコンポーネントのレシピに承認ポリシーを追加して、コンポーネントがローカルシャドートピックに関するメッセージを受信できるようにします。

   承認ポリシーの例は、「[Local shadow IPC authorization policy examples](ipc-local-shadows.md#ipc-local-shadow-authorization-policy-examples)」(ローカルシャドウ IPC 承認ポリシーの例) を参照してください。

1. シャドウ IPC オペレーションを使用して、シャドウの状態情報を取得および変更します。コンポーネントコードでシャドウ IPC オペレーションを使用する方法については、「[ローカルシャドウとやり取り](ipc-local-shadows.md)」を参照してください。

**注記**  <a name="note-requirement-enable-shadow-manager-client-devices"></a>
コアデバイスがクライアントデバイスシャドウとやり取りできるようにするには、MQTT ブリッジコンポーネントを設定してデプロイする必要もあります。詳細については、「[Enable shadow manager to communicate with client devices](work-with-client-device-shadows.md)」(シャドウマネージャーがクライアントデバイスと通信できるようにする) を参照してください。

## シャドウの状態の変化に対応する
<a name="react-shadow-events"></a>

Greengrass コンポーネントはコアデバイスで通信を行うために、ローカルパブリッシュ/サブスクライブインターフェイスを使用します。カスタムコンポーネントがシャドウの状態の変更に対応できるようにするには、ローカルのパブリッシュ/サブスクライブトピックにサブスクライブします。これにより、コンポーネントはローカルシャドートピックに関するメッセージを受信し、それらのメッセージを処理できます。

ローカルシャドウトピックは、 AWS IoT デバイスシャドウ MQTT トピックと同じ形式を使用します。シャドウトピックの詳細については、「*AWS IoT デベロッパーガイド*」の「[Device Shadow MQTT topics](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-mqtt.html)」を参照してください。

**ローカルシャドウの状態の変化に対応するには**

1. カスタムコンポーネントのレシピにアクセスコントロールポリシーを追加して、コンポーネントがローカルシャドートピックに関するメッセージを受信できるようにします。

   承認ポリシーの例は、「[Local shadow IPC authorization policy examples](ipc-local-shadows.md#ipc-local-shadow-authorization-policy-examples)」(ローカルシャドウ IPC 承認ポリシーの例) を参照してください。

1. コンポーネントでカスタムアクションを開始するには、メッセージを受信するシャドートピックにサブスクライブする `SubscribeToTopic` IPC オペレーションを使用します。コンポーネントコードでローカルパブリッシュ/サブスクライブ IPC オペレーションを使用する方法については、「[ローカルメッセージをパブリッシュ/サブスクライブする](ipc-publish-subscribe.md)」を参照してください。

1. Lambda 関数を呼び出すには、イベントソース設定を使用してシャドートピックの名前を指定し、それがローカルパブリッシュ/サブスクライブトピックであることを指定します。Lambda 関数コンポーネントの作成方法については、「[AWS Lambda 関数を実行する](run-lambda-functions.md)」を参照してください。

**注記**  <a name="note-requirement-enable-shadow-manager-client-devices"></a>
コアデバイスがクライアントデバイスシャドウとやり取りできるようにするには、MQTT ブリッジコンポーネントを設定してデプロイする必要もあります。詳細については、「[Enable shadow manager to communicate with client devices](work-with-client-device-shadows.md)」(シャドウマネージャーがクライアントデバイスと通信できるようにする) を参照してください。

# ローカルデバイスシャドウを と同期する AWS IoT Core
<a name="sync-shadows-with-iot-core"></a>

シャドウマネージャーコンポーネントにより、 はローカルデバイスシャドウの状態 AWS IoT Greengrass を と同期できます AWS IoT Core。シャドウマネージャーコンポーネントの設定を変更して設定`synchronization`パラメータを含め、デバイスの AWS IoT モノの名前と同期するシャドウを指定する必要があります。

シャドウを同期するようにシャドウマネージャーを設定すると、ローカルシャドウドキュメントとクラウドシャドウドキュメントのどちらで変更が発生するかに関係なく、指定したシャドウのすべての状態変更が同期されます。

また、シャドウマネージャーコンポーネントがシャドウをリアルタイムで同期するか、定期的な間隔で同期するかを指定することもできます。デフォルトでは、シャドウマネージャーコンポーネントはシャドウをリアルタイムで同期するため、コアデバイスは各更新が発生した AWS IoT Core ときにシャドウ更新を送受信します。定期的な間隔を設定して、帯域幅の使用量と料金を削減できます。

**Topics**
+ [前提条件](#shadow-sync-prereqs)
+ [シャドウマネージャーコンポーネントを設定する](#configure-shadow-manager-for-sync)
+ [ローカルシャドウを同期する](#sync-local-shadows)
+ [シャドウマージの競合動作](#shadow-merge-behavior)

## 前提条件
<a name="shadow-sync-prereqs"></a>

ローカルシャドウを と同期するには AWS IoT Core、以下のシャドウポリシーアクションを許可するように Greengrass AWS IoT Core コアデバイスの AWS IoT ポリシーを設定する必要があります。
+ `iot:GetThingShadow`
+ `iot:UpdateThingShadow`
+ `iot:DeleteThingShadow`

詳細については次を参照してください:
+ *AWS IoT デベロッパーガイド*の [AWS IoT Core ポリシーアクション](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policy-actions.html) 
+ [AWS IoT Greengrass V2 コアデバイスの最小 AWS IoT ポリシー](device-auth.md#greengrass-core-minimal-iot-policy)
+ [コアデバイスの AWS IoT ポリシーを更新する](device-auth.md#update-core-device-iot-policy)

## シャドウマネージャーコンポーネントを設定する
<a name="configure-shadow-manager-for-sync"></a>

シャドウマネージャーでは、ローカルシャドウドキュメントのシャドウ状態情報を AWS IoT Coreのクラウドシャドウドキュメントに同期するには、シャドウ名のマッピングのリストが必要です。

シャドウの状態を同期するには、`aws.greengrass.ShadowManager` コンポーネントを含む[デプロイを作成](create-deployments.md)し、デプロイのシャドウマネージャー設定の `synchronize` 設定パラメータで同期するシャドウを指定します。

**注記**  <a name="note-requirement-enable-shadow-manager-client-devices"></a>
コアデバイスがクライアントデバイスシャドウとやり取りできるようにするには、MQTT ブリッジコンポーネントを設定してデプロイする必要もあります。詳細については、「[Enable shadow manager to communicate with client devices](work-with-client-device-shadows.md)」(シャドウマネージャーがクライアントデバイスと通信できるようにする) を参照してください。

次の設定更新の例では、シャドウマネージャーコンポーネントに次のシャドウを同期するように指示します AWS IoT Core。
+ コアデバイスの古典的なシャドウ 
+ コアデバイスの名前付き `MyCoreShadow` 
+ `MyDevice2` という名前の IoT モノのクラシックなシャドウ 
+ `MyDevice1` という名前の IoT モノの名前付きシャドウ `MyShadowA` および `MyShadowB`

この設定更新では、シャドウを AWS IoT Core リアルタイムで と同期するように を指定します。シャドウマネージャー v2.1.0 以降を使用している場合、定期的な間隔でシャドウを同期させるようにシャドウマネージャーコンポーネントを設定できます。この機能を設定するには、同期ストラテジーを `periodic` に変更し、間隔の `delay` を秒単位で指定します。詳細については、「シャドウマネージャーコンポーネント」の「[ストラテジー設定パラメータ](shadow-manager-component.md#shadow-manager-component-configuration)」を参照してください。

この設定更新では、 AWS IoT Core とコアデバイスの間の両方向でシャドウが同期するように指定されています。シャドウマネージャー v2.2.0 以降を使用している場合、シャドウを一方向にのみ同期するようにシャドウマネージャーコンポーネントを設定できます。この機能を設定するには、同期 `direction` を `deviceToCloud` または `cloudToDevice` に変更します。詳細については、シャドウマネージャーコンポーネントの [direction 設定パラメータ](shadow-manager-component.md#shadow-manager-component-configuration)を参照してください。

```
{
  "strategy": {
    "type": "realTime"
  },
  "synchronize": {
    "coreThing": {
      "classic": true,
      "namedShadows": [
        "MyCoreShadow"
      ]
    },
    "shadowDocuments": [
      {
        "thingName": "MyDevice1",
        "classic": false,
        "namedShadows": [
          "MyShadowA",
          "MyShadowB"
        ]
      },
      {
        "thingName": "MyDevice2",
        "classic": true,
        "namedShadows": [ ]
      }
    ],
    "direction": "betweenDeviceAndCloud"
  }
}
```

## ローカルシャドウを同期する
<a name="sync-local-shadows"></a>

Greengrass コアデバイスが AWS IoT クラウドに接続されている場合、シャドウマネージャーはコンポーネント設定で指定したシャドウに対して次のタスクを実行します。この動作は、指定するシャドウ同期方向設定オプションによって異なります。デフォルトでは、シャドウマネージャーは `betweenDeviceAndCloud` オプションを使用して、シャドウを両方向に同期させます。シャドウマネージャー v2.2.0 以降を使用している場合、シャドウを一方向 (`cloudToDevice` または `deviceToCloud`) にのみ同期するようにコアデバイスを設定できます。
+ シャドウ同期の方向設定が `betweenDeviceAndCloud` または `cloudToDevice` の場合、シャドウマネージャーは、 AWS IoT Coreのクラウドシャドウドキュメントから報告された状態情報を取得します。そして、ローカルに保存されたシャドウドキュメントを更新して、デバイスの状態を同期させます。
+ シャドウ同期の方向設定が `betweenDeviceAndCloud` または `deviceToCloud` の場合、シャドウマネージャーは、デバイスの現在の状態をクラウドシャドウドキュメントに公開します。

## シャドウマージの競合動作
<a name="shadow-merge-behavior"></a>

コアデバイスがインターネットから切断されている場合など、場合によっては、シャドウマネージャーが変更を同期する前に、ローカルシャドウサービスと AWS IoT クラウドでシャドウが変わることがあります。その結果、必要な状態と報告された状態は、ローカルシャドウサービスと AWS IoT クラウドで異なります。

シャドウマネージャーがシャドウを同期すると、次の動作に従って変更がマージされます。
+ v2.2.0 より前のバージョンのシャドウマネージャーを使用している場合、またはシャドウ同期方向を `betweenDeviceAndCloud` に指定している場合、次の動作が適用されます。
  + シャドウの目的の状態でマージ競合が発生すると、シャドウマネージャーはローカルシャドウドキュメントの競合セクションを AWS IoT クラウドの値で上書きします。
  + シャドウが報告された状態でマージ競合がある場合、シャドウマネージャーは AWS IoT クラウド内のシャドウの競合セクションをローカルシャドウドキュメントの値で上書きします。
+ `deviceToCloud` シャドウ同期方向を指定すると、シャドウマネージャーは AWS IoT クラウド内のシャドウの競合するセクションをローカルシャドウドキュメントの値で上書きします。
+ `cloudToDevice` シャドウ同期方向を指定すると、シャドウマネージャーはローカルシャドウドキュメントの競合するセクションを AWS IoT クラウドの値で上書きします。