IoT Hub 디바이스 스트림(미리 보기)

Azure IoT Hub ‘디바이스 스트림’은 다양한 클라우드-디바이스 통신 시나리오를 위한 보안 양방향 TCP 터널을 쉽게 만들 수 있도록 합니다. 디바이스 스트림은 디바이스와 서비스 엔드포인트 간의 프록시 역할을 하는 IoT Hub ‘스트리밍 엔드포인트’에 의해 조정됩니다. 아래 다이어그램에 표시된 이 설정은 디바이스가 네트워크 방화벽 뒤에 있거나 사설망 내부에 있을 때 특히 유용합니다. 따라서 IoT Hub 디바이스 스트림은 수신 또는 발신 네트워크 방화벽 포트를 광범위하게 열지 않고도 방화벽에 편리한 방식으로 IoT 디바이스에 연결해야 하는 고객의 요구를 처리하는 데 도움이 됩니다.

IoT Hub 디바이스 스트림을 사용하면 디바이스가 안전하게 유지되며, 포트 443을 통해 IoT Hub의 스트리밍 엔드포인트에 대한 아웃바운드 TCP 연결만 열면 됩니다. 스트림이 설정되면 서비스 쪽 및 디바이스 쪽 애플리케이션이 각각 프로그래밍 방식으로 WebSocket 클라이언트 개체에 액세스하여 서로 원시 바이트를 보내고 받을 수 있습니다. 이 터널에서 제공하는 안정성 및 순서 지정 보장은 TCP와 유사합니다.

이점

IoT Hub 디바이스 스트림은 다음과 같은 혜택을 제공합니다.

  • 방화벽에 편리한 보안 연결: 디바이스 또는 네트워크 경계에서 인바운드 방화벽 포트를 열지 않고도 서비스 엔드포인트에서 IoT 디바이스에 연결할 수 있습니다(포트 443을 통해 IoT Hub에 대한 아웃바운드 연결만 있으면 됨).

  • 인증: 터널의 디바이스 쪽과 서비스 쪽 모두, 해당 자격 증명을 사용하여 IoT Hub에 인증해야 합니다.

  • 암호화: 기본적으로 IoT Hub 디바이스 스트림은 TLS 지원 연결을 사용합니다. 이렇게 하면 애플리케이션이 암호화를 사용하는지 여부와 관계없이 트래픽이 항상 암호화됩니다.

  • 연결의 단순성: 대부분의 경우 디바이스 스트림을 사용하면 IoT 디바이스에 연결하기 위해 가상 사설망을 복잡하게 설정할 필요가 없습니다.

  • TCP/IP 스택과의 호환성: IoT Hub 디바이스 스트림은 TCP/IP 애플리케이션 트래픽을 수용할 수 있습니다. 즉, 광범위한 소유 프로토콜 및 표준 기반 프로토콜에서 이 기능을 활용할 수 있습니다.

  • 프라이빗 네트워크 설정의 사용 편의성: 서비스에서 디바이스의 IP 주소가 아니라 디바이스 ID를 참조하여 디바이스와 통신할 수 있습니다. 이 기능은 디바이스가 프라이빗 네트워크에 있고 개인 IP 주소를 사용하거나, 해당 IP 주소가 동적으로 할당되고 서비스 쪽에서 알 수 없는 경우에 유용합니다.

디바이스 스트림 워크플로

서비스에서 디바이스 ID를 제공하여 디바이스에 대한 연결을 요청할 때 디바이스 스트림이 시작됩니다. 이 워크플로는 사용자가 SSH 또는 RDP 클라이언트 프로그램을 사용하여 디바이스에서 실행되는 SSH 또는 RDP 서버에 원격으로 연결하려는 클라이언트/서버 통신 모델(SSH 및 RDP 포함)에 특히 적합합니다.

디바이스 스트림 생성 프로세스에는 디바이스, 서비스, IoT 허브의 기본 엔드포인트 및 스트리밍 엔드포인트 간 협상이 포함됩니다. IoT 허브의 기본 엔드포인트는 디바이스 스트림 생성을 오케스트레이션하는 반면, 스트리밍 엔드포인트는 서비스와 디바이스 간에 전달되는 트래픽을 처리합니다.

디바이스 스트림 생성 흐름

SDK를 사용하여 디바이스 스트림을 프로그래밍 방식으로 만드는 과정에는 아래 그림에도 설명되어 있는 다음 단계가 포함됩니다.

  1. 디바이스 애플리케이션은 디바이스에 대해 새 디바이스 스트림이 시작될 때 알림을 받기 위해 미리 콜백을 등록합니다. 이 단계는 일반적으로 디바이스가 부팅되고 IoT Hub에 연결할 때 수행됩니다.

  2. 서비스 쪽 프로그램이 디바이스 ID(IP 주소가 아님)를 제공하여 필요할 때 디바이스 스트림을 시작합니다.

  3. IoT 허브는 1단계에서 등록된 콜백을 호출하여 디바이스 쪽 프로그램에 알립니다. 디바이스는 스트림 시작 요청을 수락하거나 거부할 수 있습니다. 이 논리는 애플리케이션 시나리오에만 해당할 수 있습니다. 디바이스가 스트림 요청을 거부하면 IoT Hub가 그에 따라 서비스에 알립니다. 거부하지 않은 경우 아래 단계가 수행됩니다.

  4. 디바이스가 포트 443을 통해 스트리밍 엔드포인트에 대한 보안 아웃바운드 TCP 연결을 만들고 WebSocket에 대한 연결을 업그레이드합니다. 스트리밍 엔드포인트의 URL 및 인증에 사용할 자격 증명은 둘 다 3단계에서 보낸 요청의 일부로 IoT Hub가 디바이스에 제공합니다.

  5. 서비스에서 스트림을 수락한 디바이스의 결과에 대한 알림을 받고, 계속하여 스트리밍 엔드포인트에 자체의 WebSocket 클라이언트를 만듭니다. 마찬가지로, IoT Hub에서 스트리밍 엔드포인트 URL 및 인증 정보를 받습니다.

위의 핸드셰이크 프로세스에서

  • 핸드셰이크 프로세스는 60초 이내에 완료되어야 합니다(2-5단계). 완료되지 않으면 핸드셰이크가 시간 초과로 실패하고 그에 따라 서비스가 알림을 받습니다.

  • 위의 스트림 생성 흐름이 완료되면 스트리밍 엔드포인트가 프록시로 작동하며, 해당 WebSocket을 통해 서비스와 디바이스 간에 트래픽을 전송합니다.

  • 디바이스와 서비스 둘 다에 IoT Hub의 기본 엔드포인트와 포트 443을 통한 스트리밍 엔드포인트에 대한 아웃바운드 연결이 필요합니다. 이러한 엔드포인트의 URL은 IoT Hub 포털의 개요 탭에서 사용할 수 있습니다.

  • 설정된 스트림의 안정성 및 순서 지정 보장은 TCP와 유사합니다.

  • IoT Hub 및 스트리밍 엔드포인트에 대한 모든 연결은 TLS를 사용하며 암호화됩니다.

종료 흐름

게이트웨이에 대한 TCP 연결 중 하나가 서비스 또는 디바이스에 의해 끊기면 설정된 스트림이 종료됩니다. 이 작업은 디바이스 또는 서비스 프로그램에서 WebSocket을 닫아 자발적으로 수행되거나, 네트워크 연결 시간 초과 또는 프로세스 실패 시 비자발적으로 수행될 수 있습니다. 스트리밍 엔드포인트에 대한 디바이스 또는 서비스 연결이 종료되면 다른 TCP 연결도 (강제로) 종료되며, 서비스 및 디바이스가 필요한 경우 스트림을 다시 만들어야 합니다.

연결 요구 사항

디바이스 스트림의 디바이스 쪽과 서비스 쪽 둘 다에서 IoT Hub 및 해당 스트리밍 엔드포인트에 대해 TLS 지원 연결을 설정할 수 있어야 합니다. 이렇게 하려면 포트 443을 통해 이 엔드포인트에 대한 아웃바운드 연결이 필요합니다. 이 엔드포인트와 연결된 호스트 이름은 아래 그림과 같이 IoT Hub의 ‘개요’ 탭에서 확인할 수 있습니다.

또는 허브의 속성 섹션, 특히 property.hostnameproperty.deviceStreams 키에서 Azure CLI를 사용하여 엔드포인트 정보를 검색할 수 있습니다.

az iot hub devicestream show --name <YourIoTHubName>

출력은 디바이스 스트림을 설정하기 위해 허브의 디바이스 및 서비스에서 연결해야 하는 모든 엔드포인트의 JSON 개체입니다.

{
  "streamingEndpoints": [
    "https://<YourIoTHubName>.<region-stamp>.streams.azure-devices.net"
  ]
}

참고 항목

Azure CLI 버전 2.0.57 이상이 설치되어 있는지 확인합니다. Azure CLI 설치 페이지에서 최신 버전을 다운로드할 수 있습니다.

디바이스 스트리밍 엔드포인트에 대한 아웃바운드 연결 허용

이 문서 맨 앞에서 설명한 대로 디바이스 스트림 시작 프로세스 중에 디바이스에서 IoT Hub 스트리밍 엔드포인트에 대한 아웃바운드 연결을 만듭니다. 디바이스 또는 해당 네트워크의 방화벽에서 443 포트를 통해 스트리밍 게이트웨이에 대한 아웃바운드 연결을 허용해야 합니다(통신은 TLS를 사용하여 암호화된 WebSocket 연결을 통해 수행됨).

디바이스 스트리밍 엔드포인트의 호스트 이름은 Azure IoT Hub 포털의 개요 탭에서 확인할 수 있습니다.

또는 Azure CLI를 사용하여 이 정보를 확인할 수 있습니다.

az iot hub devicestream show --name <YourIoTHubName>

참고 항목

Azure CLI 버전 2.0.57 이상이 설치되어 있는지 확인합니다. Azure CLI 설치 페이지에서 최신 버전을 다운로드할 수 있습니다.

디바이스 스트림 리소스 로그를 통해 문제 해결

IoT Hub에서 내보내는 디바이스 스트림의 리소스 로그를 수집하도록 Azure Monitor를 설정할 수 있습니다. 이 기능은 문제 해결 시나리오에서 매우 유용할 수 있습니다.

IoT Hub에 대한 디바이스 스트림 로그를 Azure Monitor 로그에 보내도록 진단 설정을 만들려면 아래 단계를 따르세요.

  1. Azure Portal에서 IoT Hub로 이동합니다. 왼쪽 창의 모니터링 아래에서 진단 설정을 선택합니다. 그런 다음, 진단 설정 추가를 선택합니다.

  2. 진단 설정의 이름을 제공하고 로그 목록에서 DeviceStreams를 선택합니다. 그런 다음, Log Analytics에 보내기를 선택합니다. 기존 Log Analytics 작업 영역을 선택하거나 새 작업 영역을 만드는 방법이 안내됩니다.

    Enable device streams logs

  3. 디바이스 스트림 로그를 Log Analytics 작업 영역으로 보내는 진단 설정을 만든 후 Azure Portal에서 IoT Hub의 왼쪽 창에 있는 모니터링에서 로그를 선택하여 로그에 액세스할 수 있습니다. 디바이스 스트림 로그가 AzureDiagnostics 테이블에 표시되고 Category=DeviceStreams를 포함합니다. 해당 작업을 수행하고 이 테이블에 로그를 표시되기까지 몇 분 정도 걸릴 수 있습니다.

    아래 그림과 같이 대상 디바이스의 ID와 작업 결과도 로그에서 제공됩니다.

IoT HUb에서 Azure Monitor를 사용하는 방법에 관한 자세한 내용은 IoT Hub 모니터링을 참조하세요. IoT Hub에서 사용할 수 있는 모든 리소스 로그, 메트릭 및 테이블에 대한 자세한 내용은 Azure IoT Hub 모니터링 데이터 참조를 참조하세요.

국가별 가용성

IoT Hub 디바이스 스트림은 퍼블릭 미리 보기 동안 미국 중부 및 미국 동부 EUAP, 북유럽 및 동남 아시아 지역에서 사용할 수 있습니다. 이러한 지역 중 하나에 허브를 만들어야 합니다.

SDK 가용성

각 스트림의 양쪽(디바이스 및 서비스 쪽)에서 IoT Hub SDK를 사용하여 터널을 설정합니다. 공개 미리 보기 중에는 고객이 다음 SDK 언어 중에서 선택할 수 있습니다.

  • C 및 C# SDK는 디바이스 쪽에서 디바이스 스트림을 지원합니다.

  • NodeJS 및 C# SDK는 서비스 쪽에서 디바이스 스트림을 지원합니다.

다음 단계

디바이스 스트림에 대해 자세히 알아보려면 아래 링크를 사용합니다.