

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 코어 디바이스에 클라이언트 디바이스 연결
<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 코어 디바이스에 클라이언트 디바이스 연결](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 코어 소프트웨어를 설치할](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)에서 **코어 디바이스 검색 구성** 페이지를 사용하면 AWS IoT Greengrass 가 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 서비스 역할** 섹션에서 **현재 서비스 역할**을 찾아 Greengrass 서비스 역할이 연결되었는지 참조합니다.

      연결된 Greengrass 서비스 역할이 있으면 IP 감지기 구성 요소를 사용할 이 요구 사항을 충족하는 것입니다. [AWS IoT 사물 정책 구성](#configure-iot-policy-requirement)로 이동하세요.

1. Greengrass 서비스 역할이이 리전의 AWS 계정 에 AWS IoT Greengrass 대해와 연결되지 않은 경우 Greengrass 서비스 역할을 생성하고 연결합니다. 해결 방법:

   1. [IAM 콘솔](https://console.aws.amazon.com/iam)로 이동합니다.

   1. [**Roles**]를 선택합니다.

   1. **역할 생성**을 선택합니다.

   1. **역할 생성** 페이지에서 다음을 수행합니다.

      1. **신뢰할 수 있는 엔터티 유형**에서 **AWS 서비스**를 선택합니다.

      1. **사용 사례**, **기타 AWS 서비스사용 사례**에서 **Greengrass**를 선택하고, **Greengrass**를 선택합니다. 이 옵션은를이 역할을 수임할 수 있는 신뢰할 수 있는 엔 AWS IoT Greengrass 터티로 추가하도록 지정합니다.

      1. **다음**을 선택합니다.

      1. **권한 정책**에서 역할에 연결할 **AWSGreengrassResourceAccessRolePolicy**를 선택합니다.

      1. **다음**을 선택합니다.

      1. **역할 이름**에 역할의 이름(예: **Greengrass\$1ServiceRole**)을 입력합니다.

      1. **역할 생성**을 선택합니다.

   1. <a name="open-iot-console"></a>[AWS IoT 콘솔](https://console.aws.amazon.com/iot)로 이동합니다.

   1. 탐색 창에서 **설정**을 선택합니다.

   1. **Greengrass 서비스 역할** 섹션에서 **역할 연결**을 선택합니다.

   1. **Greengrass 서비스 역할 업데이트** 모달에서, 생성한 IAM 역할을 선택한 다음에 **역할 연결**을 선택합니다.

#### 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. Greengrass 서비스 역할을의 AWS IoT Greengrass 와 연결합니다 AWS 계정. 서비스 역할의 ARN으로 *role-arn*을 바꿉니다.

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

      작업에 성공하면 다음 응답이 반환됩니다.

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

### AWS IoT 사물 정책 구성
<a name="configure-iot-policy-requirement"></a>

코어 디바이스에서는 AWS에 대한 연결 권한 부여에 X.509 디바이스 인증서가 사용됩니다. 디바이스 인증서에 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 코어 소프트웨어 설치 관리자를 사용하여 리소스를 프로비저닝](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) 탐색 메뉴에서 **코어 디바이스**를 선택합니다.

1. <a name="update-iot-policy-console-choose-core-device"></a>업데이트할 코어 디바이스를 **코어 디바이스** 페이지에서 선택합니다.

1. <a name="update-iot-policy-console-choose-core-device-thing"></a>코어 디바이스 세부 정보 페이지에서 코어 디바이스의 **사물**에 대한 링크를 선택합니다. 이 링크를 통해 사물 세부 정보 페이지가 AWS IoT 콘솔에서 열립니다.

1. <a name="update-iot-policy-console-choose-thing-security"></a>사물 세부 정보 페이지에서 **인증서**를 선택합니다.

1. <a name="update-iot-policy-console-choose-thing-certificate"></a>**인증서** 탭에서 사물의 활성 인증서를 선택합니다.

1. <a name="update-iot-policy-console-choose-certificate-policies"></a>인증서 세부 정보 페이지에서 **정책**을 선택합니다.

1. <a name="update-iot-policy-console-choose-policy"></a>**정책** 탭에서 검토하고 업데이트할 AWS IoT 정책을 선택합니다. 코어 디바이스의 활성 인증서에 연결된 원하는 정책에 필수 권한을 추가할 수 있습니다.
**참고**  <a name="quick-installation-iot-policies-note"></a>
[AWS IoT Greengrass 코어 소프트웨어 설치 관리자를 사용하여 리소스를 프로비저닝한](quick-installation.md) 경우 두 가지 AWS IoT 정책이 있습니다. 이름이 **GreengrassV2IoTThingPolicy**인 정책을 선택하는 것이 좋습니다(있는 경우). 빠른 설치 프로그램으로 생성한 코어 디바이스에서는 기본적으로 이 정책 이름이 사용됩니다. 이 정책에 권한을 추가하면 이 정책을 사용하는 다른 코어 디바이스에도 이러한 권한을 부여하는 것입니다.

1. <a name="update-iot-policy-console-edit-policy"></a>정책 개요에서 **활성 버전 편집**을 선택합니다.

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건너뜁니다. 사용하는 리전 및 AWS 계정 숫자로 *리전* 및 *account-id*를 바꿉니다.
   + 이 예제 문에서는 모든 사물의 디바이스 섀도에 대한 액세스가 허용됩니다. 모범 보안 사례를 따르려면 코어 디바이스에 연결하는 클라이언트 디바이스와 코어 디바이스만으로 액세스를 제한할 수 있습니다. 자세한 내용은 [클라이언트 디바이스를 지원하는 최소 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>새 정책 버전을 활성 버전으로 설정하려면 **정책 버전 상태**에서 **편집한 버전을 이 정책의 활성 버전으로 설정**을 선택합니다.

1. <a name="update-iot-policy-console-save-policy"></a>**새 버전으로 저장**을 선택합니다.

#### 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 디바이스 인증서 또는 기타 ID일 수 있습니다. 다음 명령을 실행하고 *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>코어 디바이스의 활성 인증서를 식별합니다. 다음 명령을 실행하고, 활성 인증서를 찾을 때까지 이전 단계의 각 인증서 ID로 *certificateId*를 바꿉니다. 인증서 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 코어 소프트웨어 설치 관리자를 사용하여 리소스를 프로비저닝한](quick-installation.md) 경우 두 가지 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 브로커(Moquette)](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`)

  (선택 사항) 코어 디바이스의 MQTT 브로커 엔드포인트를 AWS IoT Greengrass 클라우드 서비스에 자동으로 보고하도록 IP 감지기 구성 요소를 배포합니다. 네트워크 설정이 복잡한 경우(예: 라우터에서 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 브로커 구성 요소를 하나만 배포하는 것이 좋습니다. [MQTT 브리지](mqtt-bridge-component.md) 및 [IP 탐지기](ip-detector-component.md) 구성 요소는 한 번에 단 하나의 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. **코어 디바이스**를 선택합니다.

1. 관리할 코어 디바이스를 선택합니다.

1. 코어 디바이스의 세부 정보 페이지에서 **클라이언트 디바이스** 탭을 선택합니다.

1. **연결된 클라이언트 디바이스** 섹션에서 코어 디바이스와 연결된 클라이언트 디바이스(AWS IoT 사물)를 확인할 수 있습니다.

**클라이언트 디바이스를 코어 디바이스와 연결하는 방법(콘솔)**

1. <a name="navigate-greengrass-console"></a>[AWS IoT Greengrass 콘솔](https://console.aws.amazon.com/greengrass)로 이동합니다.

1. **코어 디바이스**를 선택합니다.

1. 관리할 코어 디바이스를 선택합니다.

1. 코어 디바이스의 세부 정보 페이지에서 **클라이언트 디바이스** 탭을 선택합니다.

1. **연결된 클라이언트 디바이스** 부분에서, **클라이언트 디바이스 연결**을 선택합니다.

1. **클라이언트 디바이스를 코어 디바이스와 연결** 모달에서, 연결할 각 클라이언트 디바이스에 대해 다음을 수행하십시오.

   1. 클라이언트 디바이스로 연결할 AWS IoT 사물의 이름을 입력합니다.

   1. **추가**를 선택합니다.

1. **연결**을 선택합니다.

   연결한 클라이언트 디바이스는 이제 Greengrass 검색 API를 사용하여 이 코어 디바이스를 검색할 수 있습니다.

**코어 디바이스로부터 클라이언트 디바이스 연결을 해제하는 방법(콘솔)**

1. <a name="navigate-greengrass-console"></a>[AWS IoT Greengrass 콘솔](https://console.aws.amazon.com/greengrass)로 이동합니다.

1. **코어 디바이스**를 선택합니다.

1. 관리할 코어 디바이스를 선택합니다.

1. 코어 디바이스의 세부 정보 페이지에서 **클라이언트 디바이스** 탭을 선택합니다.

1. 연결을 해제할 각 클라이언트 디바이스를 **연결된 클라이언트 디바이스** 섹션에서 선택합니다.

1. **연결 해제**를 선택합니다.

1. 확인 모달에서 **연결 해제**를 선택합니다.

   연결 해제한 클라이언트 디바이스에서 더는 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 코어 디바이스가 클라우드에 연결되지 않은 경우에도 클라이언트 디바이스가 코어 디바이스에 연결할 수 있도록 코어 디바이스를 구성할 수 있습니다. 오프라인 인증을 사용하는 경우 Greengrass 디바이스가 부분적으로 오프라인 환경에서 계속 작동할 수 있습니다.

클라우드에 연결된 클라이언트 디바이스에 대해 오프라인 인증을 사용하려면 다음이 필요합니다.
+ [클라이언트 디바이스 인증](client-device-auth-component.md) 구성 요소가 배포된 AWS IoT Greengrass 코어 디바이스입니다. 오프라인 인증에는 버전 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분을 설정하면 오프라인 인증이 실질적으로 해제됩니다. 이 제한 시간을 설정할 때는 보안 요구 사항을 고려하는 것이 좋습니다. 또한 클라우드와 연결이 끊긴 상태에서 코어 디바이스를 실행해야 하는 기간도 고려해야 합니다.

코어 디바이스는 자격 증명 스토리지를 세 번 업데이트합니다.

1. 디바이스가 코어 디바이스에 처음으로 연결할 때

1. 코어 디바이스가 클라우드에 연결된 경우 클라이언트 디바이스가 코어 디바이스에 다시 연결할 때

1. 코어 디바이스가 클라우드에 연결된 경우 하루에 한 번 전체 자격 증명 저장소를 새로 고칠 때

Greengrass 코어 디바이스가 보안 인증 저장소를 새로 고칠 때에는 [ ListClientDevicesAssociatedWithCoreDevice](https://docs.aws.amazon.com//greengrass/v2/APIReference/API_ListClientDevicesAssociatedWithCoreDevice.html) 작업을 사용합니다. Greengrass는 이 작업에서 반환되는 디바이스만 새로 고칩니다. 클라이언트 디바이스를 코어 디바이스와 연결하려면 [클라이언트 디바이스 연결](associate-client-devices.md) 섹션을 참조하세요.

`ListClientDevicesAssociatedWithCoreDevice` 작업을 사용하려면 실행되는와 AWS 계정 연결된 AWS Identity and Access Management (IAM) 역할에 작업에 대한 권한을 추가해야 합니다 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 감지기 구성 요소를 배포할 수 있습니다.
+ 콘솔의 **검색 구성** 페이지를 사용합니다. 자세한 내용은 [클라우드 검색 구성(콘솔)](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) 탐색 메뉴에서 **구성 요소**를 선택합니다.

1. **구성 요소** 페이지의 **퍼블릭 구성 요소** 탭을 선택한 다음 **aws.greengrass.clientdevices.IPDetector**를 선택합니다.

1. **aws.greengrass.clientdevices.IPDetector** 페이지에서 **배포**를 선택합니다.

1. <a name="deploy-component-choose-deployment-step"></a>**배포에 추가**에서 수정할 기존 배포를 선택하거나 새 배포 생성을 선택하고 **다음**을 선택합니다.

1. <a name="deploy-component-choose-target-step"></a>새 배포 생성을 선택한 경우 배포의 대상 코어 디바이스 또는 사물 그룹을 선택합니다. **대상 지정** 페이지의 **배포 대상**에서 코어 디바이스 또는 사물 그룹을 선택하고 **다음**을 선택합니다.

1. **구성 요소 선택** 페이지에서 **aws.greengrass.clientdevices.IPDetector** 구성 요소가 선택되었는지 확인하고 **다음**을 선택합니다.

1. **구성 요소 구성** 페이지에서 **aws.greengrass.clientdevices.IPDetector**를 선택하고 다음을 수행합니다.

   1. **구성 요소 구성**을 선택합니다.

   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 루프백 주소를 감지하고 보고할 수 있습니다. 이들은 디바이스가 자체적으로 통신할 수 있는 IP 주소(예: `localhost`)입니다. 코어 디바이스와 클라이언트 디바이스가 동일한 시스템에서 실행되는 테스트 환경에서 이 옵션을 사용합니다.
      + `includeIPv4LinkLocalAddrs` – <a name="ip-detector-component-configuration-include-ipv4-link-local-addrs-definition"></a>(선택 사항) 이 옵션을 활성화하여 IPv4 [링크-로컬 주소](https://en.wikipedia.org/wiki/Link-local_address)를 감지하고 보고할 수 있습니다. 코어 디바이스의 네트워크에 DHCP(Dynamic Host Configuration Protocol) 또는 정적 할당 IP 주소가 없는 경우 이 옵션을 사용합니다.
      + `includeIPv6LoopbackAddrs` – <a name="ip-detector-component-configuration-include-ipv6-loopback-addrs-definition"></a>(선택 사항) 이 옵션을 활성화하여 IPv6 루프백 주소를 감지하고 보고할 수 있습니다. 이들은 디바이스가 자체적으로 통신할 수 있는 IP 주소(예: `localhost`)입니다. 코어 디바이스와 클라이언트 디바이스가 동일한 시스템에서 실행되는 테스트 환경에서 이 옵션을 사용합니다. 이 옵션을 사용하려면 `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)를 감지하고 보고할 수 있습니다. 코어 디바이스의 네트워크에 DHCP(Dynamic Host Configuration Protocol) 또는 정적 할당 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. **확인**을 선택하여 모달을 닫고 **다음**을 선택합니다.

1. <a name="deploy-component-configure-advanced-settings-step"></a>**고급 설정 구성** 페이지에서 기본 구성 설정을 유지하고 **다음**을 선택합니다.

1. <a name="deploy-component-review-and-deploy-step"></a>**검토** 페이지에서 **배포**를 선택합니다.

   배포를 완료하는 데 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 루프백 주소를 감지하고 보고할 수 있습니다. 이들은 디바이스가 자체적으로 통신할 수 있는 IP 주소(예: `localhost`)입니다. 코어 디바이스와 클라이언트 디바이스가 동일한 시스템에서 실행되는 테스트 환경에서 이 옵션을 사용합니다.
+ `includeIPv4LinkLocalAddrs` – <a name="ip-detector-component-configuration-include-ipv4-link-local-addrs-definition"></a>(선택 사항) 이 옵션을 활성화하여 IPv4 [링크-로컬 주소](https://en.wikipedia.org/wiki/Link-local_address)를 감지하고 보고할 수 있습니다. 코어 디바이스의 네트워크에 DHCP(Dynamic Host Configuration Protocol) 또는 정적 할당 IP 주소가 없는 경우 이 옵션을 사용합니다.
+ `includeIPv6LoopbackAddrs` – <a name="ip-detector-component-configuration-include-ipv6-loopback-addrs-definition"></a>(선택 사항) 이 옵션을 활성화하여 IPv6 루프백 주소를 감지하고 보고할 수 있습니다. 이들은 디바이스가 자체적으로 통신할 수 있는 IP 주소(예: `localhost`)입니다. 코어 디바이스와 클라이언트 디바이스가 동일한 시스템에서 실행되는 테스트 환경에서 이 옵션을 사용합니다. 이 옵션을 사용하려면 `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)를 감지하고 보고할 수 있습니다. 코어 디바이스의 네트워크에 DHCP(Dynamic Host Configuration Protocol) 또는 정적 할당 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 브로커 엔드포인트에 대한 정보는 다음과 같습니다.

**엔드포인트**(`HostAddress`)  
클라이언트 디바이스가 코어 디바이스의 MQTT 브로커에 연결할 수 있는 IP 주소 또는 DNS 주소입니다.

**포트** (`PortNumber`)  
코어 디바이스에서 MQTT 브로커가 작동하는 포트입니다.  
기본적으로 포트 8883을 사용하는 [Moquette MQTT 브로커 구성 요소](mqtt-broker-moquette-component.md)에서 이 포트를 구성할 수 있습니다.

**메타데이터**(`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. **코어 디바이스**를 선택합니다.

1. 관리할 코어 디바이스를 선택합니다.

1. 코어 디바이스의 세부 정보 페이지에서 **클라이언트 디바이스** 탭을 선택합니다.

1. **MQTT 브로커 엔드포인트** 섹션에서 코어 디바이스의 MQTT 브로커 엔드포인트를 볼 수 있습니다. **엔드포인트 관리**를 선택합니다.

1. **엔드포인트 관리** 모달에서 코어 디바이스의 MQTT 브로커 엔드포인트를 추가하거나 제거합니다.

1. **업데이트**를 선택합니다.

### 엔드포인트 관리(AWS CLI)
<a name="manually-manage-endpoints-cli"></a>

 AWS Command Line Interface (AWS CLI)를 사용하여 코어 디바이스의 엔드포인트를 관리할 수 있습니다.

**참고**  
의 클라이언트 디바이스 지원 AWS IoT Greengrass V2 은 이전 버전과 호환되므로 AWS IoT Greengrass V2 또는 AWS IoT Greengrass V1 API 작업을 사용하여 코어 디바이스 엔드포인트를 관리할 AWS IoT Greengrass V1수 있습니다.

**코어 디바이스의 엔드포인트를 가져오려면(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 V2 또는 AWS IoT Greengrass V1 API 작업을 사용하여 코어 디바이스 엔드포인트를 관리할 AWS IoT Greengrass V1수 있습니다.

**코어 디바이스의 엔드포인트를 가져오려면(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 브로커 구성 요소를 하나만 배포하는 것이 좋습니다. [MQTT 브리지](mqtt-bridge-component.md) 및 [IP 탐지기](ip-detector-component.md) 구성 요소는 한 번에 단 하나의 MQTT 브로커 구성 요소와 연동합니다. 여러 MQTT 브로커 구성 요소를 배포하는 경우 다른 포트가 사용되도록 구성해야 합니다.

다음과 같은 MQTT 브로커 중에서 선택할 수 있습니다.
+ **[MQTT 3.1.1 broker(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 특성을 사용하려면 이 옵션을 선택합니다. 이 구성 요소에서는 Moquette MQTT 3.1.1 브로커보다 많은 리소스가 사용되며, Linux 코어 디바이스에서는 Docker가 필요합니다.

  MQTT 5는 MQTT 3.1.1과 역호환되므로 MQTT 3.1.1이 사용되는 클라이언트 디바이스를 이 브로커에 연결할 수 있습니다. Moquette 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 코어 디바이스에 클라이언트 디바이스 연결
<a name="connecting-to-mqtt"></a>

 AWS IoT Greengrass 코어 디바이스에서 MQTT 브로커를 사용하는 경우 디바이스는 디바이스에 고유한 *코어 디바이스 인증 기관(CA)*을 사용하여 클라이언트와 상호 TLS 연결을 만들기 위해 브로커에 인증서를 발급합니다.

AWS IoT Greengrass 는 코어 디바이스 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 코어 디바이스 CA가 있어야 합니다. 클라우드 검색을 통하거나 CA를 수동으로 제공하여 이 CA를 가져올 수 있습니다. 자세한 내용은 [자체 인증 기관 사용](#use-your-own-CA) 단원을 참조하십시오.
+ 코어 디바이스 CA에서 발급된 브로커 인증서에 코어 디바이스의 정규화된 도메인 이름(FQDN) 또는 IP 주소가 있어야 합니다. [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 코어 디바이스에서는 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 코어 디바이스에 연결하려면 다음을 수행합니다.

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 브로커 엔드포인트와 각 코어 디바이스의 ID를 확인하는 데 사용할 인증서를 포함합니다. 그런 다음 클라이언트 디바이스는 코어 디바이스에 성공적으로 연결될 때까지 각 엔드포인트를 시도할 수 있습니다.

클라이언트 디바이스는 연결한 코어 디바이스만 검색할 수 있습니다. 클라이언트 디바이스와 코어 디바이스 간의 통신을 테스트하기 전에 클라이언트 디바이스를 코어 디바이스에 연결해야 합니다. 자세한 내용은 [클라이언트 디바이스 연결](associate-client-devices.md) 단원을 참조하십시오.

Greengrass 검색 API는 사용자가 지정한 코어 디바이스 MQTT 브로커 엔드포인트를 반환합니다. [IP 감지기 구성 요소](ip-detector-component.md)를 사용하여 이러한 엔드포인트를 관리할 수도 있고 각 코어 디바이스에 대해 수동으로 관리할 수도 있습니다. 자세한 내용은 [코어 디바이스 엔드포인트 관리](manage-core-device-endpoints.md) 단원을 참조하십시오.

**참고**  
Greengrass 검색 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>

이 섹션에서는 [Python용AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-python-v2)의 Greengrass 검색 샘플을 사용하여 클라이언트 디바이스와 코어 디바이스 간의 통신을 테스트합니다.

**중요**  
 AWS IoT Device SDK v2 for Python을 사용하려면 디바이스가 Python 3.6 이상을 실행해야 합니다.

**통신을 테스트하려면(Python용AWS IoT Device SDK v2)**

1. <a name="download-iot-device-sdk-python-v2"></a>클라이언트 디바이스로 연결할 AWS IoT 사물에 [AWS IoT Device SDK Python용 v2](https://github.com/aws/aws-iot-device-sdk-python-v2)를 다운로드하여 설치합니다.

   클라이언트 디바이스에서 다음을 수행합니다.

   1.  AWS IoT Device SDK v2 for Python 리포지토리를 복제하여 다운로드합니다.

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

   1. Python용 AWS IoT Device SDK v2를 설치합니다.

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

1. <a name="cd-iot-device-sdk-python-v2"></a> AWS IoT Device SDK v2 for 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>C\$1\$1용 AWS IoT Device SDK v2를 빌드하려면 디바이스에 다음 도구가 있어야 합니다.<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 이상

**통신을 테스트하려면(C\$1\$1용AWS IoT Device SDK v2)**

1. 클라이언트 디바이스로 연결할 AWS IoT 사물에 [AWS IoT Device SDK C\$1\$1용 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)를 다운로드하고 빌드합니다.

   클라이언트 디바이스에서 다음을 수행합니다.

   1. C\$1\$1 워크스페이스용 AWS IoT Device SDK v2에 대한 폴더를 생성하고 변경합니다.

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

   1.  AWS IoT Device SDK v2 for C\$1\$1 리포지토리를 복제하여 다운로드합니다. `--recursive` 플래그는 하위 모듈을 다운로드하도록 지정합니다.

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

   1. C\$1\$1용 AWS IoT Device SDK v2 빌드 출력에 대한 폴더를 생성하고 변경합니다.

      ```
      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. C\$1\$1용 AWS IoT Device SDK v2에서 Greengrass 검색 샘플 애플리케이션을 빌드합니다. 해결 방법:

   1. 를 C\$1\$1용 AWS IoT Device SDK v2의 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>

이 섹션에서는 [JavaScript용AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-js-v2)의 Greengrass 검색 샘플을 사용하여 클라이언트 디바이스와 코어 디바이스 간의 통신을 테스트합니다.

**중요**  
JavaScript용 AWS IoT Device SDK v2를 사용하려면 디바이스에서 노드 v10.0 이상을 실행해야 합니다.

**통신을 테스트하려면(JavaScript용AWS IoT Device SDK v2)**

1. [AWS IoT Device SDK v2 for JavaScript](https://github.com/aws/aws-iot-device-sdk-js-v2)를 다운로드하여 클라이언트 디바이스로 연결할 AWS IoT 사물에 설치합니다.

   클라이언트 디바이스에서 다음을 수행합니다.

   1.  AWS IoT Device SDK v2 for JavaScript 리포지토리를 복제하여 다운로드합니다.

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

   1. JavaScript용 AWS IoT Device SDK v2를 설치합니다.

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

1.  AWS IoT Device SDK v2 for JavaScript에서 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>

이 섹션에서는 [Java용AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-java-v2)의 Greengrass 검색 샘플을 사용하여 클라이언트 디바이스와 코어 디바이스 간의 통신을 테스트합니다.

**중요**  
Java용 AWS IoT Device SDK v2를 빌드하려면 디바이스에 다음 도구가 있어야 합니다.  
Java 8 이상(Java 폴더를 가리키는 `JAVA_HOME` 포함)
Apache Maven

**통신을 테스트하려면(Java용AWS IoT Device SDK v2)**

1. [AWS IoT Device SDK Java용 v2](https://github.com/aws/aws-iot-device-sdk-java-v2)를 다운로드하여 클라이언트 디바이스로 연결할 AWS IoT 사물에 빌드합니다.

   클라이언트 디바이스에서 다음을 수행합니다.

   1.  AWS IoT Device SDK v2 for Java 리포지토리를 복제하여 다운로드합니다.

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

   1. 를 Java용 AWS IoT Device SDK v2 폴더로 변경합니다.

   1. Java용 AWS IoT Device SDK v2를 빌드합니다.

      ```
      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 작업을 제공합니다. 클라이언트 디바이스는 이 데이터 플레인 작업을 사용하여 [BatchAssociateClientDeviceWithCoreDevice](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_BatchAssociateClientDeviceWithCoreDevice.html) API 작업과 관련된 Greengrass 코어 디바이스에 연결하는 데 필요한 정보를 검색합니다. 클라이언트 디바이스가 온라인 상태가 되면 AWS IoT Greengrass 클라우드 서비스에 연결하고 검색 API를 사용하여 다음을 찾을 수 있습니다.
+ 연결된 각 Greengrass 코어 디바이스의 IP 주소 및 포트.
+ 클라이언트 디바이스가 Greengrass 코어 디바이스 인증에 사용할 수 있는 클라이언트 디바이스 CA 인증서.

**참고**  
클라이언트 디바이스는의 검색 클라이언트를 사용하여 Greengrass 코어 디바이스의 연결 정보를 AWS IoT Device SDK 검색할 수도 있습니다. Discovery 클라이언트는 Discovery 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 데이터 플레인 엔드포인트의 Discovery 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**
+ [Discovery 인증 및 권한 부여](#greengrass-discover-auth)
+ [요청](#greengrass-discover-request)
+ [응답](#greengrass-discover-response)
+ [cURL을 사용하여 Discovery API 테스트](#greengrass-discover-test-request)

## Discovery 인증 및 권한 부여
<a name="greengrass-discover-auth"></a>

Discovery API를 사용하여 연결 정보를 검색하려면 클라이언트 디바이스가 X.509 클라이언트 인증서와 함께 TLS 상호 인증을 사용하여 인증해야 합니다. 자세한 내용은 *AWS IoT Core 개발자 안내서*의 [X.509 클라이언트 인증서](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>코어 디바이스 또는 Greengrass 데이터 플레인 작업의 AWS IoT 정책에 대해 [사물 정책 변수](https://docs.aws.amazon.com/iot/latest/developerguide/thing-policy-variables.html)(`iot:Connection.Thing.*`)가 지원되지 않습니다. 그 대신에 이름이 비슷한 여러 디바이스와 일치하는 와일드카드를 사용할 수 있습니다. 예를 들어 `MyGreengrassDevice1`, `MyGreengrassDevice2` 등과 일치하도록 `MyGreengrassDevice*`를 지정할 수 있습니다.

자세한 내용은 *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 Discovery 엔드포인트로 전송됩니다.

포트 번호는 코어 디바이스가 포트 8443 또는 포트 443을 통해 HTTPS 트래픽을 보내도록 구성되었는지 여부에 따라 다릅니다. 자세한 내용은 [포트 443에서 또는 네트워크 프록시를 통해 연결](configure-greengrass-core-v2.md#configure-alpn-network-proxy) 단원을 참조하십시오.

**참고**  
이 예제에서는 권장되는 ATS 루트 CA 인증서에 사용되는 ATS(Amazon Trust Services) 엔드포인트를 사용합니다. 엔드포인트는 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에서 연결하는 클라이언트는 [ALPN(Application Layer Protocol Negotiation)](https://tools.ietf.org/html/rfc7301) TLS 확장을 구현하고 `ProtocolNameList`에 `x-amzn-http-ca`를 `ProtocolName`으로 전달해야 합니다. 자세한 정보는 *AWS IoT 개발자 안내서*의 [프로토콜](https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html)을 참조하세요.

## 응답
<a name="greengrass-discover-response"></a>

성공 시 응답 헤더에는 HTTP 200 상태 코드가 포함되고 응답 본문에는 검색 응답 문서가 포함됩니다.

**참고**  
 AWS IoT Greengrass V2 는와 동일한 검색 API를 사용하므로 응답 AWS IoT Greengrass V1은 Greengrass 그룹과 같은 AWS IoT Greengrass V1 개념에 따라 정보를 구성합니다. 응답에는 Greengrass 그룹 목록이 포함됩니다. 에서 AWS IoT Greengrass V2각 코어 디바이스는 자체 그룹에 있으며, 그룹에는 해당 코어 디바이스와 연결 정보만 포함됩니다.

### 검색 응답 문서 예제
<a name="greengrass-discover-response-examples"></a>

다음 문서는 하나의 Greengrass 코어 디바이스에 연결된 클라이언트 디바이스에 대한 응답을 보여줍니다. 코어 디바이스에는 하나의 엔드포인트 하나의 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-----"
      ]
    }
  ]
}
```

다음 문서는 두 개의 코어 디바이스에 연결된 클라이언트 디바이스에 대한 응답을 보여줍니다. 코어 디바이스에는 여러 엔드포인트와 여러 그룹 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을 사용하여 Discovery API 테스트
<a name="greengrass-discover-test-request"></a>

`cURL`을 설치한 경우 Discovery API를 테스트할 수 있습니다. 다음 예제에서는 Greengrass Discovery 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 Discovery 문제 해결](troubleshooting-client-devices.md#greengrass-discovery-issues)을 참조하세요.