사용자 고유의 IoT Edge 모듈 개발
적용 대상: IoT Edge 1.5 IoT Edge 1.4
Important
IoT Edge 1.5 LTS 및 IoT Edge 1.4 LTS는 지원되는 릴리스입니다. IoT Edge 1.4 LTS는 2024년 11월 12일에 수명이 종료됩니다. 이전 릴리스에 있는 경우 IoT Edge 업데이트를 참조하세요.
Azure IoT Edge 모듈은 다른 Azure 서비스와 연결하고 더 큰 클라우드 데이터 파이프라인에 속할 수 있습니다. 이 문서에서는 IoT Edge 런타임 및 IoT Hub, 나머지 Azure 클라우드와 통신하기 위한 모듈을 개발하는 방법을 설명합니다.
IoT Edge 런타임 환경
IoT Edge 런타임은 여러 IoT Edge 모듈의 기능을 통합하고 이를 IoT Edge 디바이스에 배포하기 위한 인프라를 제공합니다. 모든 프로그램을 IoT Edge 모듈로 패키지할 수 있습니다. IoT Edge 통신 및 관리 기능을 활용하기 위해 모듈에서 실행되는 프로그램은 Azure IoT 디바이스 SDK를 사용하여 로컬 IoT Edge 허브에 연결할 수 있습니다.
프로그램을 IoT Edge 모듈로 패키징
IoT Edge 디바이스에 프로그램을 배포하려면 먼저 Docker 호환 엔진으로 컨테이너화되고 실행되어야 합니다. IoT Edge는 Docker를 지원하는 오픈 소스 프로젝트인 Moby를 Docker 호환 엔진으로 사용합니다. Docker에 사용한 것과 동일한 매개변수를 IoT Edge 모듈에 전달할 수 있습니다. 자세한 내용은 IoT Edge 모듈에 대한 컨테이너 만들기 옵션 구성 방법을 참조하세요.
IoT Edge 허브 사용
IoT Edge 허브는 IoT Hub에 프록시 및 로컬 통신이라는 두 가지 주요 기능을 제공합니다.
모듈에서 IoT Edge 허브에 연결
모듈에서 로컬 IoT Edge 허브에 연결하기 위해서는 클라이언트와 동일한 연결 단계가 사용됩니다. 자세한 내용은 IoT Edge 허브에 연결을 참조하세요.
AMQP를 통해 IoT Edge 라우팅을 사용하려면 Azure IoT SDK에서 ModuleClient를 사용할 수 있습니다. DeviceClient 인스턴스가 IoT Hub에 IoT 디바이스를 연결하는 방법과 비슷하게 디바이스에서 실행 중인 IoT Edge 허브에 모듈을 연결하는 ModuleClient 인스턴스를 만듭니다. ModuleClient 클래스 및 해당 통신 방법에 대한 자세한 내용은 원하는 SDK 언어(C#, C, Python, Java 또는 Node.js)에 대한 API 참조를 확인하세요.
IoT Hub 기본 형식
IoT Hub는 디바이스와 유사한 모듈 인스턴스로 간주합니다. 모듈 인스턴스는 다음을 수행할 수 있습니다.
- 디바이스-클라우드 메시지 보내기
- 특별히 해당 ID에서 대상으로 지정된 직접 메서드 수신
- 디바이스 쌍 및 해당 디바이스의 다른 모듈 쌍과 별개이며 격리된 모듈 쌍이 있음
현재까지 모듈은 클라우드-디바이스 메시지를 수신하거나 파일 업로드 기능을 사용할 수 없습니다.
모듈을 작성할 때 IoT Edge 허브에 연결하고 디바이스 애플리케이션에 IoT Hub를 사용할 때와 같이 IoT Hub 기본 형식을 사용할 수 있습니다. IoT Edge 모듈과 IoT 디바이스 애플리케이션 간의 유일한 차이는 모듈이 디바이스 ID 대신 모듈 ID를 참조해야 한다는 것입니다.
디바이스-클라우드 메시지
IoT Edge 모듈은 로컬 브로커로 작동하고 메시지를 클라우드로 전달하는 IoT Edge 허브를 통해 클라우드에 메시지를 전파할 수 있습니다. 디바이스-클라우드 메시지의 복잡한 처리를 사용하도록 설정하기 위해 IoT Edge 모듈은 다른 모듈 또는 디바이스에서 해당 로컬 IoT Edge 허브로 보내는 메시지를 가로채서 처리할 수 있습니다. 그런 다음, IoT Edge 모듈은 처리된 데이터가 포함된 새 메시지를 보냅니다. 따라서 IoT Edge 모듈 체인을 만들어서 로컬 처리 파이프라인을 빌드할 수 있습니다.
경로를 사용하여 디바이스-클라우드 원격 분석 메시지를 보내려면 다음을 수행합니다.
- Azure IoT SDK의 Module Client 클래스를 사용합니다. 각 모듈에는 입력 및 출력 엔드포인트가 있습니다.
- Module Client 클래스에서 메시지 보내기 메서드를 사용하여 모듈의 출력 엔드포인트에 메시지를 보냅니다.
- 디바이스의 edgeHub 모듈에서 경로를 설정하여 이 출력 엔드포인트를 IoT Hub로 보냅니다.
경로를 사용하여 메시지를 처리하려면 다음을 수행합니다.
- 다른 엔드포인트(모듈 또는 디바이스)에서 수신되는 메시지를 모듈의 입력 엔드포인트로 전송하도록 경로를 설정합니다.
- 모듈의 입력 엔드포인트에서 메시지를 수신 대기합니다. 새 메시지가 돌아올 때마다 Azure IoT SDK에서 콜백 함수가 트리거됩니다.
- 이 콜백 함수로 메시지를 처리하고 선택적으로 모듈 엔드포인트 큐에서 새 메시지를 보냅니다.
참고 항목
경로 선언에 대한 자세한 내용은 IoT Edge에서 모듈을 배포하고 경로를 설정하는 방법 알아보기를 참조하세요.
쌍
트윈은 IoT Hub에서 제공되는 기본 형식 중 하나입니다. 메타데이터, 구성, 조건을 비롯한 상태 정보를 저장하는 JSON 문서가 있습니다. 각 모듈 또는 디바이스에는 고유한 트윈이 포함됩니다.
Azure IoT SDK로 모듈 트윈을 가져오려면
ModuleClient.getTwin
메서드를 호출합니다.Azure IoT SDK로 모듈 트윈 패치를 받으려면 콜백 함수를 구현하고 트윈 패치가 들어올 때마다 콜백 함수가 트리거되도록 Azure IoT SDK에서
ModuleClient.moduleTwinCallback
메서드로 등록합니다.
직접 메서드 수신
Azure IoT SDK로 직접 메서드를 수신하려면 콜백 함수를 구현하고 직접 메서드가 수신될 때마다 콜백 함수가 트리거되도록 Azure IoT SDK에서 ModuleClient.methodCallback
메서드로 이를 등록합니다.
언어 및 아키텍처 지원
IoT Edge는 요구에 맞는 시나리오를 빌드할 수 있도록 여러 가지 운영 체제, 디바이스 아키텍처, 개발 언어를 지원합니다. 이 섹션에서는 사용자 지정 IoT Edge 모듈 개발을 위한 여러 옵션들을 살펴볼 수 있습니다. 각 언어의 지원 도구 및 요구 사항에 대한 자세한 내용은 IoT Edge를 위한 개발 및 테스트 환경 준비를 참조하세요.
Linux
다음 표의 모든 언어에 대해 IoT Edge는 AMD64 및 대부분의 ARM64 Linux 컨테이너 개발을 지원합니다. Debian 11 ARM32 컨테이너도 지원됩니다.
개발 언어 | 개발 도구 |
---|---|
C | Visual Studio Code Visual Studio 2019/2022 |
C# | Visual Studio Code Visual Studio 2019/2022 |
Java | Visual Studio Code |
Node.js | Visual Studio Code |
Python | Visual Studio Code |
참고 항목
AMD64 개발 머신에서 ARM32 IoT Edge 모듈을 컴파일하는 것과 같은 플랫폼 간 컴파일의 경우 IoT Edge 모듈과 일치하는 대상 디바이스 아키텍처에서 코드를 컴파일하도록 개발 머신을 구성해야 합니다. 대상 디바이스 아키텍처에 대한 자세한 내용은 Visual Studio Code를 사용하여 Azure IoT Edge 모듈 개발을 참조하세요.
Windows
Windows 컨테이너는 더 이상 지원하지 않습니다. Windows에 깔린 Linux를 위한 IoT Edge는 Windows 디바이스에서 IoT Edge를 실행하는 권장 방법입니다.
모듈 보안
보안을 염두에 두고 모듈을 개발해야 합니다. 모듈 보안에 대한 자세한 내용은 Docker 보안을 참조하세요.
모듈 보안을 개선하기 위해 IoT Edge는 기본적으로 일부 컨테이너 기능을 사용하지 않도록 설정합니다. 필요한 경우 기본값을 재정의하여 모듈에 권한 있는 기능을 제공할 수 있습니다.
상승된 Docker 권한 허용
IoT Edge 디바이스의 구성 파일에 allow_elevated_docker_permissions
라는 매개 변수가 있습니다. true로 설정하면 이 플래그는 컨테이너 만들기 옵션에서 Docker HostConfig의 CapAdd
필드에 정의한 추가 기능뿐만 아니라 --privileged
플래그를 허용합니다.
참고 항목
현재 이 플래그는 기본적으로 true이므로 배포에서 모듈에 권한 있는 권한을 부여할 수 있습니다. 디바이스 보안을 향상하려면 이 플래그를 false로 설정하는 것이 좋습니다.
CAP_CHOWN 및 CAP_SETUID 사용
Docker 기능 CAP_CHOWN 및 CAP_SETUID는 기본적으로 사용하지 않도록 설정됩니다. 이러한 기능을 사용하여 호스트 디바이스에서 보안 파일을 쓰고 잠재적으로 루트 액세스 권한을 얻을 수 있습니다.
이러한 기능이 필요한 경우 컨테이너 만들기 옵션에서 CapADD를 사용하여 수동으로 다시 사용하도록 설정할 수 있습니다.
다음 단계
Visual Studio 코드를 사용하여 Azure IoT Edge 모듈 개발