Azure IoT Hub를 사용하여 디바이스에서 클라우드로 파일 업로드(Python)

이 문서에서는 IoT Hub의 파일 업로드 기능이 Python을 사용하여 Azure Blob Storage에 파일을 업로드하는 방법을 보여줍니다.

디바이스에서 IoT 허브로 원격 분석 데이터 보내기 빠른 시작 및 IoT Hub를 사용하여 클라우드-디바이스 메시지 보내기 문서는 IoT Hub의 기본적인 디바이스-클라우드 및 클라우드-디바이스 메시징 기능을 보여 줍니다. IoT Hub로 메시지 라우팅 구성 자습서에서는 디바이스-클라우드 메시지를 Microsoft Azure Blob 스토리지에 안정적으로 저장하는 방법을 보여 줍니다. 그러나 일부 시나리오에서는 디바이스에서 전송하는 데이터를 IoT Hub에서 허용하는 비교적 작은 디바이스-클라우드 메시지에 쉽게 매핑할 수 없습니다. 예시:

  • 비디오
  • 이미지가 포함된 대형 파일
  • 자주 샘플링되는 진동 데이터
  • 특정 형태의 전처리된 데이터

이러한 파일은 일반적으로 Azure Data Factory 또는 Hadoop 스택과 같은 도구를 사용하여 클라우드에서 일괄 처리됩니다. 디바이스에서 파일을 업로드해야 할 때 IoT Hub의 보안 및 안정성을 여전히 사용할 수 있습니다. 이 문서에서 그 방법을 보여줍니다.

이 문서의 끝에서 Python 디바이스 SDK를 사용하여 스토리지에 파일을 업로드하는 Python 콘솔 앱 FileUpload.py를 실행합니다.

참고 항목

IoT Hub는 Azure IoT 디바이스 SDK를 통해 다양한 디바이스 플랫폼 및 언어(C, Java, Python 및 JavaScript 포함)를 지원합니다. 디바이스를 Azure IoT Hub에 연결하는 방법에 자세한 내용은 Azure IoT 개발자 센터를 참조하세요.

Important

X.509 CA(인증 기관) 인증을 사용하는 디바이스의 파일 업로드 기능은 공개 미리 보기로 제공되고 있으며 미리 보기 모드를 사용하도록 설정해야 합니다. Azure Device Provisioning Service와 함께 X.509 지문 인증 또는 X.509 인증서 증명을 사용하는 디바이스에서 일반적으로 사용할 수 있습니다. IoT Hub를 사용하는 X.509 인증에 대해 자세히 알아보려면 지원되는 X.509 인증서를 참조하세요.

필수 조건

  • 활성 Azure 계정. 계정이 없는 경우 몇 분 만에 무료 계정을 만들 수 있습니다.

  • IoT 허브. CLI 또는 Azure Portal을 사용하여 만듭니다.

  • 등록된 디바이스. Azure Portal에 하나를 등록합니다.

  • Python 버전 3.7 이상을 사용하는 것이 좋습니다. 설치 프로그램의 요구 사항에 따라 32비트 또는 64비트 설치를 사용해야 합니다. 설치하는 동안 메시지가 나타나면 플랫폼별 환경 변수에 Python을 추가해야 합니다.

  • 8883 포트는 방화벽에서 열려 있어야 합니다. 이 문서의 디바이스 샘플은 포트 8883을 통해 통신하는 MQTT 프로토콜을 사용합니다. 이 포트는 일부 회사 및 교육용 네트워크 환경에서 차단될 수 있습니다. 이 문제를 해결하는 자세한 내용과 방법은 IoT Hub에 연결(MQTT)을 참조하세요.

Azure Storage 계정을 IoT Hub에 연결

디바이스에서 파일을 업로드하려면 IoT 허브와 연결된 Azure Storage 계정 및 Azure Blob Storage 컨테이너가 있어야 합니다. 스토리지 계정 및 컨테이너를 IoT 허브와 연결하면 IoT 허브가 디바이스에서 요청될 때 SAS URI의 요소를 제공할 수 있습니다. 그런 다음, 디바이스는 이러한 요소를 사용하여 Azure Storage를 인증하고 Blob 컨테이너에 파일을 업로드하는 데 사용하는 SAS URI를 생성할 수 있습니다.

Azure Storage 계정을 IoT 허브와 연결하려면 다음을 수행합니다.

  1. 허브 설정 아래에서 사용자 IoT 허브의 왼쪽에 있는 파일 업로드를 선택합니다.

    포털에서 선택한 파일 업로드 설정을 보여 주는 화면 캡처.

  2. 파일 업로드 창에서 Azure Storage 컨테이너를 선택합니다. 이 문서에서는 스토리지 계정과 IoT Hub를 동일한 지역에 배치하는 것이 좋습니다.

    • 사용하려는 스토리지 계정이 이미 있는 경우 목록에서 선택합니다.

    • 새 스토리지 계정을 만들려면 +스토리지 계정을 선택합니다. 스토리지 계정에 대한 이름을 제공하고 위치가 IoT 허브와 동일한 지역으로 설정되었는지 확인한 다음, 확인을 선택합니다. 새 계정은 IoT 허브와 동일한 리소스 그룹에 만들어집니다. 배포가 완료되면 목록에서 스토리지 계정을 선택합니다.

    스토리지 계정을 선택하면 컨테이너 창이 열립니다.

  3. 컨테이너 창에서 Blob 컨테이너를 선택합니다.

    • 사용하려는 Blob 컨테이너가 이미 있는 경우 목록에서 선택하고 선택을 클릭합니다.

    • 새 Blob 컨테이너를 만들려면 + 컨테이너를 선택합니다. 새 컨테이너에 대한 이름을 제공합니다. 이 문서의 목적을 위해 다른 모든 필드를 기본값으로 그대로 둘 수 있습니다. 만들기를 실행합니다. 배포가 완료되면 목록에서 컨테이너를 선택하고 선택을 클릭합니다.

  4. 파일 업로드 창으로 다시 돌아가서 파일 알림이 켜짐으로 설정되었는지 확인합니다. 다른 모든 설정은 기본값으로 그대로 둘 수 있습니다. 저장을 선택하고 다음 섹션으로 이동하기 전에 설정이 완료될 때까지 기다립니다.

    포털에서 파일 업로드 설정 확인을 보여 주는 화면 캡처.

Azure Storage 계정을 만드는 방법에 대한 자세한 지침은 스토리지 계정 만들기를 참조하세요. 스토리지 계정 및 Blob 컨테이너를 IoT 허브와 연결하는 방법에 대한 자세한 지침은 Azure Portal을 사용하여 파일 업로드 구성을 참조하세요.

디바이스 앱에서 파일 업로드

이 섹션에서는 IoT Hub에 파일을 업로드하는 디바이스 앱을 만듭니다.

  1. 명령 프롬프트에서 다음 명령을 실행하여 azure-iot-device 패키지를 설치합니다. 이 패키지를 사용하여 IoT 허브로 파일 업로드를 조정합니다.

    pip install azure-iot-device
    
  2. 명령 프롬프트에서 다음 명령을 실행하여 azure.storage.blob 패키지를 설치합니다. 이 패키지를 사용하여 파일 업로드를 수행합니다.

    pip install azure.storage.blob
    
  3. blob storage에 업로드할 테스트 파일을 만듭니다.

  4. 텍스트 편집기를 사용하여 작업 폴더에 FileUpload.py 파일을 만듭니다.

  5. FileUpload.py 파일의 시작 부분에서 다음 import 문 및 변수를 추가합니다.

    import os
    from azure.iot.device import IoTHubDeviceClient
    from azure.core.exceptions import AzureError
    from azure.storage.blob import BlobClient
    
    CONNECTION_STRING = "[Device Connection String]"
    PATH_TO_FILE = r"[Full path to local file]"
    
  6. 파일에서 [Device Connection String]을 IoT Hub 디바이스의 연결 문자열로 바꿉니다. [Full path to local file]을 작성한 테스트 파일 또는 업로드할 디바이스의 파일 경로로 바꿉니다.

  7. blob storage에 파일을 업로드하는 함수를 만듭니다.

    def store_blob(blob_info, file_name):
        try:
            sas_url = "https://{}/{}/{}{}".format(
                blob_info["hostName"],
                blob_info["containerName"],
                blob_info["blobName"],
                blob_info["sasToken"]
            )
    
            print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))
    
            # Upload the specified file
            with BlobClient.from_blob_url(sas_url) as blob_client:
                with open(file_name, "rb") as f:
                    result = blob_client.upload_blob(f, overwrite=True)
                    return (True, result)
    
        except FileNotFoundError as ex:
            # catch file not found and add an HTTP status code to return in notification to IoT Hub
            ex.status_code = 404
            return (False, ex)
    
        except AzureError as ex:
            # catch Azure errors that might result from the upload operation
            return (False, ex)
    

    이 함수는 이 함수에 전달된 blob_info 구조를 구문 분석하여 azure.storage.blob.BlobClient를 초기화하는 데 사용하는 URL을 만듭니다. 그런 다음 이 클라이언트를 사용하여 Azure blob storage에 파일을 업로드합니다.

  8. 다음 코드를 추가하여 클라이언트를 연결하고 파일을 업로드합니다.

    def run_sample(device_client):
        # Connect the client
        device_client.connect()
    
        # Get the storage info for the blob
        blob_name = os.path.basename(PATH_TO_FILE)
        storage_info = device_client.get_storage_info_for_blob(blob_name)
    
        # Upload to blob
        success, result = store_blob(storage_info, PATH_TO_FILE)
    
        if success == True:
            print("Upload succeeded. Result is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)
            )
    
        else :
            # If the upload was not successful, the result is the exception object
            print("Upload failed. Exception is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], False, result.status_code, str(result)
            )
    
    def main():
        device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        try:
            print ("IoT Hub file upload sample, press Ctrl-C to exit")
            run_sample(device_client)
        except KeyboardInterrupt:
            print ("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            device_client.shutdown()
    
    
    if __name__ == "__main__":
        main()
    

    이 코드는 IoTHubDeviceClient를 만들고 다음 API를 사용하여 IoT 허브로 파일 업로드를 관리합니다.

    • get_storage_info_for_blob는 IoT 허브에서 이전에 만든 연결된 스토리지 계정에 대한 정보를 가져옵니다. 이 정보에는 호스트 이름, 컨테이너 이름, blob 이름 및 SAS 토큰이 포함됩니다. 스토리지 정보가 이전 단계에서 만든 store_blob 함수에 전달되므로 해당 함수의 BlobClient는 Azure Storage를 사용하여 인증할 수 있습니다. get_storage_info_for_blob 메서드는 notify_blob_upload_status 메서드에서 사용되는 correlation_id도 반환합니다. correlation_id는 IoT Hub에서 작업 중인 blob을 표시하는 방식입니다.

    • notify_blob_upload_status는 Blob Storage 작업의 상태를 IoT Hub에 알립니다. get_storage_info_for_blob 메서드로 얻은 correlation_id를 전달합니다. IoT Hub에서 파일 업로드 작업의 상태에 대한 알림을 수신할 수 있는 서비스를 알리는 데 사용됩니다.

  9. FileUpload.py 파일을 저장하고 닫습니다.

애플리케이션 실행

이제 애플리케이션을 실행할 준비가 되었습니다.

  1. 작업 폴더의 명령 프롬프트에서 다음 명령을 실행합니다.

    python FileUpload.py
    
  2. 다음 스크린샷은 FileUpload 앱의 출력을 보여줍니다.

    FileUpload 앱 실행의 출력을 보여 주는 스크린샷.

  3. 포털을 사용하면 구성한 스토리지 컨테이너에 업로드된 파일을 볼 수 있습니다.

    업로드된 파일을 표시하는 Azure Portal의 컨테이너 스크린샷.

다음 단계

이 문서에서는 디바이스에서 파일 업로드를 단순화하기 위해 IoT Hub의 파일 업로드 기능을 사용하는 방법을 알아보았습니다. 다음 문서에서 이 기능을 계속 탐색할 수 있습니다.

다음 링크를 통해 Azure Blob Storage에 대해 자세히 알아보세요.