

지원 종료 공지: 2026년 10월 7일에는에 대한 지원을 중단할 AWS 예정입니다 AWS IoT Greengrass Version 1. 2026년 10월 7일 이후에는 더 이상 AWS IoT Greengrass V1 리소스에 액세스할 수 없습니다. 자세한 내용은 [에서 마이그레이션 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)을 참조하세요.

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

# 모듈 5: 장치 섀도우와 상호 작용
<a name="module5"></a>

이 고급 모듈은 클라이언트 디바이스가 AWS IoT Greengrass 그룹의 [AWS IoT 디바이스 섀도](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)우와 상호 작용하는 방법을 보여줍니다. *섀도우*는 사물의 현재 상태 정보 또는 원하는 상태 정보를 저장하는 데 사용되는 JSON 문서입니다. 이 모듈에서는 하나의 클라이언트 장치(`GG_Switch`)가 다른 클라이언트 장치(`GG_TrafficLight`)의 상태를 수정하는 방법과 이러한 상태를 AWS IoT Greengrass 클라우드와 동기화하는 방법을 살펴봅니다.

![\[AWS IoT Greengrass 코어는 신호등 디바이스 섀도우와 조명 스위치 디바이스에 연결됩니다.\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/gg-get-started-077.5.png)


시작하기 전에 [Greengrass 장치 설정](quick-start.md) 스크립트를 실행하거나 [모듈 1](module1.md) 및 [모듈 2](module2.md)를 완료했는지 확인합니다. 또한 클라이언트 디바이스를 AWS IoT Greengrass 코어에 연결하는 방법도 이해해야 합니다([모듈 4](module4.md)). 다른 구성 요소나 장치는 필요하지 않습니다.

이 모듈을 완료하는 데 약 30분 정도 걸립니다.

**Topics**
+ [장치 및 구독 구성](config-dev-subs.md)
+ [필수 파일 다운로드](file-download.md)
+ [통신 테스트(장치 동기화 비활성화됨)](comms-disabled.md)
+ [통신 테스트(장치 동기화 활성화됨)](comms-enabled.md)

# 장치 및 구독 구성
<a name="config-dev-subs"></a>

 AWS IoT Greengrass 코어가 인터넷에 연결된 AWS IoT 경우 섀도우를에 동기화할 수 있습니다. 이 모듈에서는 우선 클라우드와 동기화하지 않고 로컬 섀도우를 사용합니다. 그런 다음, 클라우드 동기화를 활성화합니다.

각 클라이언트 장치에는 고유한 섀도우가 있습니다. 자세한 내용은 *AWS IoT 개발자 안내서*의 [AWS IoT용 장치 섀도우 서비스](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)를 참조하십시오.

1. 그룹 구성 페이지에서 **클라이언트 장치** 탭을 선택합니다.

1. **클라이언트 디바이스** 탭에서 AWS IoT Greengrass 그룹에 두 개의 새 클라이언트 디바이스를 추가합니다. 이 프로세스에 대한 자세한 단계는 [AWS IoT Greengrass 그룹에 클라이언트 디바이스 생성](device-group.md)을 참조하십시오.
   + **GG\$1Switch** 및 **GG\$1TrafficLight** 클라리언트 장치의 이름을 지정합니다.
   + 두 클라이언트 장치의 원클릭 기본 보안 리소스를 생성하고 다운로드합니다.
   + 클라이언트 장치의 보안 리소스 파일 이름에 해시 구성 요소를 적어 둡니다. 나중에 이 값을 사용합니다.

1. 컴퓨터에 이러한 클라이언트 장치의 보안 인증 정보를 저장할 폴더를 만드세요. 인증서와 키를 이 폴더에 복사합니다.

1. 클라이언트 장치가 로컬 섀도우를 사용하도록 설정되어 있는지 AWS 클라우드확인합니다. 그렇지 않은 경우 클라이언트 장치를 선택하고 **섀도우 동기화**를 선택한 다음 **클라우드와의 섀도우 동기화 비활성화**를 선택합니다.

1. <a name="module5-subscriptions"></a>다음 표의 구독을 그룹에 추가합니다. 예를 들어 첫 번째 구독을 생성하려면

   1. 그룹 구성 페이지에서 **구독** 탭을 선택한 다음 **추가**를 선택합니다.

   1. **소스 유형**에서 **클라이언트 장치**를 선택한 다음 **GG\$1Switch**를 선택합니다.

   1. **대상 유형**에서 **서비스**를 선택한 다음 **Local Shadow Service**를 선택합니다.

   1. **주제 필터**에 **\$1aws/things/GG\$1TrafficLight/shadow/update**를 입력합니다.

   1. **구독 생성**을 선택합니다.

   주제는 테이블에 표시된 것처럼 정확히 입력되어야 합니다. 와일드카드를 사용하여 일부 구독을 통합할 수 있지만 권장하지는 않습니다. 자세한 내용은 *AWS IoT 개발자 안내서*의 [Shadow MQTT 주제](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-mqtt.html)를 참조하십시오.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/config-dev-subs.html)

   **구독** 탭에 새 구독이 표시됩니다.
**참고**  
`$` 문자에 대한 정보는 [예약된 주제](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html#reserved-topics)를 참조하십시오.

1. <a name="enable-automatic-detection"></a>Greengrass 코어가 IP 주소 목록을 게시할 수 있도록 자동 감지가 활성화되어 있는지 확인합니다. 클라이언트 장치는 이 정보를 사용하여 코어를 검색합니다. 다음을 수행합니다.

   1. 그룹 구성 페이지에서 **Lambda 함수** 탭을 선택합니다.

   1. **시스템 Lambda 함수**에서 **IP 감지기**를 선택한 다음 **편집**을 선택합니다.

   1. **IP 감지기 설정 편집**에서 **MQTT 브로커 엔드포인트 자동 감지 및 재정의**를 선택한 다음 **저장**을 선택합니다.

1. [코어 장치로 클라우드 구성 배포](configs-core.md) 섹션에 설명된 대로 Greengrass 대몬(daemon)이 실행 중인지 확인합니다.

1. <a name="console-actions-deploy"></a>그룹 구성 페이지에서 **배포**를 선택합니다.

# 필수 파일 다운로드
<a name="file-download"></a>

1. 아직 설치하지 않았다면 Python AWS IoT Device SDK 용를 설치합니다. 지침은 [Python AWS IoT Device SDK 용 설치](IoT-SDK.md)의 1단계를 참조하십시오.

   이 SDK는 클라이언트 디바이스에서 코어 디바이스와 AWS IoT 통신하는 AWS IoT Greengrass 데 사용됩니다.

1. GitHub의 [TrafficLight](https://github.com/aws/aws-greengrass-core-sdk-python/tree/master/examples/TrafficLight) 예제 폴더에서 `lightController.py` 및 `trafficLight.py` 파일을 컴퓨터로 다운로드합니다. 파일을 GG\$1Switch 및 GG\$1TrafficLight 클라이언트 장치 인증서 및 키를 포함하는 폴더에 저장합니다.

   `lightController.py` 스크립트는 GG\$1Switch 장치에 해당하고, `trafficLight.py` 스크립트는 GG\$1TrafficLight 장치에 해당합니다.  
![\[2개의 Python 스크립트와 장치 인증서 및 키가 포함된 파일 스크린샷\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/gg-get-started-082.png)
**참고**  
예제 Python 파일은 편의를 위해 AWS IoT Greengrass Core SDK for Python 리포지토리에 저장되지만 AWS IoT Greengrass Core SDK는 사용하지 않습니다.

# 통신 테스트(장치 동기화 비활성화됨)
<a name="comms-disabled"></a>

1. <a name="ping-device"></a>컴퓨터와 AWS IoT Greengrass 코어 디바이스가 동일한 네트워크를 사용하여 인터넷에 연결되어 있는지 확인합니다.

   1.  AWS IoT Greengrass 코어 디바이스에서 다음 명령을 실행하여 IP 주소를 찾습니다.

      ```
      hostname -I
      ```

   1. 컴퓨터에서 코어의 IP 주소를 사용하여 다음 명령을 실행합니다. Ctrl \$1 C를 사용하여 **ping** 명령을 중지할 수 있습니다.

      ```
      ping IP-address
      ```

      다음과 유사한 출력은 컴퓨터와 AWS IoT Greengrass 코어 디바이스 간의 통신 성공(0% 패킷 손실)을 나타냅니다.  
![\[성공적인 ping 명령 출력\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/gg-get-started-075.5.png)
**참고**  
실행 중인 EC2 인스턴스를 ping할 수 없는 경우 인스턴스의 인바운드 보안 그룹 규칙이 [Echo 요청](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-ping) 메시지에 대한 ICMP 트래픽을 허용하는지 AWS IoT Greengrass확인합니다. 자세한 내용은 *Amazon EC2 사용 설명서*의 [보안 그룹에 규칙 추가](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#adding-security-group-rule)를 참조하세요.  
Windows 호스트 컴퓨터에 어드밴스 보안 앱을 갖춘 Windows 방화벽에서 인바운드 에코 요청(예: **File and Printer Sharing(파일 및 프린터 공유)(에코 요청 - ICMPv4-In)**)을 허용하는 인바운드 규칙을 활성화하거나 생성해야 할 수도 있습니다.

1.  AWS IoT 엔드포인트를 가져옵니다.

   1. <a name="iot-settings"></a>[AWS IoT 콘솔](https://console.aws.amazon.com/iot/)의 탐색 창에서 **설정**을 선택합니다.

   1. <a name="iot-settings-endpoint"></a>**장치 데이터 엔드포인트**에서 **엔드포인트**의 값을 기록해 둡니다. 이 값을 사용하여 다음 단계의 명령에서 *AWS\$1IOT\$1ENDPOINT* 자리 표시자를 바꿉니다.
**참고**  
[엔드포인트는 해당 인증서 유형](gg-core.md#certificate-endpoints)과 일치해야 합니다.

1. <a name="repeated-step"></a>컴퓨터( AWS IoT Greengrass 코어 디바이스 아님)에서 두 개의 [명령줄](https://en.wikipedia.org/wiki/Command-line_interface)(터미널 또는 명령 프롬프트) 창을 엽니다. 창 하나는 GG\$1Switch 클라이언트 장치를 나타내고 다른 창 하나는 GG\$1TrafficLight 클라이언트 장치를 나타냅니다.

   1. <a name="run-switch-device"></a>GG\$1Switch 클라이언트 장치 창에서 다음 명령을 실행합니다.
      + *path-to-certs-folder*를 인증서, 키 및 Python 파일을 포함하는 폴더의 경로로 바꿉니다.
      + *AWS\$1IOT\$1ENDPOINT*를 엔드포인트로 바꿉니다.
      + *switchCertId* 인스턴스 2개를 GG\$1Switch 클라이언트 장치의 파일 이름의 해시로 바꿉니다.

      ```
      cd path-to-certs-folder
      python lightController.py --endpoint AWS_IOT_ENDPOINT --rootCA AmazonRootCA1.pem --cert switchCertId-certificate.pem.crt --key switchCertId-private.pem.key --thingName GG_TrafficLight --clientId GG_Switch
      ```

   1. <a name="run-trafficlight-device"></a>GG\$1TrafficLight 클라이언트 장치 창에서 다음 명령을 실행합니다.
      + *path-to-certs-folder*를 인증서, 키 및 Python 파일을 포함하는 폴더의 경로로 바꿉니다.
      + *AWS\$1IOT\$1ENDPOINT*를 엔드포인트로 바꿉니다.
      + *lightCertId* 인스턴스 2개를 GG\$1TrafficLight 클라이언트 장치의 파일 이름의 해시로 바꿉니다.

      ```
      cd path-to-certs-folder
      python trafficLight.py --endpoint AWS_IOT_ENDPOINT --rootCA AmazonRootCA1.pem --cert lightCertId-certificate.pem.crt --key lightCertId-private.pem.key --thingName GG_TrafficLight --clientId GG_TrafficLight
      ```

      스위치는 20초마다 섀도우 상태를 G, Y 및 R로 업데이트하고, 전등은 다음에 나온 것처럼 새로운 상태를 표시합니다.

      GG\$1Switch 출력:  
![\[GG_Switch 관련 출력 스크린샷\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/gg-get-started-083.png)

      GG\$1TrafficLight 출력:  
![\[GG_TrafficLight 관련 출력 스크린샷\]](http://docs.aws.amazon.com/ko_kr/greengrass/v1/developerguide/images/gg-get-started-084.png)

   처음으로 실행되면 각 클라이언트 디바이스 스크립트는 AWS IoT Greengrass 검색 서비스를 실행하여 AWS IoT Greengrass 코어에 연결합니다(인터넷을 통해). 클라이언트 디바이스가 AWS IoT Greengrass 코어를 검색하고 성공적으로 연결되면 향후 작업을 로컬에서 실행할 수 있습니다.
**참고**  
<a name="check-connection-info"></a> `lightController.py` 및 `trafficLight.py` 스크립트는 스크립트와 동일한 폴더에 생성되는 `groupCA` 폴더에 연결 정보를 저장합니다. 연결 오류를 수신하는 경우 `ggc-host` 파일의 IP 주소가 이 단계에서 코어에 대해 구성한 단일 IP 주소 엔드포인트와 일치하는지 확인합니다.

1.  AWS IoT 콘솔에서 AWS IoT Greengrass 그룹을 선택하고 **클라이언트 디바이스** 탭을 선택한 다음 **GG\$1TrafficLight**를 선택하여 클라이언트 디바이스의 AWS IoT 사물 세부 정보 페이지를 엽니다.

1. **장치 섀도우** 탭을 선택합니다. GG\$1Switch의 상태가 변경된 후에는 이 섀도우에 대한 업데이트가 있으면 안 됩니다. GG\$1TrafficLight가 **클라우드와의 섀도우 동기화 비활성화**로 설정되어 있기 때문입니다.

1. GG\$1Switch(`lightController.py`) 클라이언트 장치 창에서 Ctrl \$1 C를 누릅니다. GG\$1TrafficLight(`trafficLight.py`) 창이 상태 변경 메시지 수신을 중지하는 것이 보여야 합니다.

   다음 단원에서 명령을 실행할 수 있도록 이러한 창을 그대로 열어 둡니다.

# 통신 테스트(장치 동기화 활성화됨)
<a name="comms-enabled"></a>

이 테스트의 경우 GG\$1TrafficLight 장치 섀도우가 AWS IoT와 동기화되도록 구성합니다. 이전 테스트의 경우와 동일한 명령을 실행하지만 이번에는 GG\$1Switch가 업데이트 요청을 보낼 때 클라우드의 섀도우 상태가 업데이트됩니다.

1.  AWS IoT 콘솔에서 AWS IoT Greengrass 그룹을 선택한 다음 **클라이언트 디바이스** 탭을 선택합니다.

1. GG\$1TrafficLight 장치를 선택하고 **섀도우 동기화**를 선택한 다음 **클라우드와 섀도우 동기화 활성화**를 선택합니다.

   장치 섀도우 동기화 상태가 업데이트되었다는 알림을 수신해야 합니다.

1. <a name="console-actions-deploy"></a>그룹 구성 페이지에서 **배포**를 선택합니다.

1. 명령줄 창 두 개에서 [GG\$1Switch](comms-disabled.md#run-switch-device) 및 [GG\$1TrafficLight](comms-disabled.md#run-trafficlight-device) 클라이언트 장치에 대해 이전 테스트에서 명령을 실행합니다.

1. 이제 AWS IoT 콘솔에서 섀도우 상태를 확인합니다. AWS IoT Greengrass 그룹을 선택하고 **클라이언트 디바이스** 탭을 선택한 다음 **GG\$1TrafficLight**를 선택하고 **디바이스 섀도우** 탭을 선택한 다음 **클래식 섀도**우를 선택합니다.

   GG\$1TrafficLight 섀도우를에 동기화하도록 설정했으므로 GG\$1Switch AWS IoT가 업데이트를 보낼 때마다 클라우드의 섀도우 상태를 업데이트해야 합니다. 이 기능은 AWS IoT에 클라이언트 장치의 상태를 노출하는 데 사용될 수 있습니다.
**참고**  
필요한 경우 AWS IoT Greengrass 코어 로그, 특히를 확인하여 문제를 해결할 수 있습니다`runtime.log`.  

   ```
   cd /greengrass/ggc/var/log
   sudo cat system/runtime.log | more
   ```
 `GGShadowSyncManager.log`와 `GGShadowService.log`도 볼 수 있습니다. 자세한 내용은 [문제 해결 AWS IoT Greengrass](gg-troubleshooting.md) 단원을 참조하십시오.

클라이언트 장치 및 구독 설정을 유지합니다. 다음 모듈에서 이 둘을 사용합니다. 동일한 명령도 실행합니다.