

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

# クライアントデバイスをコアデバイスに接続する
<a name="connect-client-devices"></a>

クラウドディスカバリを設定して、クライアントデバイスをコアデバイスに接続することができます。クラウド検出を設定すると、クライアントデバイスは AWS IoT Greengrass クラウドサービスに接続して、接続できるコアデバイスに関する情報を取得できます。その後、クライアントデバイスは、正常に接続されるまで、各コアデバイスへの接続を試みることができます。

クラウドディスカバリを使用するには、以下の操作を行う必要があります。
+ クライアントデバイスを、接続できるコアデバイスに関連付けます。
+ クライアントデバイスが各コアデバイスに接続できる MQTT ブローカエンドポイントを指定します。
+ クライアントデバイスへのサポートを可能にするコンポーネントをコアデバイスにデプロイします。

  オプションのコンポーネントをデプロイして、次の操作を行うこともできます。
  + クライアントデバイス、Greengrass コンポーネント、 AWS IoT Core クラウドサービス間でメッセージを中継します。
  + コアデバイスの MQTT ブローカーエンドポイントを自動で管理します。
  + ローカルクライアントデバイスシャドウを管理し、シャドウを AWS IoT Core クラウドサービスと同期します。

また、コアデバイスの AWS IoT ポリシーを確認して更新し、クライアントデバイスの接続に必要なアクセス許可があることを確認する必要があります。詳細については、「[要件](#connect-client-devices-requirements)」を参照してください。

クラウドディスカバリを設定したら、クライアントデバイスとコアデバイス間の通信をテストすることができます。詳細については、「[クライアントデバイス通信をテストする](test-client-device-communications.md)」を参照してください。

**Topics**
+ [要件](#connect-client-devices-requirements)
+ [クライアントデバイスサポート用の Greengrass コンポーネント](#cloud-discovery-components)
+ [クラウドディスカバリを設定する (コンソール)](#configure-cloud-discovery-console)
+ [クラウドディスカバリを設定する (AWS CLI)](#configure-cloud-discovery-cli)
+ [クライアントデバイスを関連付ける](associate-client-devices.md)
+ [オフライン時のクライアントの認証](offline-authentication.md)
+ [コアデバイスのエンドポイントを管理](manage-core-device-endpoints.md)
+ [MQTT ブローカーを選択する](choose-local-mqtt-broker.md)
+ [MQTT ブローカーを使用してクライアントデバイスを AWS IoT Greengrass Core デバイスに接続する](connecting-to-mqtt.md)
+ [クライアントデバイス通信をテストする](test-client-device-communications.md)
+ [Greengrass Discovery RESTful API](greengrass-discover-api.md)

## 要件
<a name="connect-client-devices-requirements"></a>

クライアントデバイスをコアデバイスに接続するには、以下を使用する必要があります。
+ コアデバイスで、[Greengrass nucleus](greengrass-nucleus-component.md) v2.2.0 以降が実行されている必要があります
+ コアデバイスが動作する AWS リージョン AWS アカウント の AWS IoT Greengrass の に関連付けられた Greengrass サービスロール。詳細については、「[Greengrass サービスロールを設定する](#configure-service-role-requirement)」を参照してください。
+ コアデバイスの AWS IoT ポリシーでは、次のアクセス許可を許可する必要があります。<a name="core-device-iot-policy-client-device-permissions"></a>
  + <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
  + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
  + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
  + <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
  + <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo` – (オプション) このアクセス許可は、コアデバイスのネットワーク接続情報を AWS IoT Greengrass クラウドサービスに報告する [IP ディテクターコンポーネント](ip-detector-component.md)を使用するために必要です。
  + <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow`、`iot:UpdateThingShadow`、 – `iot:DeleteThingShadow` (オプション) これらのアクセス許可は、シャ[ドウマネージャーコンポーネント](shadow-manager-component.md)を使用してクライアントデバイスシャドウを同期するために必要です AWS IoT Core。この機能を使用するには、[Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 以降、シャドウマネージャー v2.2.0 以降、および [MQTT ブリッジ](mqtt-bridge-component.md) v2.2.0 以降が必要です。

  詳細については、「[AWS IoT モノのポリシーを設定する](#configure-iot-policy-requirement)」を参照してください。
**注記**  
[AWS IoT Greengrass Core ソフトウェアのインストール](install-greengrass-core-v2.md)時にデフォルト AWS IoT ポリシーを使用した場合、コアデバイスにはすべての AWS IoT Greengrass アクション () へのアクセスを許可する AWS IoT ポリシーがあります`greengrass:*`。
+ AWS IoT クライアントデバイスとして接続できる モノ。詳細については、「*AWS IoT Core デベロッパーガイド*」の「[AWS IoT リソースを作成する](https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html)」を参照してください。
+ クライアントデバイスは、クライアント ID を使用して接続する必要があります。クライアント ID はモノの名前です。他のクライアント ID は受け付けられません。
+ 各クライアントデバイスの AWS IoT ポリシーは、 アクセス`greengrass:Discover`許可を許可する必要があります。詳細については、「[クライアントデバイスの最小 AWS IoT ポリシー](device-auth.md#client-device-minimal-iot-policy)」を参照してください。

**Topics**
+ [Greengrass サービスロールを設定する](#configure-service-role-requirement)
+ [AWS IoT モノのポリシーを設定する](#configure-iot-policy-requirement)

### Greengrass サービスロールを設定する
<a name="configure-service-role-requirement"></a>

<a name="greengrass-service-role-intro"></a>Greengrass サービスロールは、 がユーザーに代わって のサービスからリソースにアクセス AWS IoT Greengrass することを許可する AWS Identity and Access Management (IAM) AWS サービスロールです。このロールにより、 AWS IoT Greengrass はクライアントデバイスの ID を検証し、コアデバイス接続情報を管理できます。

このリージョンで [Greengrass サービスロール](greengrass-service-role.md)を設定したことがない場合は、このリージョン AWS アカウント の AWS IoT Greengrass に対して Greengrass サービスロールを に関連付ける必要があります。

[AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)で**コアデバイス検出の設定**ページを使用すると、 によって Greengrass サービスロール AWS IoT Greengrass が自動的に設定されます。それ以外の場合は、[AWS IoT コンソール](https://console.aws.amazon.com/iot)または AWS IoT Greengrass API を使用して手動で設定できます。

このセクションでは、Greengrass サービスロールが設定されているかどうかを確認します。設定されていない場合は、このリージョン AWS アカウント の AWS IoT Greengrass に関連付ける新しい Greengrass サービスロールを作成します。

#### Greengrass サービスロールを設定する (コンソール)
<a name="configure-service-role-requirement-console"></a>

1. Greengrass サービスロールがこのリージョン AWS アカウント の AWS IoT Greengrass の に関連付けられているかどうかを確認します。以下の操作を実行します。

   1. <a name="open-iot-console"></a>[AWS IoT コンソール](https://console.aws.amazon.com/iot)に移動します。

   1. ナビゲーションペインで **[設定]** を選択します。

   1. **[Greengrass service role]** (Greengrass サービスロール) セクションで、**[Current service role]** (現在のサービスロール) をクリックし、Greengrass サービスロールが関連付けられているかどうかを確認します。

      Greengrass サービスロールが関連付けられている場合、IP ディテクターコンポーネントを使用する要件を満たしています。「[AWS IoT モノのポリシーを設定する](#configure-iot-policy-requirement)」へ進んでください。

1. Greengrass サービスロールがこのリージョン AWS アカウント の AWS IoT Greengrass の に関連付けられていない場合は、Greengrass サービスロールを作成して関連付けます。以下の操作を実行します。

   1. [[IAM console]](https://console.aws.amazon.com/iam) (IAM コンソール) に入ります。

   1. [**Roles (ロール)**] を選択します。

   1. **[Create role]** (ロールの作成) を選択します。

   1. **[Create role]** (ロールの作成) ページで、次の手順を実行します。

      1. **[Trusted entity type]** (信頼できるエンティティタイプ) で、**[AWS のサービス]** を選択します。

      1. **[ユースケース]** の下にある **[その他の AWS のサービス のユースケース]** で、**[Greengrass]** を選択し、さらに **[Greengrass]** を選択します。このオプションは、このロールを引き受けることができる信頼されたエンティティ AWS IoT Greengrass として を追加することを指定します。

      1. [**次へ**] を選択します。

      1. **[Permissions policies]** (アクセス許可ポリシー) で、**AWSGreengrassResourceAccessRolePolicy** を選択し、ロールにアタッチします。

      1. [**次へ**] を選択します。

      1. **[Role name]** (ロール名) に、このロールの名前 (**Greengrass\$1ServiceRole** など) を入力します。

      1. [**ロールの作成**] を選択してください。

   1. <a name="open-iot-console"></a>[AWS IoT コンソール](https://console.aws.amazon.com/iot)に移動します。

   1. ナビゲーションペインで **[設定]** を選択します。

   1. 左**[Greengrass service role]** (Greengrass サービスロール) セクションで、**[Attach role]** (ロールを添付する) を選択します。

   1. **[Update Greengrass service role]** (Greengrass サービスロールを更新する) モーダルで作成した IAM ロールを選択し、**[Attach role]** (ロールを割り当てる) を選択します。

#### Greengrass サービスロールを設定する (AWS CLI)
<a name="configure-service-role-requirement-cli"></a>

1. Greengrass サービスロールがこのリージョン AWS アカウント の AWS IoT Greengrass の に関連付けられているかどうかを確認します。

   ```
   aws greengrassv2 get-service-role-for-account
   ```

   Greengrass サービスロールが関連付けられている場合、この動作により、ロールに関する情報が含まれたレスポンスが返されます。

   Greengrass サービスロールが関連付けられている場合、IP ディテクターコンポーネントを使用する要件を満たしています。「[AWS IoT モノのポリシーを設定する](#configure-iot-policy-requirement)」へ進んでください。

1. Greengrass サービスロールがこのリージョン AWS アカウント の AWS IoT Greengrass の に関連付けられていない場合は、Greengrass サービスロールを作成して関連付けます。以下の操作を実行します。

   1. <a name="create-greengrass-service-role-step-create-role"></a>がロールを引き受けること AWS IoT Greengrass を許可する信頼ポリシーを持つロールを作成します。この例では、`Greengrass_ServiceRole` という名前のロールを作成しますが、別の名前を使用できます。また、信頼ポリシーには、`aws:SourceArn` および `aws:SourceAccount` グローバル条件コンテキストキーも含めて、*混乱した代理*によるセキュリティ問題を防止することをお勧めします。条件コンテキストキーを使用すると、指定したアカウントと Greengrass ワークスペースからのリクエストのみを許可するようにアクセスを制限できます。混乱した代理に関する問題の詳細については、「[サービス間の混乱した代理の防止](cross-service-confused-deputy-prevention.md)」を参照してください。

------
#### [ Linux or Unix ]

      ```
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "greengrass.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
              "ArnLike": {
                "aws:SourceArn": "arn:aws:greengrass:region:account-id:*"
              },
              "StringEquals": {
                "aws:SourceAccount": "account-id"
              }
            }
          }
        ]
      }'
      ```

------
#### [ Windows Command Prompt (CMD) ]

      ```
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document "{\\"Version\\":\\"2012-10-17		 	 	 \\",\\"Statement\\":[{\\"Effect\\":\\"Allow\\",\\"Principal\\":{\\"Service\\":\\"greengrass.amazonaws.com\\"},\\"Action\\":\\"sts:AssumeRole\\",\\"Condition\\":{\\"ArnLike\\":{\\"aws:SourceArn\\":\\"arn:aws:greengrass:region:account-id:*\\"},\\"StringEquals\\":{\\"aws:SourceAccount\\":\\"account-id\\"}}}]}"
      ```

------
#### [ PowerShell ]

      ```
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "greengrass.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
              "ArnLike": {
                "aws:SourceArn": "arn:aws:greengrass:region:account-id:*"
              },
              "StringEquals": {
                "aws:SourceAccount": "account-id"
              }
            }
          }
        ]
      }'
      ```

------

   1. <a name="create-greengrass-service-role-step-copy-role-arn"></a>出力のロールメタデータからロールの ARN をコピーします。ARN を使用して、ロールをアカウントに関連付けます。

   1. <a name="create-greengrass-service-role-step-attach-policy"></a>`AWSGreengrassResourceAccessRolePolicy` ポリシーをロールにアタッチします。

      ```
      aws iam attach-role-policy --role-name Greengrass_ServiceRole --policy-arn arn:aws:iam::aws:policy/service-role/AWSGreengrassResourceAccessRolePolicy
      ```

   1.  AWS IoT Greengrass の Greengrass サービスロールを に関連付けます AWS アカウント。*role-arn* をサービスロールの ARN に置き換えます。

      ```
      aws greengrassv2 associate-service-role-to-account --role-arn role-arn
      ```

      成功すると、次のレスポンスが返されます。

      ```
      {
        "associatedAt": "timestamp"
      }
      ```

### AWS IoT モノのポリシーを設定する
<a name="configure-iot-policy-requirement"></a>

コアデバイスは X.509 デバイス証明書を使用して、 AWSへの接続を許可します。デバイス証明書に AWS IoT ポリシーをアタッチして、コアデバイスのアクセス許可を定義します。詳細については、「[AWS IoT データプレーンオペレーションの ポリシー](device-auth.md#iot-policies)」および「[クライアントデバイスをサポートする最小 AWS IoT ポリシー](device-auth.md#client-device-support-minimal-iot-policy)」を参照してください。

クライアントデバイスをコアデバイスに接続するには、コアデバイスの AWS IoT ポリシーで次のアクセス許可を許可する必要があります。<a name="core-device-iot-policy-client-device-permissions"></a>
+ <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
+ <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
+ <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
+ <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
+ <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo` – (オプション) このアクセス許可は、コアデバイスのネットワーク接続情報を AWS IoT Greengrass クラウドサービスに報告する [IP ディテクターコンポーネント](ip-detector-component.md)を使用するために必要です。
+ <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow`、`iot:UpdateThingShadow`、 `iot:DeleteThingShadow` – (オプション) これらのアクセス許可は、シャ[ドウマネージャーコンポーネント](shadow-manager-component.md)を使用してクライアントデバイスシャドウを同期するために必要です AWS IoT Core。この機能を使用するには、[Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 以降、シャドウマネージャー v2.2.0 以降、および [MQTT ブリッジ](mqtt-bridge-component.md) v2.2.0 以降が必要です。

このセクションでは、コアデバイスの AWS IoT ポリシーを確認し、不足している必要なアクセス許可を追加します。[AWS IoT Greengrass Core ソフトウェアインストーラを使用してリソースをプロビジョニング](quick-installation.md)した場合、コアデバイスにはすべての AWS IoT Greengrass アクション () へのアクセスを許可する AWS IoT ポリシーがあります`greengrass:*`。この場合、シャドウマネージャーコンポーネントをデプロイしてデバイスシャドウを同期する予定がある場合にのみ、 AWS IoT ポリシーを更新する必要があります AWS IoT Core。それ以外の場合、このセクションはスキップできます。

#### AWS IoT モノのポリシーを設定する (コンソール)
<a name="configure-iot-policy-requirement-console"></a>

1. <a name="update-iot-policy-console-open-greengrass-console"></a>[AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)のナビゲーションメニューで、**[Core devices]** (コアデバイス) を選択します。

1. <a name="update-iot-policy-console-choose-core-device"></a>**[Core devices]** (コアデバイス) ページで、更新するコアデバイスを選択します。

1. <a name="update-iot-policy-console-choose-core-device-thing"></a>コアデバイスの詳細ページで、コアデバイスの **[Thing]** (モノ) へのリンクを選択します。このリンクをクリックすると、 AWS IoT コンソールの [thing details] (モノ詳細) ページが開きます。

1. <a name="update-iot-policy-console-choose-thing-security"></a>[thing details] (モノ詳細) ページで、**[Certificates]** (証明書) を選択します。

1. <a name="update-iot-policy-console-choose-thing-certificate"></a>**[Certificates]** (証明書) タブで、モノのアクティブな証明書を選択します。

1. <a name="update-iot-policy-console-choose-certificate-policies"></a>[certificate details] (証明書詳細) ページで、**[Policies]** (ポリシー) を選択します。

1. <a name="update-iot-policy-console-choose-policy"></a>**ポリシー**タブで、確認および更新する AWS IoT ポリシーを選択します。コアデバイスのアクティブな証明書にアタッチされている任意のポリシーに、必要なアクセス許可を追加できます。
**注記**  <a name="quick-installation-iot-policies-note"></a>
[AWS IoT Greengrass Core ソフトウェアインストーラを使用してリソースをプロビジョニング](quick-installation.md)した場合、2 つの AWS IoT ポリシーがあります。存在する場合は、**GreengrassV2IoTThingPolicy** という名前のポリシーを選択することをお勧めします。クイックインストーラで作成するコアデバイスは、デフォルトでこのポリシー名を使用します。このポリシーにアクセス許可を追加すると、このポリシーを使用する他のコアデバイスにもこれらのアクセス許可が付与されます。

1. <a name="update-iot-policy-console-edit-policy"></a>[policy overview] (ポリシーの概要) で、**[Edit active version]** (アクティブなバージョンの編集) を選択します。

1. 必要なアクセス許可についてポリシーを確認し、不足していれば必要なアクセス許可を追加します。<a name="core-device-iot-policy-client-device-permissions"></a>
   + <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
   + <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
   + <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo` – (オプション) このアクセス許可は、コアデバイスのネットワーク接続情報を AWS IoT Greengrass クラウドサービスに報告する [IP ディテクターコンポーネント](ip-detector-component.md)を使用するために必要です。
   + <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow`、`iot:UpdateThingShadow`、 `iot:DeleteThingShadow` – (オプション) これらのアクセス許可は、シャ[ドウマネージャーコンポーネント](shadow-manager-component.md)を使用してクライアントデバイスシャドウを同期するために必要です AWS IoT Core。この機能を使用するには、[Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 以降、シャドウマネージャー v2.2.0 以降、および [MQTT ブリッジ](mqtt-bridge-component.md) v2.2.0 以降が必要です。

1. (オプション) コアデバイスがシャドウと同期できるようにするには AWS IoT Core、次のステートメントをポリシーに追加します。クライアントデバイスシャドウとやり取りするが、同期しない場合は AWS IoT Core、このステップをスキップします。*region* および *account-id* は、使用するリージョンと、自分の AWS アカウント 番号に置き換えます。
   + このサンプルステートメントは、すべてのモノのデバイスシャドウへのアクセスを許可します。セキュリティのベストプラクティスに従うには、コアデバイスと、コアデバイスに接続するクライアントデバイスのみにアクセスを制限します。詳細については、「[クライアントデバイスをサポートする最小 AWS IoT ポリシー](device-auth.md#client-device-support-minimal-iot-policy)」を参照してください。

   ```
   {
     "Effect": "Allow",
     "Action": [
       "iot:GetThingShadow",
       "iot:UpdateThingShadow",
       "iot:DeleteThingShadow"
     ],
     "Resource": [
       "arn:aws:iot:region:account-id:thing/*"
     ]
   }
   ```

   このステートメントを追加した後のポリシードキュメントは、次の例のようになります。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "iot:Connect",
           "iot:Publish",
           "iot:Subscribe",
           "iot:Receive",
           "greengrass:*"
         ],
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "iot:GetThingShadow",
           "iot:UpdateThingShadow",
           "iot:DeleteThingShadow"
         ],
         "Resource": [
           "arn:aws:iot:us-east-1:123456789012:thing/*"
         ]
       }
     ]
   }
   ```

------

1. <a name="update-iot-policy-console-set-as-active-version"></a>新しいポリシーバージョンをアクティブなバージョンとして設定するには、**[Policy version status]** (ポリシーバージョンのステータス) で、**[Set the edited version as the active version for this policy]** (編集したバージョンをこのポリシーのアクティブバージョンとして設定) を選択します。

1. <a name="update-iot-policy-console-save-policy"></a>**[Save as new version]** (新しいバージョンとして保存) を選択します。

#### AWS IoT モノのポリシーを設定する (AWS CLI)
<a name="configure-iot-policy-requirement-cli"></a>

1. <a name="update-iot-policy-cli-list-thing-principals"></a>コアデバイスの AWS IoT モノのプリンシパルを一覧表示します。モノのプリンシパルは X.509 デバイス証明書またはその他の識別子にすることができます。以下のコマンドを実行して、*MyGreengrassCore* をコアデバイスの名前に置き換えます。

   ```
   aws iot list-thing-principals --thing-name MyGreengrassCore
   ```

   この動作は、コアデバイスのモノのプリンシパルをリスト表示するレスポンスを返します。

   ```
   {
       "principals": [
           "arn:aws:iot:us-west-2:123456789012:cert/certificateId"
       ]
   }
   ```

1. <a name="update-iot-policy-cli-identify-active-certificate"></a>コアデバイスのアクティブな証明書を特定します。以下のコマンドを実行して、アクティブな証明書が見つかるまで、*certificateId* を前の手順からの各証明書の ID に置き換えます。証明書 ID は、証明書 ARN の末尾にある 16 進数の文字列です。`--query` 引数は、証明書のステータスのみを出力するように指定しています。

   ```
   aws iot describe-certificate --certificate-id certificateId --query 'certificateDescription.status'
   ```

   この操作では、証明書の状態が文字列で返されます。例えば、証明書がアクティブな場合、この操作は `"ACTIVE"` を出力します。

1. <a name="update-iot-policy-cli-list-certificate-policies"></a>証明書にアタッチされている AWS IoT ポリシーを一覧表示します。次のコマンドを実行し、証明書 ARN を証明書の ARN に置き換えます。

   ```
   aws iot list-principal-policies --principal arn:aws:iot:us-west-2:123456789012:cert/certificateId
   ```

   オペレーションは、証明書にアタッチされている AWS IoT ポリシーを一覧表示するレスポンスを返します。

   ```
   {
       "policies": [
           {
               "policyName": "GreengrassTESCertificatePolicyMyGreengrassCoreTokenExchangeRoleAlias",
               "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassTESCertificatePolicyMyGreengrassCoreTokenExchangeRoleAlias"
           },
           {
               "policyName": "GreengrassV2IoTThingPolicy",
               "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy"
           }
       ]
   }
   ```

1. <a name="update-iot-policy-cli-choose-policy"></a>表示して更新するポリシーを選択します。
**注記**  <a name="quick-installation-iot-policies-note"></a>
[AWS IoT Greengrass Core ソフトウェアインストーラを使用してリソースをプロビジョニング](quick-installation.md)した場合、2 つの AWS IoT ポリシーがあります。存在する場合は、**GreengrassV2IoTThingPolicy** という名前のポリシーを選択することをお勧めします。クイックインストーラで作成するコアデバイスは、デフォルトでこのポリシー名を使用します。このポリシーにアクセス許可を追加すると、このポリシーを使用する他のコアデバイスにもこれらのアクセス許可が付与されます。

1. <a name="update-iot-policy-cli-get-policy-document"></a>ポリシーのドキュメントを取得します。以下のコマンドを実行して、*GreengrassV2IoTThingPolicy* をポリシーの名前に置き換えます。

   ```
   aws iot get-policy --policy-name GreengrassV2IoTThingPolicy
   ```

   この操作は、ポリシーのドキュメントとポリシーに関するその他の情報が含まれるレスポンスを返します。ポリシードキュメントは、文字列としてシリアル化された JSON オブジェクトです。

   ```
   {
       "policyName": "GreengrassV2IoTThingPolicy",
       "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy",
       "policyDocument": "{\
     \\"Version\\": \\"2012-10-17		 	 	 \\",\
     \\"Statement\\": [\
       {\
         \\"Effect\\": \\"Allow\\",\
         \\"Action\\": [\
                   \\"iot:Connect\\",\
                   \\"iot:Publish\\",\
                   \\"iot:Subscribe\\",\
                   \\"iot:Receive\\",\
                   \\"greengrass:*\\"\
   ],\
         \\"Resource\\": \\"*\\"\
       }\
     ]\
   }",
       "defaultVersionId": "1",
       "creationDate": "2021-02-05T16:03:14.098000-08:00",
       "lastModifiedDate": "2021-02-05T16:03:14.098000-08:00",
       "generationId": "f19144b798534f52c619d44f771a354f1b957dfa2b850625d9f1d0fde530e75f"
   }
   ```

1. <a name="update-iot-policy-cli-create-policy-document-file"></a>オンラインコンバータまたはその他のツールを使用して、ポリシードキュメント文字列を JSON オブジェクトに変換し、`iot-policy.json` という名前のファイルに保存します。

   例えば、[jq](https://stedolan.github.io/jq/) ツールがインストールされている場合には、次のコマンドを実行してポリシードキュメントを取得し、JSON オブジェクトに変換してから、ポリシードキュメントを JSON オブジェクトとして保存することができます。

   ```
   aws iot get-policy --policy-name GreengrassV2IoTThingPolicy --query 'policyDocument' | jq fromjson >> iot-policy.json
   ```

1. 必要なアクセス許可についてポリシーを確認し、不足していれば必要なアクセス許可を追加します。

   <a name="nano-command-intro-existing-file"></a>例えば、Linux ベースのシステムでは、次のコマンドを実行し、GNU nano を使用してファイルを開きます。

   ```
   nano iot-policy.json
   ```<a name="core-device-iot-policy-client-device-permissions"></a>
   + <a name="core-device-iot-policy-client-device-permissions-putcertificateauthorities"></a>`greengrass:PutCertificateAuthorities`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceidentity"></a>`greengrass:VerifyClientDeviceIdentity`
   + <a name="core-device-iot-policy-client-device-permissions-verifyclientdeviceiotcertificateassociation"></a>`greengrass:VerifyClientDeviceIoTCertificateAssociation`
   + <a name="core-device-iot-policy-client-device-permissions-getconnectivityinfo"></a>`greengrass:GetConnectivityInfo`
   + <a name="core-device-iot-policy-client-device-permissions-updateconnectivityinfo"></a>`greengrass:UpdateConnectivityInfo` – (オプション) このアクセス許可は、コアデバイスのネットワーク接続情報を AWS IoT Greengrass クラウドサービスに報告する [IP ディテクターコンポーネント](ip-detector-component.md)を使用するために必要です。
   + <a name="core-device-iot-policy-client-device-permissions-shadows"></a>`iot:GetThingShadow`、`iot:UpdateThingShadow`、 `iot:DeleteThingShadow` – (オプション) これらのアクセス許可は、シャ[ドウマネージャーコンポーネント](shadow-manager-component.md)を使用してクライアントデバイスシャドウを同期するために必要です AWS IoT Core。この機能を使用するには、[Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 以降、シャドウマネージャー v2.2.0 以降、および [MQTT ブリッジ](mqtt-bridge-component.md) v2.2.0 以降が必要です。

1. <a name="update-iot-policy-cli-create-policy-version"></a>変更をポリシーの新しいバージョンとして保存します。以下のコマンドを実行して、*GreengrassV2IoTThingPolicy* をポリシーの名前に置き換えます。

   ```
   aws iot create-policy-version --policy-name GreengrassV2IoTThingPolicy --policy-document file://iot-policy.json --set-as-default
   ```

   成功すると、次の例に類似したレスポンスが返されます。

   ```
   {
       "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy",
       "policyDocument": "{\
     \\"Version\\": \\"2012-10-17		 	 	 \\",\
     \\"Statement\\": [\
       {\
         \\"Effect\\": \\"Allow\\",\
         \\"Action\\": [\
   \\t\\t\\"iot:Connect\\",\
   \\t\\t\\"iot:Publish\\",\
   \\t\\t\\"iot:Subscribe\\",\
   \\t\\t\\"iot:Receive\\",\
   \\t\\t\\"greengrass:*\\"\
         ],\
         \\"Resource\\": \\"*\\"\
       }\
     ]\
   }",
       "policyVersionId": "2",
       "isDefaultVersion": true
   }
   ```

## クライアントデバイスサポート用の Greengrass コンポーネント
<a name="cloud-discovery-components"></a>

**重要**  <a name="client-device-support-nucleus-requirement"></a>
コアデバイスでクライアントデバイスをサポートするため、[Greengrass nucleus](greengrass-nucleus-component.md) v2.2.0 以降が実行されている必要があります

クライアントデバイスがコアデバイスに接続して通信できるようにするには、コアデバイスに次の Greengrass コンポーネントをデプロイします。
+ <a name="client-device-component-overview-client-device-auth"></a>[クライアントデバイス認証](client-device-auth-component.md) (`aws.greengrass.clientdevices.Auth`)

  クライアントデバイス認証コンポーネントをデプロイして、クライアントデバイスを認証し、クライアントデバイスのアクションを認可します。このコンポーネントを使用すると、 AWS IoT モノをコアデバイスに接続できます。

  このコンポーネントを使用するには、いくつかの設定が必要です。クライアントデバイスのグループを指定して、MQTT を介した接続や通信などの各グループが実行することができる操作を指定する必要があります。詳細については、「[クライアントデバイス認証コンポーネントの設定](client-device-auth-component.md#client-device-auth-component-configuration)」を参照してください。
+ <a name="client-device-component-overview-mqtt-broker-moquette"></a>[MQTT 3.1.1 ブローカー (モケット)](mqtt-broker-moquette-component.md) (`aws.greengrass.clientdevices.mqtt.Moquette`)

  軽量な MQTT ブローカーを実行するため、Moquette MQTT ブローカーコンポーネントをデプロイします。Moquette MQTT ブローカーは MQTT 3.1.1 に準拠しており、QoS 0、QoS 1、QoS 2、保持されたメッセージ、Last Will メッセージ、および永続サブスクリプションに対するローカルサポートが含まれます。

  使用するにあたり、このコンポーネントを設定する必要はありません。ただし、このコンポーネントが MQTT ブローカを操作するポートを設定することができます。デフォルトではポート 8883 が使用されます。
+ <a name="client-device-component-overview-mqtt-broker-emqx"></a>[MQTT 5 ブローカー (EMQX)](mqtt-broker-emqx-component.md) (`aws.greengrass.clientdevices.mqtt.EMQX`)
**注記**  
EMQX MQTT 5 ブローカーを使用するには、[Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 以降と、クライアントデバイスの v2.2.0 以降による認証を使用する必要があります。

  クライアントデバイスとコアデバイス間の通信で MQTT 5.0 機能を使用するために、EMQX MQTT ブローカーコンポーネントをデプロイします。EMQX MQTT ブローカーは MQTT 5.0 に準拠しており、セッションとメッセージの有効期限、ユーザープロパティ、共有サブスクリプション、トピックエイリアスなどのサポートが含まれます。

  使用するにあたり、このコンポーネントを設定する必要はありません。ただし、このコンポーネントが MQTT ブローカを操作するポートを設定することができます。デフォルトではポート 8883 が使用されます。
+ <a name="client-device-component-overview-mqtt-bridge"></a>[MQTT ブリッジ](mqtt-bridge-component.md) (`aws.greengrass.clientdevices.mqtt.Bridge`)

  (オプション) MQTT ブリッジコンポーネントをデプロイして、クライアントデバイス (ローカル MQTT)、ローカルパブリッシュ/サブスクライブ、および AWS IoT Core MQTT 間でメッセージを中継します。クライアントデバイスを と同期 AWS IoT Core し、Greengrass コンポーネントからクライアントデバイスとやり取りするようにこのコンポーネントを設定します。

  このコンポーネントを使用するには、設定する必要があります。このコンポーネントがメッセージをリレーするトピックマッピングを指定する必要があります。詳細については、「[MQTT ブリッジコンポーネントの設定](mqtt-bridge-component.md#mqtt-bridge-component-configuration)」を参照してください。
+ <a name="client-device-component-overview-ip-detector"></a>[IP ディテクター](ip-detector-component.md) (`aws.greengrass.clientdevices.IPDetector`)

  (オプション) IP ディテクターコンポーネントをデプロイして、コアデバイスの MQTT ブローカーエンドポイントを AWS IoT Greengrass クラウドサービスに自動的にレポートします。ルータがコアデバイスに MQTT ブローカポートを転送する場合など、複雑なネットワーク設定がある場合には、このコンポーネントを使用することはできません。

  使用するにあたり、このコンポーネントを設定する必要はありません。
+ <a name="client-device-component-overview-shadow-manager"></a>[シャドウマネージャー](shadow-manager-component.md) (`aws.greengrass.ShadowManager`)
**注記**  
クライアントデバイスのシャドウを管理するには、[Greengrass nucleus](greengrass-nucleus-component.md) v2.6.0 以降、シャドウマネージャー v2.2.0 以降、および [MQTT ブリッジ](mqtt-bridge-component.md) v2.2.0 以降を使用する必要があります。

  (オプション) シャドウマネージャーコンポーネントをデプロイして、コアデバイスのクライアントのデバイスシャドウを管理します。Greengrass コンポーネントは、クライアントデバイスとのやり取りのため、クライアントのデバイスシャドウを取得、更新、削除します。シャドウマネージャーコンポーネントを設定して、クライアントデバイスシャドウを AWS IoT Core クラウドサービスと同期させることもできます。

  このコンポーネントをクライアントのデバイスシャドウとともに使用するには、クライアントデバイスとシャドウマネージャー間でメッセージを伝達するように、(ローカルの公開/サブスクライブを使用する) MQTT ブリッジコンポーネントを設定する必要があります。それ以外の場合、このコンポーネントの使用には設定を必要としませんが、デバイスシャドウを同期する際には設定が必要となります。

**注記**  <a name="note-deploy-one-mqtt-broker"></a>
デプロイする MQTT ブローカーコンポーネントは、1 つだけにすることをお勧めします。[MQTT ブリッジ](mqtt-bridge-component.md)と [IP ディテクター](ip-detector-component.md)コンポーネントは、一度に 1 つの MQTT ブローカーコンポーネントとのみ動作します。デプロイする MQTT ブローカーコンポーネントが複数ある場合は、それぞれが異なるポートを使用する設定を行う必要があります。

## クラウドディスカバリを設定する (コンソール)
<a name="configure-cloud-discovery-console"></a>

 AWS IoT Greengrass コンソールを使用して、クライアントデバイスを関連付けたり、コアデバイスエンドポイントを管理したり、コンポーネントをデプロイしてクライアントデバイスをサポートしたりできます。詳細については、「[ステップ 2: クライアントデバイスのサポートを有効にする](client-devices-tutorial.md#enable-client-device-support)」を参照してください。

## クラウドディスカバリを設定する (AWS CLI)
<a name="configure-cloud-discovery-cli"></a>

 AWS Command Line Interface (AWS CLI) を使用して、クライアントデバイスを関連付け、コアデバイスエンドポイントを管理し、コンポーネントをデプロイしてクライアントデバイスをサポートできます。詳細については、次を参照してください。
+ [クライアントデバイスとの関連付けを管理する (AWS CLI)](associate-client-devices.md#manage-client-device-associations-cli)
+ [コアデバイスのエンドポイントを管理](manage-core-device-endpoints.md)
+ [AWS から提供されるクライアントデバイスコンポーネント](client-device-components.md)
+ [デプロイの作成](create-deployments.md)

# クライアントデバイスを関連付ける
<a name="associate-client-devices"></a>

クラウドディスカバリを使用するには、クライアントデバイスをコアデバイスに関連付けて、コアデバイスを検出できるようにします。その後、[Greengrass ディスカバリー API](greengrass-discover-api.md) を使用して、関連するコアデバイスの接続情報と証明書を取得することができます。

同様に、コアデバイスを検出しないようにする場合は、クライアントデバイスのコアデバイスとの関連付けを外します。

**Topics**
+ [クライアントデバイスとの関連付けを管理する (コンソール)](#manage-client-device-associations-console)
+ [クライアントデバイスとの関連付けを管理する (AWS CLI)](#manage-client-device-associations-cli)
+ [クライアントデバイスとの関連付けを管理する (API)](#manage-client-device-associations-api)

## クライアントデバイスとの関連付けを管理する (コンソール)
<a name="manage-client-device-associations-console"></a>

 AWS IoT Greengrass コンソールを使用して、クライアントデバイスの関連付けを表示、追加、削除できます。

**クライアントデバイスのコアデバイスとの関連付けを表示するには (コンソール)**

1. <a name="navigate-greengrass-console"></a>[AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)に移動します。

1. **[Core devices]** (コアデバイス) を選択します。

1. 管理するコアデバイスを選択します。

1. コアデバイスの詳細ページで、**[Client devices]** (クライアントデバイス) タブを選択します。

1. **関連付けられたクライアントデバイス** セクションでは、コアデバイスに関連付けられているクライアントデバイス (AWS IoT モノ) を確認できます。

**クライアントデバイスをコアデバイスと関連付けるには (コンソール)**

1. <a name="navigate-greengrass-console"></a>[AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)に移動します。

1. **[Core devices]** (コアデバイス) を選択します。

1. 管理するコアデバイスを選択します。

1. コアデバイスの詳細ページで、**[Client devices]** (クライアントデバイス) タブを選択します。

1. **[Associated client devices]** (関連付けられているクライアントデバイス) セクションで、**[Associate client devices]** (クライアントデバイスを関連付ける) を選択します。

1. **[Associate client devices with core device]** (クライアントデバイスをコアデバイスに関連付ける) モーダルで、関連付ける各クライアントデバイスに対して次の操作を行います。

   1. クライアントデバイスとして関連付ける AWS IoT モノの名前を入力します。

   1. **[Add]** (追加) を選択します。

1. **関連付ける** を選択してください。

   関連付けたクライアントデバイスで Greengrass ディスカバリ API を使用して、このコアデバイスを検出できるようになりました。

**クライアントデバイスのコアデバイスとの関連付けを外すには (コンソール)**

1. <a name="navigate-greengrass-console"></a>[AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)に移動します。

1. **[Core devices]** (コアデバイス) を選択します。

1. 管理するコアデバイスを選択します。

1. コアデバイスの詳細ページで、**[Client devices]** (クライアントデバイス) タブを選択します。

1. **[Associated client devices]** (関連付けられているクライアントデバイス) セクションで、関連付けを外す各クライアントデバイスを選択します。

1. [**関連付け解除**] を選択してください。

1. 確認モーダルで、**[Disassociate]** (関連付け解除) を選択します。

   関連付けを外したクライアントデバイスからは、Greengrass ディスカバリ API を使用して、このコアデバイスを検出できなくなります。

## クライアントデバイスとの関連付けを管理する (AWS CLI)
<a name="manage-client-device-associations-cli"></a>

 AWS Command Line Interface (AWS CLI) を使用して、コアデバイスのクライアントデバイスの関連付けを管理できます。

**クライアントデバイスのコアデバイスとの関連付けを表示するには (AWS CLI)**
+ 次のコマンドを使用します: [list-client-devices-associated-with-core-device](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/list-client-devices-associated-with-core-device.html)。

**クライアントデバイスをコアデバイスと関連付けるには (AWS CLI)**
+ 次のコマンドを使用します: [batch-associate-client-device-with-core-device](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/batch-associate-client-device-with-core-device.html)。

**クライアントデバイスのコアデバイスとの関連付けを外すには (AWS CLI)**
+ 次のコマンドを使用します: [batch-disassociate-client-device-from-core-device](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/batch-disassociate-client-device-from-core-device.html)。

## クライアントデバイスとの関連付けを管理する (API)
<a name="manage-client-device-associations-api"></a>

 AWS API を使用して、コアデバイスのクライアントデバイスの関連付けを管理できます。

**コアデバイスのクライアントデバイスの関連付けを表示するには (AWS API)**
+ 次の操作を使用します: [ListClientDevicesAssociatedWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_ListClientDevicesAssociatedWithCoreDevice.html)。

**クライアントデバイスをコアデバイスに関連付けるには (AWS API)**
+ 次の操作を使用します: [BatchAssociateClientDeviceWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html)。

**コアデバイスからクライアントデバイスの関連付けを解除するには (AWS API)**
+ 次の操作を使用します: [BatchDisassociateClientDeviceFromCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchDisassociateClientDeviceFromCoreDevice.html)。

# オフライン時のクライアントの認証
<a name="offline-authentication"></a>

*オフライン認証*では、 AWS IoT Greengrass コアデバイスがクラウドに接続されていない場合でも、クライアントデバイスがコアデバイスに接続できるように Core デバイスを設定できます。オフライン認証を使用する場合、Greengrass デバイスは、部分的にオフラインの環境でも引き続き動作します。

クラウドに接続しているクライアントデバイスのためにオフライン認証を使用するには、以下が必要です。
+ [クライアントデバイス認証](client-device-auth-component.md) コンポーネントがデプロイされた AWS IoT Greengrass Core デバイス。オフライン認証には、バージョン 2.3.0 以降を使用する必要があります。
+ クライアントデバイスの初回接続中におけるコアデバイス用のクラウド接続。

## クライアントの認証情報の保存
<a name="offline-auth-store-credentials"></a>

クライアントデバイスが初めてコアデバイスに接続すると、コアデバイスは AWS IoT Greengrass サービスを呼び出します。呼び出されると、Greengrass は、そのクライアントデバイスの登録を AWS IoT モノとして検証します。また、デバイスに有効な証明書があることも検証します。その後、そのコアデバイスがこの情報をローカルに保存します。

次回デバイスが接続されると、Greengrass コアデバイスは AWS IoT Greengrass サービスでクライアントデバイスの検証を試みます。に接続できない場合 AWS IoT Greengrass、コアデバイスはローカルに保存されたデバイス情報を使用してクライアントデバイスを検証します。

Greengrass コアデバイスが認証情報を保存する期間を設定できます。「[クライアントデバイス認証コンポーネントの設定](https://docs.aws.amazon.com//greengrass/v2/developerguide/client-device-auth-component.html#client-device-auth-component-configuration)」で `clientDeviceTrustDurationMinutes` 設定オプションを設定することで、タイムアウトを 1 分から 2,147,483,647 分に設定できます。デフォルトは 1 分です。これにより、オフライン認証は事実上オフになります。このタイムアウトを設定するときは、セキュリティのニーズを考慮することをお勧めします。また、クラウドから切断されている間におけるコアデバイスの想定実行時間も考慮する必要があります。

コアデバイスは認証情報ストレージを 3 回更新します。

1. デバイスが初めてコアデバイスに接続するとき。

1. クライアントデバイスがコアデバイスに再接続するとき (コアデバイスがクラウドに接続されている場合)。

1. 認証情報ストア全体を更新するために 1 日に 1 回 (コアデバイスがクラウドに接続されている場合)。

Greengrass コアデバイスは、認証情報ストアを更新するときに、[ListClientDevicesAssociatedWithCoreDevice](https://docs.aws.amazon.com//greengrass/v2/APIReference/API_ListClientDevicesAssociatedWithCoreDevice.html) オペレーションを使用します。Greengrass は、このオペレーションによって返されたデバイスのみを更新します。クライアントデバイスをコアデバイスと関連付けるには、「[クライアントデバイスを関連付ける](associate-client-devices.md)」を参照してください。

`ListClientDevicesAssociatedWithCoreDevice` オペレーションを使用するには、 オペレーションのアクセス許可を、 が実行する に関連付けられた AWS Identity and Access Management (IAM) AWS アカウント ロールに追加する必要があります AWS IoT Greengrass。詳細については、「[コアデバイスが AWS サービスとやり取りできるように認可する](device-service-role.md)」を参照してください。

# コアデバイスのエンドポイントを管理
<a name="manage-core-device-endpoints"></a>

クラウドディスカバリを使用するとき、コアデバイスの MQTT ブローカエンドポイントを AWS IoT Greengrass クラウドサービスに保存します。クライアントデバイスは に接続 AWS IoT Greengrass して、関連するコアデバイスのこれらのエンドポイントとその他の情報を取得します。

各コアデバイスに、エンドポイントを自動または手動で管理できます。
+ **IP ディテクタでエンドポイントを自動的に管理**

  クライアントデバイスがコアデバイスと同じネットワーク上の場所など、複雑ではないネットワーク設定を行っている場合、[IP 検知コンポーネント](ip-detector-component.md)をデプロイして、ユーザーに代わってコアデバイスエンドポイントを自動的に管理できます。例えば、コアデバイスが、MQTT ブローカーポートをコアデバイスに転送するルータの背後にある場合、IP ディテクタコンポーネントを使用できません。

  IP ディテクタコンポーネントは、モノグループにあるすべてのコアデバイスのエンドポイントを管理するため、モノグループに展開する場合にも役立ちます。詳細については、「[IP ディテクタを使用してエンドポイントを自動的に管理](#use-ip-detector)」を参照してください。
+ **エンドポイントを手動で管理**

  IP ディテクタコンポーネントを使用できない場合、コアデバイスエンドポイントを手動で管理する必要があります。コンソールまたは API でこれらのエンドポイントを更新できます。詳細については、「[エンドポイントを手動で管理](#manually-manage-endpoints)」を参照してください。

**Topics**
+ [IP ディテクタを使用してエンドポイントを自動的に管理](#use-ip-detector)
+ [エンドポイントを手動で管理](#manually-manage-endpoints)

## IP ディテクタを使用してエンドポイントを自動的に管理
<a name="use-ip-detector"></a>

コアデバイスと同じネットワーク上でクライアントデバイスなど、単純なネットワーク設定がある場合、[IP ディテクターコンポーネント](ip-detector-component.md)をデプロイして次の手順を実行ます。
+ Greengrass コアデバイスのローカルネットワーク接続情報をモニタリングします。この情報には、コアデバイスのネットワークエンドポイントと MQTT ブローカーが動作するポートが含まれます。
+ コアデバイスの接続情報を AWS IoT Greengrass クラウドサービスに報告します。

IP ディテクタコンポーネントは、手動で設定するエンドポイントを上書きします。

**重要**  
コアデバイスの AWS IoT ポリシーでは、IP ディテクターコンポーネントを使用するアクセス`greengrass:UpdateConnectivityInfo`許可を に許可する必要があります。詳細については、「[AWS IoT データプレーンオペレーションの ポリシー](device-auth.md#iot-policies)」および「[AWS IoT モノのポリシーを設定する](connect-client-devices.md#configure-iot-policy-requirement)」を参照してください。

IP ディテクターコンポーネントをデプロイするため、次のいずれかを行います。
+ コンソールの **[Configure discovery]** (ディスカバリの設定) ページを使用します。詳細については、「[クラウドディスカバリを設定する (コンソール)](connect-client-devices.md#configure-cloud-discovery-console)」を参照してください。
+ IP ディテクタを含めるようにデプロイを作成と改訂します。コンソール、 AWS CLI、または AWS API を使用してデプロイを管理できます。詳細については、「[デプロイの作成](create-deployments.md)」を参照してください。

### IP ディテクタコンポーネントをデプロイ (コンソール)
<a name="deploy-ip-detector-console"></a>

1. [AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)のナビゲーションメニューで、**[Components]** (コンポーネント) を選択します。

1. **[Components]** (コンポーネント) ページで、**[Public components]** (公開コンポーネント) タブを選択し、次に **aws.greengrass.clientdevices.IPDetector** を選択します。

1. **aws.greengrass.clientdevices.IPDetector** ページで、**[Deploy]** (デプロイ) を選択します。

1. <a name="deploy-component-choose-deployment-step"></a>**[Add to deployment]** (デプロイに追加) で、改訂する既存のデプロイを選択するか、新しいデプロイを作成することを選択して、**[Next]** (次へ) を選択します。

1. <a name="deploy-component-choose-target-step"></a>新しいデプロイの作成を選択した場合、デプロイのターゲットコアデバイスまたはモノグループを選択します。リポジトリの **[Specify target]** (ターゲットを指定) ページの、**[Deployment target]** (ターゲットのデプロイ) で、コアデバイスまたはモノグループを選択し、**[Next]** (次へ) を選択します。

1. **[Select components]** (コンポーネントを選択) ページで、**aws.greengrass.clientdevices.IPDetector** コンポーネントが選択されていることを確認し、**[Next]** (次) を選択します。

1. **[Configure components]** (コンポーネントを設定) ページで、**aws.greengrass.clientdevices.IPDetector** を選択したら、次の操作を行います。

   1. **[Configure component]** (コンポーネントを設定) を選択します。

   1. **[aws.greengrass.clientdevices.IPDetector を設定]** モーダルで、**[マージする設定]** の **[設定の更新]** 内に、設定更新を入力して IP ディテクタコンポーネントを設定できます。次の設定オプションのいずれかを指定できます。
      + `defaultPort` - <a name="ip-detector-component-configuration-default-port-definition"></a>(オプション) このコンポーネントが IP アドレスを検出するときに報告する MQTT ブローカーポート。デフォルトポート 8883 とは異なるポートを使用するように MQTT ブローカーを設定する場合、このパラメータを指定する必要があります。
      + `includeIPv4LoopbackAddrs` - <a name="ip-detector-component-configuration-include-ipv4-loopback-addrs-definition"></a>(オプション) このオプションを有効にして IPv4 ループバックアドレスを検出して報告します。これらは、`localhost` など、IP アドレスであり、デバイスが自身と通信できる場所です。このオプションは、コアデバイスとクライアントデバイスを同じシステムで実行するテスト環境で使用します。
      + `includeIPv4LinkLocalAddrs` - <a name="ip-detector-component-configuration-include-ipv4-link-local-addrs-definition"></a>(オプション) このオプションを有効にして IPv4 [リンクローカルアドレス](https://en.wikipedia.org/wiki/Link-local_address)を検出して報告します。このオプションは、コアデバイスのネットワークに Dynamic Host Configuration Protocol (DHCP) または静的に割り当てられた IP アドレスがない場合に使用します。
      + `includeIPv6LoopbackAddrs` - <a name="ip-detector-component-configuration-include-ipv6-loopback-addrs-definition"></a>(オプション) このオプションを有効にして IPv6 ループバックアドレスを検出して報告します。これらは、`localhost` など、IP アドレスであり、デバイスが自身と通信できる場所です。このオプションは、コアデバイスとクライアントデバイスを同じシステムで実行するテスト環境で使用します。このオプションを使用するには、`includeIPv4Addrs` を `false` に設定し、`includeIPv6Addrs` を `true` に設定する必要があります。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。
      + `includeIPv6LinkLocalAddrs` - <a name="ip-detector-component-configuration-include-ipv6-link-local-addrs-definition"></a>(オプション) このオプションを有効にして IPv6 [リンクローカルアドレス](https://en.wikipedia.org/wiki/Link-local_address)を検出して報告します。このオプションは、コアデバイスのネットワークに Dynamic Host Configuration Protocol (DHCP) または静的に割り当てられた IP アドレスがない場合に使用します。このオプションを使用するには、`includeIPv4Addrs` を `false` に設定し、`includeIPv6Addrs` を `true` に設定する必要があります。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。
      + `includeIPv4Addrs` – <a name="ip-detector-component-configuration-include-ipv4-addrs-definition"></a>(オプション) デフォルトは True に設定されています。このオプションを有効にして、コアデバイスにある IPv4 アドレスを発行できます。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。
      + `includeIPv6Addrs` – <a name="ip-detector-component-configuration-include-ipv6-addrs-definition"></a>(オプション) このオプションを有効にして、コアデバイスにある IPv6 アドレスを発行できます。このオプションを使用するには、`includeIPv4Addrs` を `false` に設定します。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。

      設定更新は、次の例のようになることがあります。

      ```
      {
        "defaultPort": "8883",
        "includeIPv4LoopbackAddrs": false,
        "includeIPv4LinkLocalAddrs": false
      }
      ```

   1. **[Confirm]** (確認) を選択してモーダルを閉じ、次に **[Next]** (次) を選択します。

1. <a name="deploy-component-configure-advanced-settings-step"></a>**[Configure advanced settings]** (詳細設定) ページはデフォルト設定のままにし、**[Next]** (次へ) を選択します。

1. <a name="deploy-component-review-and-deploy-step"></a>[**Review**] ページで、[**デプロイ**] を選択します。

   デプロイに最大 1 分かかる場合があります。

### IP ディテクタコンポーネント (AWS CLI) の展開
<a name="deploy-ip-detector-cli"></a>

IP ディテクタコンポーネントをデプロイするには、`components` オブジェクトに `aws.greengrass.clientdevices.IPDetector` を含むデプロイドキュメントを作成してコンポーネントの設定更新を指定します。[デプロイの作成](create-deployments.md) の指示に従って、新しいデプロイを作成または既存のデプロイを改訂します。

デプロイドキュメントの作成時に IP ディテクタコンポーネントを設定するため、次のオプションのいずれかを指定できます。
+ `defaultPort` - <a name="ip-detector-component-configuration-default-port-definition"></a>(オプション) このコンポーネントが IP アドレスを検出するときに報告する MQTT ブローカーポート。デフォルトポート 8883 とは異なるポートを使用するように MQTT ブローカーを設定する場合、このパラメータを指定する必要があります。
+ `includeIPv4LoopbackAddrs` - <a name="ip-detector-component-configuration-include-ipv4-loopback-addrs-definition"></a>(オプション) このオプションを有効にして IPv4 ループバックアドレスを検出して報告します。これらは、`localhost` など、IP アドレスであり、デバイスが自身と通信できる場所です。このオプションは、コアデバイスとクライアントデバイスを同じシステムで実行するテスト環境で使用します。
+ `includeIPv4LinkLocalAddrs` - <a name="ip-detector-component-configuration-include-ipv4-link-local-addrs-definition"></a>(オプション) このオプションを有効にして IPv4 [リンクローカルアドレス](https://en.wikipedia.org/wiki/Link-local_address)を検出して報告します。このオプションは、コアデバイスのネットワークに Dynamic Host Configuration Protocol (DHCP) または静的に割り当てられた IP アドレスがない場合に使用します。
+ `includeIPv6LoopbackAddrs` - <a name="ip-detector-component-configuration-include-ipv6-loopback-addrs-definition"></a>(オプション) このオプションを有効にして IPv6 ループバックアドレスを検出して報告します。これらは、`localhost` など、IP アドレスであり、デバイスが自身と通信できる場所です。このオプションは、コアデバイスとクライアントデバイスを同じシステムで実行するテスト環境で使用します。このオプションを使用するには、`includeIPv4Addrs` を `false` に設定し、`includeIPv6Addrs` を `true` に設定する必要があります。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。
+ `includeIPv6LinkLocalAddrs` - <a name="ip-detector-component-configuration-include-ipv6-link-local-addrs-definition"></a>(オプション) このオプションを有効にして IPv6 [リンクローカルアドレス](https://en.wikipedia.org/wiki/Link-local_address)を検出して報告します。このオプションは、コアデバイスのネットワークに Dynamic Host Configuration Protocol (DHCP) または静的に割り当てられた IP アドレスがない場合に使用します。このオプションを使用するには、`includeIPv4Addrs` を `false` に設定し、`includeIPv6Addrs` を `true` に設定する必要があります。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。
+ `includeIPv4Addrs` – <a name="ip-detector-component-configuration-include-ipv4-addrs-definition"></a>(オプション) デフォルトは True に設定されています。このオプションを有効にして、コアデバイスにある IPv4 アドレスを発行できます。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。
+ `includeIPv6Addrs` – <a name="ip-detector-component-configuration-include-ipv6-addrs-definition"></a>(オプション) このオプションを有効にして、コアデバイスにある IPv6 アドレスを発行できます。このオプションを使用するには、`includeIPv4Addrs` を `false` に設定します。このオプションを使用するには、IP ディテクター v2.2.0 以降が必要です。

次の部分的なデプロイドキュメントの例では、ポート 8883 を MQTT ブローカーポートとして報告するように指定しています。

```
{
  ...,
  "components": {
    ...,
    "aws.greengrass.clientdevices.IPDetector": {
      "componentVersion": "2.1.1",
      "configurationUpdate": {
        "merge": "{\"defaultPort\":\"8883\",}"
      }
    }
  }
}
```

## エンドポイントを手動で管理
<a name="manually-manage-endpoints"></a>

コアデバイスの MQTT ブローカーエンドポイントを手動で管理できます。

各 MQTT ブローカーのエンドポイントには次の情報があります。

**[Endpoint]** (エンドポイント) (`HostAddress`)  
クライアントデバイスがコアデバイスの MQTT ブローカーに接続できる IP アドレスまたは DNS アドレス。

**ポート** (`PortNumber`)  
MQTT ブローカーがコアデバイスで動作するポート。  
このポートは、[モケット MQTT ブローカーコンポーネント](mqtt-broker-moquette-component.md)に設定でき、デフォルトでポート 8883 が使用されます。

**[Metadata]** (メタデータ) (`Metadata`)  
このエンドポイントに接続するクライアントデバイスに提供する追加のメタデータ。

**Topics**
+ [エンドポイントの管理 (コンソール)](#manually-manage-endpoints-console)
+ [エンドポイント (AWS CLI) を管理します。](#manually-manage-endpoints-cli)
+ [エンドポイント (API) の管理](#manually-manage-endpoints-api)

### エンドポイントの管理 (コンソール)
<a name="manually-manage-endpoints-console"></a>

 AWS IoT Greengrass コンソールを使用して、コアデバイスのエンドポイントを表示、更新、削除できます。

**コアデバイス (コンソール) のエンドポイントを管理するには**

1. <a name="navigate-greengrass-console"></a>[AWS IoT Greengrass コンソール](https://console.aws.amazon.com/greengrass)に移動します。

1. **[Core devices]** (コアデバイス) を選択します。

1. 管理するコアデバイスを選択します。

1. コアデバイスの詳細ページで、**[Client devices]** (クライアントデバイス) タブを選択します。

1. **[MQTT broker endpoints]** (MQTT ブローカーエンドポイント) セクションで、コアデバイスの MQTT ブローカーエンドポイントを確認できます。**[Manage endpoints]** (エンドポイント管理) を選択します。

1. **[Manage endpoints]** (エンドポイント管理) モーダルで、コアデバイスの MQTT ブローカーエンドポイントを追加または削除します。

1. **[更新]** を選択します。

### エンドポイント (AWS CLI) を管理します。
<a name="manually-manage-endpoints-cli"></a>

 AWS Command Line Interface (AWS CLI) を使用して、コアデバイスのエンドポイントを管理できます。

**注記**  
のクライアントデバイスサポート AWS IoT Greengrass V2 は と下位互換性があるため AWS IoT Greengrass V1、 AWS IoT Greengrass V2 または AWS IoT Greengrass V1 API オペレーションを使用してコアデバイスエンドポイントを管理できます。

**コアデバイス (AWS CLI) のエンドポイントを取得するには**
+ 次のコマンドのいずれかを実行してください:
  + [greengrassv2: get-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/get-connectivity-info.html)
  + [greengrass: get-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrass/get-connectivity-info.html)

**コアデバイス (AWS CLI) のエンドポイントを更新するには**
+ 次のコマンドのいずれかを実行してください:
  + [greengrassv2: update-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrassv2/update-connectivity-info.html)
  + [greengrass: update-connectivity-info](https://docs.aws.amazon.com/cli/latest/reference/greengrass/update-connectivity-info.html)

### エンドポイント (API) の管理
<a name="manually-manage-endpoints-api"></a>

 AWS API を使用して、コアデバイスのエンドポイントを管理できます。

**注記**  
のクライアントデバイスサポート AWS IoT Greengrass V2 は と下位互換性があるため AWS IoT Greengrass V1、 AWS IoT Greengrass V2 または AWS IoT Greengrass V1 API オペレーションを使用してコアデバイスエンドポイントを管理できます。

**コアデバイスのエンドポイントを取得するには (AWS API)**
+ 次の操作のいずれかを実行してください:
  + [V2: GetConnectivityInfo](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_GetConnectivityInfo.html)
  + [V1: GetConnectivityInfo](https://docs.aws.amazon.com/greengrass/v1/apireference/getconnectivityinfo-get.html)

**コアデバイスのエンドポイントを更新するには (AWS API)**
+ 次の操作のいずれかを実行してください:
  + [V2: UpdateConnectivityInfo](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_UpdateConnectivityInfo.html)
  + [V1: UpdateConnectivityInfo](https://docs.aws.amazon.com/greengrass/v1/apireference/updateconnectivityinfo-put.html)

# MQTT ブローカーを選択する
<a name="choose-local-mqtt-broker"></a>

AWS IoT Greengrass では、コアデバイスで実行するローカル MQTT ブローカーを、選択するためのオプションを用意しています。クライアントデバイスは、コアデバイスで実行される MQTT ブローカーに接続します。したがって、そのクライアントデバイスと互換性のある MQTT ブローカーを選択する必要があります。

**注記**  <a name="note-deploy-one-mqtt-broker"></a>
デプロイする MQTT ブローカーコンポーネントは、1 つだけにすることをお勧めします。[MQTT ブリッジ](mqtt-bridge-component.md)と [IP ディテクター](ip-detector-component.md)コンポーネントは、一度に 1 つの MQTT ブローカーコンポーネントとのみ動作します。デプロイする MQTT ブローカーコンポーネントが複数ある場合は、それぞれが異なるポートを使用する設定を行う必要があります。

MQTT ブローカーは、以下から選択できます。
+ **[MQTT 3.1.1 ブローカー (Moquette)](mqtt-broker-moquette-component.md)** – `aws.greengrass.clientdevices.mqtt.Moquette`

  MQTT 3.1.1 標準に準拠した軽量 MQTT ブローカーの場合は、このオプションを選択します。AWS IoT Core MQTT ブローカーと AWS IoT Device SDK も MQTT 3.1.1 標準にも準拠しているため、これらの機能を使用して、デバイス全体と AWS クラウド で MQTT 3.1.1 を使用するアプリケーションを作成ことが可能です。
+ **[MQTT 5 ブローカー (EMQX)](mqtt-broker-emqx-component.md)** – `aws.greengrass.clientdevices.mqtt.EMQX`

  コアデバイスとクライアントデバイス間の通信に MQTT 5 の機能を使用するには、このオプションを選択します。このコンポーネントは、Mocquette MQTT 3.1.1 ブローカーより多くのリソースを使用します。また、Linux コアデバイスでは Docker が必要となります。

  MQTT 5 は MQTT 3.1.1 に対し下位互換性があるため、このブローカーにも、MQTT 3.1.1 を使用するクライアントデバイスを接続することができます。実行している Mocquette MQTT 3.1.1 ブローカーを EMQX MQTT 5 ブローカーに置き換えることが可能で、その場合も、クライアントデバイスは問題なく接続や動作を継続できます。

  <a name="note-local-mqtt-broker-mqtt-5-features"></a>
+ **カスタムブローカーを実装する**

  クライアントデバイスと通信する、カスタムのローカルブローカーコンポーネントを作成するには、このオプションを選択します。カスタムのローカルブローカーを作成すると、MQTT 以外のプロトコルを使用できます。AWS IoT Greengrass には、クライアントデバイスの認証と認可に使用できる、コンポーネント SDK が用意されています。詳細については、「[を使用して AWS IoT Device SDK Greengrass nucleus、その他のコンポーネント、および と通信します。 AWS IoT CoreGreengrass nucleus、他のコンポーネント、および と通信する AWS IoT Core](interprocess-communication.md)」および「[クライアントデバイスを認証して認可する](ipc-client-device-auth.md)」を参照してください。

# MQTT ブローカーを使用してクライアントデバイスを AWS IoT Greengrass Core デバイスに接続する
<a name="connecting-to-mqtt"></a>

 AWS IoT Greengrass Core デバイスで MQTT ブローカーを使用する場合、デバイスはデバイス固有の*コアデバイス認証局 (CA)* を使用して、クライアントとの相互 TLS 接続を行うためにブローカーに証明書を発行します。

AWS IoT Greengrass はコアデバイス CA を自動生成するか、独自の CA を指定できます。コアデバイス CA は、[クライアントデバイス認証](client-device-auth-component.md)コンポーネントが接続され AWS IoT Greengrass ているときに に登録されます。自動生成されたコアデバイス CA は永続的であり、クライアントデバイス認証コンポーネントが設定されている限り、デバイスは同じ CA を使用し続けます。

MQTT ブローカーが起動すると、証明書をリクエストします。クライアントデバイス認証コンポーネントは、コアデバイス CA を使用して X.509 証明書を発行します。証明書は、ブローカーの起動時、証明書の失効時、または IP アドレスなどの接続に関する情報の変更時にローテーションされます。詳細については、「[ローカル MQTT ブローカー上での証明書ローテーション](device-auth.md#mqtt-certificate-expiration)」を参照してください。

クライアントを MQTT ブローカーに接続するには、次が必要です。
+ クライアントデバイスには AWS IoT Greengrass Core デバイス CA が必要です。この CA は、クラウド検出を通じて、または手動で CA を提供することによって取得できます。詳細については、「[独自の認証機関の使用](#use-your-own-CA)」を参照してください。
+ コアデバイスの完全修飾ドメイン名 (FQDN) または IP アドレスは、コアデバイス CA によって発行されたブローカー証明書に存在する必要があります。[IP ディテクター](ip-detector-component.md) コンポーネントを使用するか、または IP アドレスを手動で設定することで、これを確実に実現できます。詳細については、「[コアデバイスのエンドポイントを管理](manage-core-device-endpoints.md)」を参照してください。
+ クライアントデバイス認証コンポーネントは、Greengrass コアデバイスに接続するための許可をクライアントデバイスに付与する必要があります。詳細については、「[クライアントデバイス認証](client-device-auth-component.md)」を参照してください。

## 独自の認証機関の使用
<a name="use-your-own-CA"></a>

クライアントデバイスがクラウドにアクセスしてコアデバイスを検出できない場合は、コアデバイス認証機関 (CA) を指定できます。Greengrass コアデバイスは、コアデバイス CA を使用して MQTT ブローカーの証明書を発行します。コアデバイスを設定してクライアントデバイスに CA をプロビジョニングすると、クライアントデバイスは、コアデバイス CA (独自に提供された CA または自動生成された CA) を使用してエンドポイントに接続し、TLS ハンドシェイクを検証できます。

コアデバイス CA を使用するように [クライアントデバイス認証](client-device-auth-component.md) コンポーネントを設定するには、コンポーネントをデプロイするときに `certificateAuthority` 設定パラメータを設定します。設定時には次の詳細情報を入力する必要があります。
+ コアデバイス CA 証明書の場所。
+ コアデバイス CA 証明書のプライベートキー。
+ (オプション) ルート証明書への証明書チェーン (コアデバイス CA が中間 CA の場合)。

コアデバイス CA を指定すると、 は CA をクラウド AWS IoT Greengrass に登録します。

証明書は、ハードウェアセキュリティモジュールまたはファイルシステムに保存できます。次の例は、HSM/TPM を使用して格納された中間 CA の `certificateAuthority` 設定を示しています。証明書チェーンはディスクにのみ保存できることに注意してください。

```
  "certificateAuthority": {
      "certificateUri": "pkcs11:object=CustomerIntermediateCA;type=cert",
      "privateKeyUri": "pkcs11:object=CustomerIntermediateCA;type=private"
      "certificateChainUri": "file:///home/ec2-user/creds/certificateChain.pem",
    }
```

この例では、`certificateAuthority` 設定パラメータがファイルシステムから中間 CA を使用するように、クライアントデバイス認証コンポーネントを設定します。

```
  "certificateAuthority": {
      "certificateUri": "file:///home/ec2-user/creds/intermediateCA.pem",
      "privateKeyUri": "file:///home/ec2-user/creds/intermediateCA.privateKey.pem",
      "certificateChainUri": "file:///home/ec2-user/creds/certificateChain.pem",
    }
```

デバイスを AWS IoT Greengrass Core デバイスに接続するには、次の手順を実行します。

1. 組織のルート CA を使用して Greengrass コアデバイス用の中間認証機関 (CA) を作成します。セキュリティに関するベストプラクティスとして、中間 CA を使用することをお勧めします。

1. 中間 CA 証明書、プライベートキー、証明書チェーンを、ルート CA から Greengrass コアデバイスに提供します。詳細については、「[クライアントデバイス認証](client-device-auth-component.md)」を参照してください。中間 CA は Greengrass コアデバイスのコアデバイス CA になり、デバイスは CA を に登録します AWS IoT Greengrass。

1. クライアントデバイスを AWS IoT モノとして登録します。詳細については、「AWS IoT Core デベロッパーガイド」の「[モノのオブジェクトを作成する](https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html#create-aws-thing)」を参照してください。プライベートキー、パブリックキー、デバイス証明書、およびルート CA 証明書をクライアントデバイスに追加します。情報を追加する方法は、デバイスとソフトウェアによって異なります。

デバイスを設定すると、証明書とパブリックキーチェーンを使用して Greengrass コアデバイスに接続できるようになります。コアデバイスエンドポイントを見つけるのはソフトウェアの役割です。コアデバイスのエンドポイントを手動で設定できます。詳細については、「[エンドポイントを手動で管理](manage-core-device-endpoints.md#manually-manage-endpoints)」を参照してください。

# クライアントデバイス通信をテストする
<a name="test-client-device-communications"></a>

クライアントデバイスは、 AWS IoT Device SDK を使用してコアデバイスを検出、接続、および通信できます。で Greengrass 検出クライアント AWS IoT Device SDK を使用して [Greengrass 検出 API ](greengrass-discover-api.md)を使用できます。これにより、クライアントデバイスが接続できるコアデバイスに関する情報が返されます。API レスポンスには、接続する MQTT ブローカエンドポイントと、各コアデバイスの身元を確認するために使用する証明書が含まれます。その後、クライアントデバイスは、コアデバイスに正常に接続されるまで、各エンドポイントを試すことができます。

クライアントデバイスは、関連付けられているコアデバイスのみを検出できます。クライアントデバイスとコアデバイス間の通信をテストする前に、クライアントデバイスをコアデバイスに関連付ける必要があります。詳細については、「[クライアントデバイスを関連付ける](associate-client-devices.md)」を参照してください。

Greengrass 検出 API は、指定したコアデバイス MQTT ブローカーエンドポイントを返します。[[IP detector component]](ip-detector-component.md) (IP ディテクターコンポーネント) を使用して、これらのエンドポイントを管理することも、各コアデバイスに対して手動で管理することもできます。詳細については、「[コアデバイスのエンドポイントを管理](manage-core-device-endpoints.md)」を参照してください。

**注記**  
Greengrass discovery API を使用するには、クライアントデバイスに `greengrass:Discover` アクセス許可が必要です。詳細については、「[クライアントデバイスの最小 AWS IoT ポリシー](device-auth.md#client-device-minimal-iot-policy)」を参照してください。

 AWS IoT Device SDK は複数のプログラミング言語で利用できます。詳細については、「AWS IoT Core デベロッパーガイド」の「[AWS IoT デバイス SDK](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)」を参照してください。

**Topics**
+ [通信をテストする (Python)](#test-client-device-communications-python)
+ [通信をテストする (C\$1\$1)](#test-client-device-communications-cpp)
+ [通信をテストする (JavaScript)](#test-client-device-communications-javascript)
+ [通信をテストする (Java)](#test-client-device-communications-java)

## 通信をテストする (Python)
<a name="test-client-device-communications-python"></a>

このセクションでは、[AWS IoT Device SDK v2 for Python](https://github.com/aws/aws-iot-device-sdk-python-v2) の Greengrass 検出サンプルを使用して、クライアントデバイスとコアデバイス間の通信をテストします。

**重要**  
 AWS IoT Device SDK v2 for Python を使用するには、デバイスが Python 3.6 以降を実行する必要があります。

**通信をテストするには (AWS IoT Device SDK v2 for Python)**

1. <a name="download-iot-device-sdk-python-v2"></a>[AWS IoT Device SDK v2 for Python ](https://github.com/aws/aws-iot-device-sdk-python-v2)をダウンロードして AWS IoT モノにインストールし、クライアントデバイスとして接続します。

   クライアントデバイスで、次の操作を行います。

   1. v2 for Python AWS IoT Device SDK リポジトリのクローンを作成してダウンロードします。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git
      ```

   1. v2 for AWS IoT Device SDK Python をインストールします。

      ```
      python3 -m pip install --user ./aws-iot-device-sdk-python-v2
      ```

1. <a name="cd-iot-device-sdk-python-v2"></a>を v2 for AWS IoT Device SDK Python のサンプルフォルダに変更します。

   ```
   cd aws-iot-device-sdk-python-v2/samples/greengrass
   ```

1. <a name="test-client-device-communications-application-intro"></a>サンプルの Greengrass 検出アプリケーションを実行します。このアプリケーションでは、クライアントデバイスのモノの名前、使用する MQTT トピックとメッセージ、および接続を認証して保護する証明書を指定する引数が必要です。次の例では、`clients/MyClientDevice1/hello/world` トピックに「Hello World」メッセージを送信します。<a name="test-client-device-communications-application-command-replace"></a>
   + *MyClientDevice1* は、クライアントデバイスでのモノの名前に置き換えます。
   + *\$1/certs/AmazonRootCA1.pem* をクライアントデバイスの Amazon ルート CA 証明書へのパスに置き換えます。
   + *\$1/certs/device.pem.crt* をクライアントデバイスのデバイス証明書へのパスに置き換えます。
   + *\$1/certs/private.pem.key* をクライアントデバイスのプライベートキーファイルへのパスに置き換えます。
   + *us-east-1* を、クライアントデバイスとコアデバイスが動作する AWS リージョンに置き換えます。

   ```
   python3 basic_discovery.py \\
     --thing_name MyClientDevice1 \\
     --topic 'clients/MyClientDevice1/hello/world' \\
     --message 'Hello World!' \\
     --ca_file ~/certs/AmazonRootCA1.pem \\
     --cert ~/certs/device.pem.crt \\
     --key ~/certs/private.pem.key \\
     --region us-east-1 \\
     --verbosity Warn
   ```

   <a name="test-client-device-communications-application-output-intro"></a>検出サンプルアプリケーションはメッセージを 10 回送信し、その後切断します。また、メッセージの公開先と同じトピックにサブスクライブします。出力にアプリケーションがトピックに関する MQTT メッセージを受信したことが示される場合は、クライアントデバイスはコアデバイスと正常に通信できています。

   ```
   Performing greengrass discovery...
   awsiot.greengrass_discovery.DiscoverResponse(gg_groups=[awsiot.greengrass_discovery.GGGroup(gg_group_id='greengrassV2-coreDevice-MyGreengrassCore', cores=[awsiot.greengrass_discovery.GGCore(thing_arn='arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore', connectivity=[awsiot.greengrass_discovery.ConnectivityInfo(id='203.0.113.0', host_address='203.0.113.0', metadata='', port=8883)])], certificate_authorities=['-----BEGIN CERTIFICATE-----\
   MIICiT...EXAMPLE=\
   -----END CERTIFICATE-----\
   '])])
   Trying core arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore at host 203.0.113.0 port 8883
   Connected!
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 0}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 0}'
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 1}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 1}'
   
   ...
   
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 9}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 9}'
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>アプリケーションが代わりにエラーを出力する場合は、「[Greengrass 検出で生じる問題のトラブルシューティング](troubleshooting-client-devices.md#greengrass-discovery-issues)」を参照してください。

   <a name="test-client-device-communications-application-view-core-logs"></a>コアデバイスの Greengrass ログを表示して、クライアントデバイスが正常に接続してメッセージを送信しているかどうかを確認することもできます。詳細については、「[AWS IoT Greengrass ログのモニタリング](monitor-logs.md)」を参照してください。

## 通信をテストする (C\$1\$1)
<a name="test-client-device-communications-cpp"></a>

このセクションでは、[AWS IoT Device SDK v2 for C\$1\$1](https://github.com/aws/aws-iot-device-sdk-cpp-v2) の Greengrass 検出サンプルを使用して、クライアントデバイスとコアデバイス間の通信をテストします。

<a name="iot-device-sdk-cpp-v2-build-requirements-intro"></a> AWS IoT Device SDK v2 for C\$1\$1 を構築するには、デバイスに次のツールが必要です。<a name="iot-device-sdk-cpp-v2-build-requirements"></a>
+ C\$1\$1 11 以降
+ CMake 3.1 以降
+ 以下のいずれかのコンパイラ:
  + GCC 4.8 以降
  + Clang 3.9 以降
  + MSVC 2015 以降

**通信をテストするには (AWS IoT Device SDK v2 for C\$1\$1)**

1. [AWS IoT Device SDK v2 for C\$1\$1](https://github.com/aws/aws-iot-device-sdk-cpp-v2) を AWS IoT モノにダウンロードしてビルドし、クライアントデバイスとして接続します。

   クライアントデバイスで、次の操作を行います。

   1. v2 for C\$1\$1 AWS IoT Device SDK ワークスペースのフォルダを作成し、変更します。

      ```
      cd
      mkdir iot-device-sdk-cpp
      cd iot-device-sdk-cpp
      ```

   1. v2 for C\$1\$1 AWS IoT Device SDK リポジトリのクローンを作成してダウンロードします。`--recursive` フラグは、サブモジュールをダウンロードすることを指定します。

      ```
      git clone --recursive https://github.com/aws/aws-iot-device-sdk-cpp-v2.git
      ```

   1.  AWS IoT Device SDK v2 for C\$1\$1 ビルド出力用のフォルダを作成し、そのフォルダに変更します。

      ```
      mkdir aws-iot-device-sdk-cpp-v2-build
      cd aws-iot-device-sdk-cpp-v2-build
      ```

   1. C\$1\$1 AWS IoT Device SDK 用の v2 を構築します。

      ```
      cmake -DCMAKE_INSTALL_PREFIX="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" ../aws-iot-device-sdk-cpp-v2
      cmake --build . --target install
      ```

1. v2 for C\$1\$1 AWS IoT Device SDK で Greengrass 検出サンプルアプリケーションを構築します。以下の操作を実行します。

   1. を v2 for C\$1\$1 AWS IoT Device SDK の Greengrass 検出サンプルフォルダに変更します。

      ```
      cd ../aws-iot-device-sdk-cpp-v2/samples/greengrass/basic_discovery
      ```

   1. Greengrass 検出サンプルビルド出力用のフォルダを作成し、そのフォルダに変更します。

      ```
      mkdir build
      cd build
      ```

   1. Greengrass 検出サンプルアプリケーションをビルドします。

      ```
      cmake -DCMAKE_PREFIX_PATH="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" ..
      cmake --build . --config "Release"
      ```

1. <a name="test-client-device-communications-application-scanner-intro"></a>サンプルの Greengrass 検出アプリケーションを実行します。このアプリケーションでは、クライアントデバイスのモノの名前、使用する MQTT トピック、および接続を認証して保護する証明書を指定する引数が必要です。次の例では、`clients/MyClientDevice1/hello/world` トピックをサブスクライブし、コマンドラインで入力したメッセージを同じトピックに公開します。<a name="test-client-device-communications-application-command-replace"></a>
   + *MyClientDevice1* は、クライアントデバイスでのモノの名前に置き換えます。
   + *\$1/certs/AmazonRootCA1.pem* をクライアントデバイスの Amazon ルート CA 証明書へのパスに置き換えます。
   + *\$1/certs/device.pem.crt* をクライアントデバイスのデバイス証明書へのパスに置き換えます。
   + *\$1/certs/private.pem.key* をクライアントデバイスのプライベートキーファイルへのパスに置き換えます。
   + *us-east-1* を、クライアントデバイスとコアデバイスが動作する AWS リージョンに置き換えます。

   ```
   ./basic-discovery \
     --thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --ca_file ~/certs/AmazonRootCA1.pem \
     --cert ~/certs/device.pem.crt \
     --key ~/certs/private.pem.key \
     --region us-east-1
   ```

   <a name="test-client-device-communications-application-scanner-output-intro"></a>検出サンプルアプリケーションは、トピックをサブスクライブし、公開するメッセージを入力するよう促します。

   ```
   Connecting to group greengrassV2-coreDevice-MyGreengrassCore with thing arn arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore, using endpoint 203.0.113.0:8883
   Connected to group greengrassV2-coreDevice-MyGreengrassCore, using connection to 203.0.113.0:8883
   Successfully subscribed to clients/MyClientDevice1/hello/world
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press enter. Enter 'exit' to exit this program.
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>アプリケーションが代わりにエラーを出力する場合は、「[Greengrass 検出で生じる問題のトラブルシューティング](troubleshooting-client-devices.md#greengrass-discovery-issues)」を参照してください。

1. <a name="test-client-device-communications-application-scanner-input"></a>**Hello World\$1** などのメッセージを入力します。

   ```
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press enter. Enter 'exit' to exit this program.
   Hello World!
   ```

   <a name="test-client-device-communications-application-scanner-input-output"></a>出力にアプリケーションがトピックに関する MQTT メッセージを受信したことが示される場合は、クライアントデバイスはコアデバイスと正常に通信できています。

   ```
   Operation on packetId 2 Succeeded
   Publish received on topic clients/MyClientDevice1/hello/world
   Message:
   Hello World!
   ```

   <a name="test-client-device-communications-application-view-core-logs"></a>コアデバイスの Greengrass ログを表示して、クライアントデバイスが正常に接続してメッセージを送信しているかどうかを確認することもできます。詳細については、「[AWS IoT Greengrass ログのモニタリング](monitor-logs.md)」を参照してください。

## 通信をテストする (JavaScript)
<a name="test-client-device-communications-javascript"></a>

このセクションでは、[AWS IoT Device SDK v2 for JavaScript](https://github.com/aws/aws-iot-device-sdk-js-v2) の Greengrass 検出サンプルを使用して、クライアントデバイスとコアデバイス間の通信をテストします。

**重要**  
 AWS IoT Device SDK v2 for JavaScript を使用するには、デバイスが Node v10.0 以降を実行する必要があります。

**通信をテストするには (AWS IoT Device SDK v2 for JavaScript)**

1. [AWS IoT Device SDK v2 for JavaScript ](https://github.com/aws/aws-iot-device-sdk-js-v2)をダウンロードして AWS IoT モノにインストールし、クライアントデバイスとして接続します。

   クライアントデバイスで、次の操作を行います。

   1. v2 for JavaScript AWS IoT Device SDK リポジトリをクローンしてダウンロードします。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git
      ```

   1. v2 for AWS IoT Device SDK JavaScript をインストールします。

      ```
      cd aws-iot-device-sdk-js-v2
      npm install
      ```

1. を v2 for JavaScript AWS IoT Device SDK の Greengrass 検出サンプルフォルダに変更します。

   ```
   cd samples/node/greengrass/basic_discovery
   ```

1. Greengrass 検出サンプルアプリケーションをインストールします。

   ```
   npm install
   ```

1. <a name="test-client-device-communications-application-intro"></a>サンプルの Greengrass 検出アプリケーションを実行します。このアプリケーションでは、クライアントデバイスのモノの名前、使用する MQTT トピックとメッセージ、および接続を認証して保護する証明書を指定する引数が必要です。次の例では、`clients/MyClientDevice1/hello/world` トピックに「Hello World」メッセージを送信します。<a name="test-client-device-communications-application-command-replace"></a>
   + *MyClientDevice1* は、クライアントデバイスでのモノの名前に置き換えます。
   + *\$1/certs/AmazonRootCA1.pem* をクライアントデバイスの Amazon ルート CA 証明書へのパスに置き換えます。
   + *\$1/certs/device.pem.crt* をクライアントデバイスのデバイス証明書へのパスに置き換えます。
   + *\$1/certs/private.pem.key* をクライアントデバイスのプライベートキーファイルへのパスに置き換えます。
   + *us-east-1* を、クライアントデバイスとコアデバイスが動作する AWS リージョンに置き換えます。

   ```
   node dist/index.js \
     --thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --message 'Hello World!' \
     --ca_file ~/certs/AmazonRootCA1.pem \
     --cert ~/certs/device.pem.crt \
     --key ~/certs/private.pem.key \
     --region us-east-1 \
     --verbose warn
   ```

   <a name="test-client-device-communications-application-output-intro"></a>検出サンプルアプリケーションはメッセージを 10 回送信し、その後切断します。また、メッセージの公開先と同じトピックにサブスクライブします。出力にアプリケーションがトピックに関する MQTT メッセージを受信したことが示される場合は、クライアントデバイスはコアデバイスと正常に通信できています。

   ```
   Discovery Response:
   {"gg_groups":[{"gg_group_id":"greengrassV2-coreDevice-MyGreengrassCore","cores":[{"thing_arn":"arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore","connectivity":[{"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}]}],"certificate_authorities":["-----BEGIN CERTIFICATE-----\nMIICiT...EXAMPLE=\n-----END CERTIFICATE-----\n"]}]}
   Trying endpoint={"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}
   [WARN] [2021-06-12T00:46:45Z] [00007f90c0e8d700] [socket] - id=0x7f90b8018710 fd=26: setsockopt() for NO_SIGNAL failed with errno 92. If you are having SIGPIPE signals thrown, you may want to install a signal trap in your application layer.
   Connected to endpoint={"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":1}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":2}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":3}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":4}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":5}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":6}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":7}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":8}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":9}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":10}
   Complete!
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>アプリケーションが代わりにエラーを出力する場合は、「[Greengrass 検出で生じる問題のトラブルシューティング](troubleshooting-client-devices.md#greengrass-discovery-issues)」を参照してください。

   <a name="test-client-device-communications-application-view-core-logs"></a>コアデバイスの Greengrass ログを表示して、クライアントデバイスが正常に接続してメッセージを送信しているかどうかを確認することもできます。詳細については、「[AWS IoT Greengrass ログのモニタリング](monitor-logs.md)」を参照してください。

## 通信をテストする (Java)
<a name="test-client-device-communications-java"></a>

このセクションでは、[AWS IoT Device SDK v2 for Java](https://github.com/aws/aws-iot-device-sdk-java-v2) の Greengrass 検出サンプルを使用して、クライアントデバイスとコアデバイス間の通信をテストします。

**重要**  
v2 for AWS IoT Device SDK Java を構築するには、デバイスに次のツールが必要です。  
Java 8 以降、`JAVA_HOME` が Java フォルダを指していること。
Apache Maven

**通信をテストするには (AWS IoT Device SDK v2 for Java)**

1. [AWS IoT Device SDK v2 for Java ](https://github.com/aws/aws-iot-device-sdk-java-v2)を AWS IoT モノにダウンロードしてビルドし、クライアントデバイスとして接続します。

   クライアントデバイスで、次の操作を行います。

   1. v2 for Java AWS IoT Device SDK リポジトリのクローンを作成してダウンロードします。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-java-v2.git
      ```

   1. を AWS IoT Device SDK v2 for Java フォルダに変更します。

   1. v2 for AWS IoT Device SDK Java を構築します。

      ```
      cd aws-iot-device-sdk-java-v2
      mvn versions:use-latest-versions -Dincludes="software.amazon.awssdk.crt*"
      mvn clean install
      ```

1. <a name="test-client-device-communications-application-scanner-intro"></a>サンプルの Greengrass 検出アプリケーションを実行します。このアプリケーションでは、クライアントデバイスのモノの名前、使用する MQTT トピック、および接続を認証して保護する証明書を指定する引数が必要です。次の例では、`clients/MyClientDevice1/hello/world` トピックをサブスクライブし、コマンドラインで入力したメッセージを同じトピックに公開します。<a name="test-client-device-communications-application-command-replace"></a>
   + 両方の *MyClientDevice1* のインスタンスを、クライアントデバイスのモノの名前に置き換えます。
   + *\$1HOME/certs/AmazonRootCA1.pem* をクライアントデバイスの Amazon ルート CA 証明書へのパスに置き換えます。
   + *\$1HOME/certs/device.pem.crt* をクライアントデバイスのデバイス証明書へのパスに置き換えます。
   + *\$1HOME/certs/private.pem.key* をクライアントデバイスのプライベートキーファイルへのパスに置き換えます。
   + *us-east-1* を、クライアントデバイスとコアデバイスが動作 AWS リージョン する に置き換えます。

   ```
   DISCOVERY_SAMPLE_ARGS="--thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --ca_file $HOME/certs/AmazonRootCA1.pem \
     --cert $HOME/certs/device.pem.crt \
     --key $HOME/certs/private.pem.key \
     --region us-east-1"
   
   mvn exec:java -pl samples/Greengrass/Discovery \
     -Dexec.mainClass=greengrass.BasicDiscovery \
     -Dexec.args="$DISCOVERY_SAMPLE_ARGS"
   ```

   <a name="test-client-device-communications-application-scanner-output-intro"></a>検出サンプルアプリケーションは、トピックをサブスクライブし、公開するメッセージを入力するよう促します。

   ```
   Connecting to group ID greengrassV2-coreDevice-MyGreengrassCore, with thing arn arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore, using endpoint 203.0.113.0:8883
   Started a clean session
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press Enter. Type 'exit' or 'quit' to exit this program:
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>アプリケーションが代わりにエラーを出力する場合は、「[Greengrass 検出で生じる問題のトラブルシューティング](troubleshooting-client-devices.md#greengrass-discovery-issues)」を参照してください。

1. <a name="test-client-device-communications-application-scanner-input"></a>**Hello World\$1** などのメッセージを入力します。

   ```
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press Enter. Type 'exit' or 'quit' to exit this program:
   Hello World!
   ```

   <a name="test-client-device-communications-application-scanner-input-output"></a>出力にアプリケーションがトピックに関する MQTT メッセージを受信したことが示される場合は、クライアントデバイスはコアデバイスと正常に通信できています。

   ```
   Message received on topic clients/MyClientDevice1/hello/world: Hello World!
   ```

   <a name="test-client-device-communications-application-view-core-logs"></a>コアデバイスの Greengrass ログを表示して、クライアントデバイスが正常に接続してメッセージを送信しているかどうかを確認することもできます。詳細については、「[AWS IoT Greengrass ログのモニタリング](monitor-logs.md)」を参照してください。

# Greengrass Discovery RESTful API
<a name="greengrass-discover-api"></a>

AWS IoT Greengrass は、クライアントデバイスが接続できる Greengrass コアデバイスを識別するために使用できる `Discover` API オペレーションを提供します。クライアントデバイスはこのデータプレーン操作を使用して、Greengrass コアデバイスに接続するために必要な情報を取得し、それらと [BatchAssociateClientDeviceWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html) API オペレーションを関連付けます。クライアントデバイスがオンラインになると、 AWS IoT Greengrass クラウドサービスに接続し、検出 API を使用して以下を見つけることができます。
+ 関連付けられている各 Greengrass コアデバイスの IP アドレスとポート。
+ Greengrass コアデバイスを認証するために使用できる、コアデバイスの CA 証明書。

**注記**  
クライアントデバイスは、 の検出クライアントを使用して AWS IoT Device SDK Greengrass コアデバイスの接続情報を検出することもできます。検出クライアントは検出 API を使用します。詳細については次を参照してください:  
[クライアントデバイス通信をテストする](test-client-device-communications.md)
「AWS IoT Greengrass Version 1 デベロッパーガイド」の「[Greengrass Discovery RESTful API](https://docs.aws.amazon.com/greengrass/v1/developerguide/gg-discover-api.html)」。

この API 操作を使用するには、Greengrass データプレーンのエンドポイントの 検出 API に HTTP リクエストを送信します。この API エンドポイントの形式は次のとおりです。

```
https://greengrass-ats.iot.region.amazonaws.com:port/greengrass/discover/thing/thing-name
```

 AWS IoT Greengrass 検出 API でサポートされている AWS リージョン エンドポイントと エンドポイントのリストについては、 の「 [AWS IoT Greengrass V2 エンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/greengrassv2.html)」を参照してください*AWS 全般のリファレンス*。この API 操作は Greengrass データプレーンのエンドポイントでのみ利用できます。コンポーネントおよびデプロイの管理に使用するコントロールプレーンのエンドポイントは、データプレーンのエンドポイントとは異なります。

**注記**  
検出 API は AWS IoT Greengrass V1 と で同じです AWS IoT Greengrass V2。 AWS IoT Greengrass V1 コアに接続するクライアントデバイスがある場合は、クライアントデバイスのコードを変更せずに AWS IoT Greengrass V2 コアデバイスに接続できます。詳細については、「AWS IoT Greengrass Version 1 デベロッパーガイド」の「[Greengrass Discovery RESTful API](https://docs.aws.amazon.com/greengrass/v1/developerguide/gg-discover-api.html)」を参照してください。

**Topics**
+ [検出認証と認可](#greengrass-discover-auth)
+ [リクエスト](#greengrass-discover-request)
+ [応答](#greengrass-discover-response)
+ [cURL でディスカバリ API をテストする](#greengrass-discover-test-request)

## 検出認証と認可
<a name="greengrass-discover-auth"></a>

検出 API を使用して接続情報を取得するには、クライアントデバイスで X.509 クライアント証明書による TLS 相互認証を使用して認証する必要があります。詳細については、「*AWS IoT Core デベロッパーガイド*」の「[X.509 client certificates](https://docs.aws.amazon.com/iot/latest/developerguide/x509-client-certs.html)」を参照してください。

クライアントデバイスには、`greengrass:Discover` アクションを実行する権限がある必要があります。次の AWS IoT ポリシー例では、 という名前の AWS IoT モノを `Discover`自体に対して実行`MyClientDevice1`することを許可します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "greengrass:Discover",
      "Resource": [
        "arn:aws:iot:us-west-2:123456789012:thing/MyClientDevice1"
      ]
    }
  ]
}
```

------

**重要**  
<a name="thing-policy-variable-not-supported"></a>[モノのポリシー変数](https://docs.aws.amazon.com/iot/latest/developerguide/thing-policy-variables.html) (`iot:Connection.Thing.*`) は コアデバイスまたは Greengrass データプレーン操作用の AWS IoT ポリシーではサポートされていません。代わりに、ワイルドカードを使用して名前が似ている複数のデバイスと一致させることができます。たとえば、`MyGreengrassDevice*` と指定すると `MyGreengrassDevice1`、`MyGreengrassDevice2` などと一致します。

詳細については、「AWS IoT Core デベロッパーガイド」の「[AWS IoT Core ポリシー](https://docs.aws.amazon.com/iot/latest/developerguide/iot-policies.html)」を参照してください。

## リクエスト
<a name="greengrass-discover-request"></a>

次の例で示すように、リクエストにはスタンダードな HTTP ヘッダーが含まれ、Greengrass 検出エンドポイントに送信されます。

ポート番号は、コアデバイスがポート 8443 またはポート 443 のどちらで HTTPS トラフィックを送信するように設定されているかによって異なります。詳細については、「[ポート 443 での接続またはネットワークプロキシを通じた接続](configure-greengrass-core-v2.md#configure-alpn-network-proxy)」を参照してください。

**注記**  
この例では、ATS ルート CA 証明書 (推奨) で機能する Amazon Trust Services (ATS) エンドポイントを使用します。エンドポイントはルート CA 証明書タイプと一致する必要があります。

ポート 8443  

```
HTTP GET https://greengrass-ats.iot.region.amazonaws.com:8443/greengrass/discover/thing/thing-name
```

ポート 443  

```
HTTP GET https://greengrass-ats.iot.region.amazonaws.com:443/greengrass/discover/thing/thing-name
```
ポート 443 に接続するクライアントは、[Application Layer Protocol Negotiation (ALPN)](https://tools.ietf.org/html/rfc7301) の TLS 拡張機能を実装するとともに、`x-amzn-http-ca` を `ProtocolName` として `ProtocolNameList` に渡す必要があります。詳細については、「AWS IoT デベロッパーガイド」の「[プロトコル](https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html)」を参照してください。

## 応答
<a name="greengrass-discover-response"></a>

成功すると、レスポンスヘッダーには HTTP 200 ステータスコードが含まれ、レスポンス本文には検出レスポンスドキュメントが含まれます。

**注記**  
は と同じ検出 API AWS IoT Greengrass V2 を使用するため AWS IoT Greengrass V1、レスポンスは Greengrass グループなどの AWS IoT Greengrass V1 概念に従って情報を整理します。レスポンスには、Greengrass グループのリストが含まれています。では AWS IoT Greengrass V2、各コアデバイスは独自のグループにあり、グループにはそのコアデバイスとその接続情報のみが含まれます。

### 検出レスポンスドキュメントの例
<a name="greengrass-discover-response-examples"></a>

次のドキュメントは、1 つの Greengrass コアデバイスに関連付けられているクライアントデバイスに対するレスポンスを示しています。コアデバイスには、1 つのエンドポイントと 1 つの CA 証明書があります。

```
{
  "GGGroups": [
    {
      "GGGroupId": "greengrassV2-coreDevice-core-device-01-thing-name",
      "Cores": [
        {
          "thingArn": "core-device-01-thing-arn",
          "Connectivity": [
            {
              "id": "core-device-01-connection-id",
              "hostAddress": "core-device-01-address",
              "portNumber": core-device-01-port,
              "metadata": "core-device-01-description"
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----"
      ]
    }
  ]
}
```

次のドキュメントは、2 つのコアデバイスに関連付けられているクライアントデバイスに対するレスポンスを示しています。コアデバイスには、複数のエンドポイントと複数のグループ CA 証明書があります。

```
{
  "GGGroups": [
    {
      "GGGroupId": "greengrassV2-coreDevice-core-device-01-thing-name",
      "Cores": [
        {
          "thingArn": "core-device-01-thing-arn",
          "Connectivity": [
            {
              "id": "core-device-01-connection-id",
              "hostAddress": "core-device-01-address",
              "portNumber": core-device-01-port,
              "metadata": "core-device-01-connection-1-description"
            },
            {
              "id": "core-device-01-connection-id-2",
              "hostAddress": "core-device-01-address-2",
              "portNumber": core-device-01-port-2,
              "metadata": "core-device-01-connection-2-description"
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----"
      ]
    },
    {
      "GGGroupId": "greengrassV2-coreDevice-core-device-02-thing-name",
      "Cores": [
        {
          "thingArn":"core-device-02-thing-arn",
          "Connectivity" : [
            {
              "id": "core-device-02-connection-id",
              "hostAddress": "core-device-02-address",
              "portNumber": core-device-02-port,
              "metadata": "core-device-02-connection-1-description"
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----",
        "-----BEGIN CERTIFICATE-----cert-contents-----END CERTIFICATE-----"
      ]
    }
  ]
}
```

## cURL でディスカバリ API をテストする
<a name="greengrass-discover-test-request"></a>

`cURL` をインストールしている場合は、検出 API をテストできます。次の例では、Greengrass ディスカバリ API エンドポイントへのリクエストを認証するクライアントデバイスの証明書を指定しています。

```
curl -i \
  --cert 1a23bc4d56.cert.pem \
  --key 1a23bc4d56.private.key \
  https://greengrass-ats.iot.us-west-2.amazonaws.com:8443/greengrass/discover/thing/MyClientDevice1
```

**注記**  
`-i` 引数で HTTP レスポンスヘッダーを出力するように指定します。このオプションを使用すると、エラーの特定に役立ちます。

リクエストが成功すると、コマンドで下記の例のようなレスポンスが出力されます。

```
{
  "GGGroups": [
    {
      "GGGroupId": "greengrassV2-coreDevice-MyGreengrassCore",
      "Cores": [
        {
          "thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore",
          "Connectivity": [
            {
              "Id": "AUTOIP_192.168.1.4_1",
              "HostAddress": "192.168.1.5",
              "PortNumber": 8883,
              "Metadata": ""
            }
          ]
        }
      ],
      "CAs": [
        "-----BEGIN CERTIFICATE-----\ncert-contents\n-----END CERTIFICATE-----\n"
      ]
    }
  ]
}
```

コマンドでエラーが出力される場合は、「[Greengrass ディスカバリの問題のトラブルシューティング](troubleshooting-client-devices.md#greengrass-discovery-issues)」を参照してください。