클라이언트 디바이스로 IoT Greengrass를 설정하고 문제 해결하기 - AWS 권장 가이드

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

클라이언트 디바이스로 IoT Greengrass를 설정하고 문제 해결하기

작성자: Marouane Sefiani 및 Akalanka De Silva

환경: PoC 또는 파일럿

기술: IoT

서비스: IoT Greengrass, IoT Core

요약

IoT Greengrass는 엣지 디바이스에서 사물 인터넷(IoT) 소프트웨어를 구축, 배포 및 관리하기 위한 오픈 소스 엣지 런타임 및 클라우드 서비스입니다. IoT Greengrass 사용 사례는 다음과 같습니다.

  • IoT Greengrass 게이트웨이를 홈 오토메이션의 허브로 사용하는 스마트 홈

  • IoT Greengrass가 작업 현장의 데이터 수집 및 로컬 처리를 촉진할 수 있는 스마트 팩토리

IoT Greengrass는 일반적으로 IoT Core에 직접 연결되는 다른 엣지 디바이스(클라이언트 디바이스라고도 함)에 대한 안전하고 인증된 MQTT 연결 엔드포인트 역할을 할 수 있습니다. 이 기능은 클라이언트 디바이스가 IoT Core 엔드포인트에 네트워크로 직접 액세스할 수 없는 경우에 유용합니다.

다음 사용 사례에서 클라이언트 디바이스와 함께 사용하도록 IoT Greengrass를 설정할 수 있습니다.

  • 클라이언트 디바이스가 IoT Greengrass로 데이터를 전송하는 경우

  • IoT Greengrass가 데이터를 IoT Core로 전달하는 경우

  • 고급 IoT Core 규칙 엔진 기능을 활용하는 경우

이러한 기능을 사용하려면 IoT Greengrass 디바이스에 다음 구성 요소를 설치하고 구성해야 합니다.

  • MQTT 브로커

  • MQTT 브리지

  • 클라이언트 디바이스 인증

  • IP 감지기

또한 클라이언트 디바이스에서 게시된 메시지는 JSON 형식 또는 프로토콜 버퍼(protobuf) 형식이어야 합니다.

이 패턴은 이러한 필수 구성 요소를 설치 및 구성하는 방법을 설명하고 문제 해결 팁과 모범 사례를 제공합니다.

사전 조건 및 제한 사항

사전 조건 

제한 사항

  • IoT Core를 사용할 수 있는 리전을 선택해야 합니다. IoT Core의 현재 리전 목록은 리전별 서비스를 참조하십시오.

  • 코어 디바이스에는 최소 172MB RAM과 512MB의 디스크 공간이 있어야 합니다.

아키텍처

다음 다이어그램은 이 패턴의 솔루션 아키텍처를 보여 줍니다.

클라이언트 디바이스로 IoT Greengrass를 설정하기 위한 솔루션 아키텍처

아키텍처에는 다음이 포함됩니다.

  • 2개의 클라이언트 디바이스. 각 디바이스에는 프라이빗 키, 디바이스 인증서 및 루트 인증 기관(CA) 인증서가 포함되어 있습니다. MQTT 클라이언트가 포함된 IoT 디바이스 SDK도 각 클라이언트 디바이스에 설치됩니다.

  • 다음 구성 요소와 함께 IoT Greengrass가 배포된 코어 디바이스

    • MQTT 브로커

    • MQTT 브리지

    • 클라이언트 디바이스 인증

    • IP 감지기

이 아키텍처는 다음 시나리오를 지원합니다.

  • 클라이언트 디바이스는 MQTT 클라이언트를 사용하여 코어 디바이스의 MQTT 브로커를 통해 서로 통신할 수 있습니다.

  • 또한 클라이언트 디바이스는 코어 디바이스의 MQTT 브로커 및 MQTT 브리지를 통해 클라우드의 IoT Core와 통신할 수 있습니다.

  • 클라우드의 IoT Core는 MQTT 테스트 클라이언트와 코어 디바이스의 MQTT 브리지 및 MQTT 브로커를 통해 클라이언트 디바이스에 메시지를 보낼 수 있습니다.

클라이언트 디바이스와 코어 디바이스 간의 통신에 대한 자세한 내용은 추가 정보 섹션을 참조하십시오.

도구

서비스

  • IoT Greengrass는 디바이스에서 IoT 애플리케이션을 구축, 배포 및 관리하는 데 도움이 되는 오픈 소스 사물 인터넷(IoT) 엣지 런타임 및 클라우드 서비스입니다.

  • IoT Core는 인터넷에 연결된 디바이스를 클라우드에 연결할 수 있도록 안전한 양방향 통신을 제공합니다.

  • IoT 디바이스 SDK는 오픈 소스 라이브러리, 샘플 포함 개발자 설명서, 포팅 안내서를 포함하고 있어 사용자는 선택한 하드웨어 플랫폼에 따라 혁신적인 IoT 제품 또는 솔루션을 구축할 수 있습니다.

  • Identity and Access Management(IAM)를 사용하면 사용자에 대해 인증 및 권한 부여를 제어함으로써 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.

모범 사례

  • 변환 및 조건부 작업과 같은 IoT Core 규칙 엔진의 고급 기능을 활용하려면 클라이언트 디바이스의 메시지 페이로드가 JSON 또는 Protobuf 형식이어야 합니다.

  • 양방향 통신을 허용하도록 MQTT 브리지를 구성합니다.

  • 코어 디바이스의 IP 주소가 MQTT 브로커 인증서의 주체 대체 이름(SAN) 필드에 포함되도록 IoT Greengrass에서 IP 탐지기 구성 요소를 구성하고 배포합니다.

에픽

작업설명필요한 기술

코어 디바이스에 IoT Greengrass를 설정합니다.

개발자 안내서의 지침에 따라 IoT Greengrass Core 소프트웨어를 설치합니다.

IoT Greengrass

설치 상태를 확인합니다.

다음 명령을 사용하여 코어 디바이스에서 IoT Greengrass 서비스의 상태를 확인합니다.

sudo systemctl status greengrass.service

해당 명령 예상 출력은 다음과 같습니다.

Launched Nucleus successfully
일반

IAM 정책을 설정하고 Greengrass 서비스 역할에 연결합니다.

  1. MQTT 브리지와의 통신을 허용하는 IAM 정책을 생성합니다. 다음은 정책의 예입니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" }, { "Sid": "GreengrassActions", "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": "*" } ] }
  2. 이 정책을 Greengrass 서비스 역할에 연결합니다. 서비스 역할을 가져오려면 다음 명령을 사용합니다.

    aws greengrassv2 get-service-role-for-account --region <region>

    여기서 <region>은(는) 리전을 나타냅니다.

일반

IoT Greengrass 코어 디바이스에서 필수 구성 요소를 구성하고 배포합니다.

다음 구성 요소를 구성하고 배포합니다.

IoT Greengrass

MQTT 브리지가 양방향 통신을 허용하는지 확인합니다.

클라이언트 디바이스와 IoT Core 간에 MQTT 메시지를 릴레이하려면 MQTT 브리지 구성 요소를 구성 및 배포하고 릴레이할 주제를 지정합니다. 다음은 그 예입니다:

{ "mqttTopicMapping": { "ClientDevicesToCloud": { "topic": "dt/#", "source": "LocalMqtt", "target": "IotCore" }, "CloudToClientDevices": { "topic": "cmd/#", "source": "IotCore", "target": "LocalMqtt" } } }
IoT Greengrass

인증 구성 요소가 클라이언트 디바이스에 연결하여 주제를 게시하거나 구독할 수 있도록 허용하는지 확인합니다.

다음 aws.greengrass.clientdevices.Auth 구성을 사용하면 모든 클라이언트 장치가 연결되고 메시지를 게시하며 모든 주제를 구독할 수 있습니다.

{ "deviceGroups": { "formatVersion": "2021-03-05", "definitions": { "MyPermissiveDeviceGroup": { "selectionRule": "thingName: *", "policyName": "MyPermissivePolicy" } }, "policies": { "MyPermissivePolicy": { "AllowAll": { "statementDescription": "Allow client devices to perform all actions.", "operations": [ "*" ], "resources": [ "*" ] } } } } }
IoT Greengrass
작업설명필요한 기술

IoT 디바이스 SDK를 설치합니다.

클라이언트 디바이스에 IoT 디바이스 SDK를 설치합니다. 지원되는 언어 및 관련 SDK의 전체 목록은 IoT Core 설명서를 참조하십시오.

예를 들어 Python SDK용 AWS IoT 디바이스 SDK는 에 있습니다. GitHub 이 SDK를 설치하려면

  1. 리포지토리의 사전 요구 사항 페이지의 지침에 따라 Python 3.7 이상이 설치되어 있는지 확인합니다. GitHub

  2. pip 명령을 사용하여 SDK를 설치합니다.

    MacOS와 Linux의 경우

    python3 -m pip install awsiotsdk

    Windows의 경우

    python -m pip install awsiotsdk

또는 소스 리포지토리에서 SDK를 설치할 수 있습니다.

# Create a workspace directory to hold all the SDK files mkdir sdk-workspace cd sdk-workspace # Clone the repository git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git # Install using Pip (use 'python' instead of 'python3' on Windows) python3 -m pip install ./aws-iot-device-sdk-python-v2
일반 IoT

사물을 생성합니다.

  1. IoT 콘솔에서, 시작하기 버튼이 표시되면 선택합니다. 또는 탐색 창에서 보안을 선택한 후 정책을 선택합니다.

  2. 아직 정책이 없습니다 대화 상자가 나타나면 정책 생성를 선택합니다. 그렇지 않은 경우, 생성을 선택합니다.

  3. IoT 정책의 이름을 입력합니다(예: ClientDevicePolicy).

  4. 설명문 추가 부분에서 기존 정책을 다음 JSON 코드로 바꿉니다. <region><account>을(를) 리전 및 계정 번호로 대체합니다.

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account:client/*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account:thing/*" } ] }
  5. 생성을 선택합니다.

  6. IoT 콘솔의 탐색 창에서 관리, 사물을 선택합니다.

  7. 아직 사물이 없습니다 대화 상자가 표시되면 사물 등록을 선택합니다. 그렇지 않은 경우, 생성을 선택합니다.

  8. IoT 사물 생성 페이지에서 1개의 사물 생성을 선택합니다.

  9. 디바이스를 디바이스 레지스트리에 추가 페이지에서 IoT 사물 이름(예: ClientDevice1)을 입력하고 다음을 선택합니다.

    주의: 사물을 생성한 후에는 사물 이름을 변경할 수 없습니다. 사물 이름을 변경하려면 새 사물을 생성하고 새 이름을 지정한 다음 이전 사물을 삭제해야 합니다.

  10. 사물에 인증서 추가 페이지에서 인증서 생성을 선택하십시오.

  11. 다운로드 링크를 선택하여 인증서, 프라이빗 키 및 루트 CA 인증서를 다운로드합니다.

    중요: 이 방법으로만 인증서와 프라이빗 키를 다운로드할 수 있습니다.

  12. 인증서를 활성화하려면 활성화를 선택합니다. 디바이스를 IoT에 연결하려면 인증서가 활성 상태여야 합니다.

  13. 정책 연결을 선택합니다.

  14. 사물에 대한 정책 추가에서 사물 등록을 선택합니다 ClientDevicePolicy.

IoT Core

Greengrass 코어 디바이스에서 CA 인증서를 다운로드합니다.

Greengrass 코어 디바이스가 오프라인 환경에서 작동할 것으로 예상하는 경우, Greengrass 코어 CA에서 발급한 MQTT 브로커의 인증서를 확인할 수 있도록 Greengrass 코어 CA 인증서를 클라이언트 디바이스에서 사용할 수 있도록 해야 합니다. 따라서 이 인증서의 사본을 확보하는 것이 중요합니다. 다음 방법 중 하나를 사용하여 CA 인증서를 다운로드합니다.

  • PC에서 IoT Greengrass 디바이스에 네트워크로 액세스할 수 있는 경우, 웹 브라우저에 들어가서 https://<device IP>:8883을(를) 입력하고 MQTT 브로커 인증서 및 CA 인증서를 확인하세요. CA 인증서를 클라이언트 디바이스에 저장할 수도 있습니다.

  • 또는 OpenSSL 명령 라인을 사용할 수도 있습니다.

    openssl s_client -showcerts -connect <device IP>:8883
일반

클라이언트 디바이스에서 보안 인증 정보를 복사합니다.

Greengrass 코어 CA 인증서, 디바이스 인증서 및 클라이언트 디바이스의 프라이빗 키를 복사합니다.

일반

클라이언트 디바이스를 코어 디바이스와 연결합니다.

클라이언트 디바이스를 코어 디바이스와 연결하여 코어 디바이스를 검색할 수 있도록 합니다. 그러면 클라이언트 디바이스는 Greengrass 검색 API를 사용하여 관련 코어 디바이스의 연결 정보 및 인증서를 검색할 수 있습니다. 자세한 내용은 IoT Greengrass 설명서에서 클라이언트 디바이스 연결을 참조하십시오.

  1. IoT Greengrass 콘솔에서 코어 디바이스를 선택합니다.

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

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

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

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

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

    2. 추가를 선택합니다.

  6. 연결을 선택합니다.

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

IoT Greengrass
작업설명필요한 기술

한 클라이언트 디바이스에서 다른 클라이언트 디바이스로 데이터를 전송합니다.

디바이스의 MQTT 클라이언트를 사용하여 dt/client1/sensor 주제에 대한 메시지를 게시합니다.

일반

클라이언트 디바이스에서 IoT Core로 데이터를 전송합니다.

디바이스의 MQTT 클라이언트를 사용하여 dt/client1/sensor 주제에 대한 메시지를 게시합니다.

MQTT 테스트 클라이언트에서 디바이스가 메시지를 보내는 주제를 구독하거나 #를 구독하여 모든 주제를 구독합니다(세부 정보 참조).

일반

클라이언트 디바이스에서 IoT Core로 데이터를 전송합니다.

MQTT 클라이언트 페이지에서 주제 게시탭의 주제 이름 필드에 메시지의 주제 이름을 입력합니다. 이 예시에서는 주제에 cmd/client1을 사용합니다.

일반

문제 해결

문제Solution

‘서버 인증서를 확인할 수 없습니다’ 오류

이 오류는 MQTT 클라이언트가 TLS 핸드셰이크 중에 MQTT 브로커가 제공한 인증서를 확인할 수 없을 때 발생합니다. 가장 일반적인 이유는 MQTT 클라이언트에 CA 인증서가 없기 때문입니다. 다음 단계에 따라 CA 인증서가 MQTT 클라이언트에 제공되는지 확인합니다.

  1. PC에서 IoT Greengrass 디바이스에 네트워크로 액세스할 수 있는 경우, 웹 브라우저에 들어가서 https://<device IP>:8883을(를) 입력하고 MQTT 브로커 인증서 및 CA 인증서를 확인하십시오. CA 인증서를 클라이언트 디바이스에 저장할 수도 있습니다.

    또는 OpenSSL 명령 라인을 사용할 수도 있습니다.

    openssl s_client -showcerts -connect <device IP>:8883
  2. Moquette CA 및 Greengrass Core CA 인증서의 내용을 파일에 저장한 후, 다음 명령을 사용하여 디코딩된 내용을 확인합니다.

    openssl x509 -in <Name of CA>.pem -text

    Moquette CA 인증서에는 다음 예와 같이 SAN 필드가 표시되어야 합니다.

    X509v3 Subject Alternative Name: IP Address:XXX.XXX.XXX.XXX, IP Address:127.0.0.1, DNS:localhost

‘서버 이름을 확인할 수 없습니다’ 오류

이 오류는 MQTT 클라이언트가 올바른 서버에 연결되어 있는지 확인할 수 없을 때 발생합니다. 가장 일반적인 이유는 Greengrass 디바이스의 IP 주소가 인증서의 SAN 필드에 나열되지 않기 때문입니다.

이전 솔루션의 지침에 따라 MQTT 브로커 인증서를 얻고 추가 정보 섹션에 설명된 대로 SAN 필드에 IoT Greengrass 디바이스의 IP 주소가 포함되어 있는지 확인합니다. 그렇지 않은 경우, IP 탐지기 구성 요소가 제대로 설치되었는지 확인하고 코어 디바이스를 다시 시작하십시오.

내장된 클라이언트 디바이스에서 연결할 때만 서버 이름을 확인할 수 없음

임베디드 장치에 사용되는 널리 사용되는 TLS 라이브러리인 Mbed TLS는 Mbed TLS 라이브러리 코드에 표시된 대로 현재 인증서의 SAN 필드에서만 DNS 이름 확인을 지원합니다. 코어 디바이스는 자체 도메인 이름이 없고 IP 주소에 종속되므로 Mbed TLS를 사용하는 TLS 클라이언트는 TLS 핸드셰이크 중에 서버 이름 확인에 실패하여 연결 실패가 발생합니다. x509_crt_check_san 함수에서 Mbed TLS 라이브러리에 SAN IP 주소 확인 기능을 추가하는 것이 좋습니다.

관련 리소스

추가 정보

이 섹션은 클라이언트 디바이스와 코어 디바이스 간의 통신에 대한 추가 정보를 제공합니다.

MQTT 브로커는 코어 디바이스의 포트 8883에서 TLS 클라이언트 연결 시도를 수신 대기합니다. 다음 그림은 MQTT 브로커의 서버 인증서의 예시를 나타냅니다.

MQTT 브로커 서버 인증서의 예

예시 인증서에는 다음 세부 정보가 표시됩니다.

  • 이 인증서는 코어 디바이스에 국한되고 특정되는 IoT Greengrass Core CA에서 발급합니다. 즉, 로컬 CA 역할을 합니다.

  • 이 인증서는 다음 그림과 같이 클라이언트 인증 구성 요소에 의해 매주 자동으로 교체됩니다. 클라이언트 인증 구성 요소 구성에서 이 간격을 설정할 수 있습니다.

MQTT 브로커의 서버 인증서 교체
  • 주체 대체 이름(SAN)은 TLS 클라이언트 측의 서버 이름 확인에서 중요한 역할을 합니다. 이를 통해 TLS 클라이언트가 올바른 서버에 연결되도록 하고 TLS 세션 설정 중에 man-in-the-middle 공격을 피할 수 있습니다. 예시 인증서에서, SAN 필드는 이 서버가 localhost(로컬 Unix 도메인 소켓)에서 수신 대기 중이고 네트워크 인터페이스의 IP 주소가 192.168.1.12임을 나타냅니다.

TLS 클라이언트는 서버 확인 중에 인증서의 SAN 필드를 사용하여 합법적인 서버에 연결되어 있는지 확인합니다. 반대로, HTTP 서버와 브라우저 간의 일반적인 TLS 핸드셰이크에서는 CN(Common Name) 필드 또는 SAN 필드의 도메인 이름을 사용하여 서버 확인 프로세스 중에 브라우저가 실제로 연결하는 도메인을 교차 확인합니다. 코어 디바이스에 도메인 이름이 없는 경우, SAN 필드에 포함된 IP 주소도 같은 용도로 사용됩니다. 자세한 내용은 RFC 5280 — Internet X.509 공개 키 인프라 인증서 및 인증서 취소 목록(CRL) 프로필주체 대체 이름 섹션을 참조하십시오.

IoT Greengrass의 IP 탐지기 구성 요소는 인증서의 SAN 필드에 올바른 IP 주소가 포함되도록 합니다.

예시의 인증서는 로컬 CA 역할을 하는 IoT Greengrass 디바이스에서 서명합니다. TLS 클라이언트(MQTT 클라이언트)는 이 CA를 인식하지 못하므로 다음과 같은 CA 인증서를 제공해야 합니다.

예시 CA 인증서