Share via


Visual Studio 2022를 사용하여 Azure IoT Edge용 모듈 개발 및 디버그

적용 대상:IoT Edge 1.5 확인 표시 IoT Edge 1.5 IoT Edge 1.4 확인 표시 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 업데이트를 참조하세요.

이 문서에서는 Visual Studio 2022를 사용하여 Azure IoT Edge 모듈을 개발하고 디버그하여 사용자 지정 Azure IoT Edge 모듈에 배포하는 방법을 보여 줍니다. Visual Studio 2022는 C 및 C#으로 작성된 IoT Edge 모듈용 템플릿을 제공합니다. 지원되는 디바이스 아키텍처는 Windows x64, Linux x64, ARM32, ARM64(미리 보기)입니다. 지원되는 운영 체제, 언어 및 아키텍처에 대한 자세한 내용은 언어 및 아키텍처 지원을 참조하세요.

이 문서에는 두 개의 IoT Edge 개발 도구에 대한 단계가 포함되어 있습니다.

  • CLI(명령줄 인터페이스)는 개발을 위한 기본 도구입니다.
  • Visual Studio용 Azure IoT Edge 도구장 확장. 확장은 유지 관리 모드에 있습니다.

시작 부분에 있는 도구 선택기 단추를 사용하여 이 문서에 대한 도구 옵션을 선택합니다. 두 도구 모두 다음과 같은 이점을 제공합니다.

  • 로컬 개발 컴퓨터에서 IoT Edge 솔루션 및 모듈을 생성, 편집, 빌드, 실행 및 디버그합니다.
  • Visual Studio 개발 환경의 모든 이점을 활용하여 C 또는 C#으로 Azure IoT 모듈을 코딩합니다.
  • Azure IoT Hub를 통해 IoT Edge 디바이스에 IoT Edge 솔루션을 배포합니다.

필수 조건

이 문서에서는 Windows를 실행하는 컴퓨터를 개발 컴퓨터로 사용한다고 가정합니다.

  • 개발 머신에서 Visual Studio 2022를 설치 및 수정합니다. Azure 개발C++를 사용한 데스크톱 개발 워크로드 옵션을 선택합니다.

  • Visual Studio Marketplace에서 Azure IoT Edge Tools를 다운로드하여 설치합니다. Azure IoT Edge 도구 확장을 사용하여 IoT Edge 솔루션을 만들고 빌드할 수 있습니다. 기본 개발 도구는 Azure IoT Edge 개발자 도구 CLI(명령줄)입니다. 확장에는 Visual Studio 프로젝트를 만드는 데 사용되는 Azure IoT Edge 프로젝트 템플릿이 포함됩니다. 현재는 사용하는 개발 도구에 관계없이 확장이 설치되어 있어야 합니다.

    Important

    VS 2022용 Azure IoT Edge Tools 확장이 유지 관리 모드에 있습니다. 기본 개발 도구는 Azure IoT Edge 개발자 도구 CLI(명령줄)입니다.

    Visual Studio 2019를 사용하는 경우 Visual Studio Marketplace에서 VS 2019용 Azure IoT Edge Tools를 다운로드하여 설치합니다.

  • Vcpkg 라이브러리 관리자 설치

    git clone https://github.com/Microsoft/vcpkg
    cd vcpkg
    bootstrap-vcpkg.bat
    

    Windows용 azure-iot-sdk-c 패키지 설치

    vcpkg.exe install azure-iot-sdk-c:x64-windows
    vcpkg.exe --triplet x64-windows integrate install
    
  • 모듈 이미지를 빌드하고 실행하는 개발 컴퓨터에 Docker 호환 컨테이너 관리 시스템을 다운로드하고 설치합니다. 예를 들어 Docker Community Edition을 설치합니다.

  • Linux 컨테이너로 모듈을 개발하려면 Docker Desktop 요구 사항을 충족하는 Windows 컴퓨터를 사용하세요.

  • 모듈 이미지를 저장할 Azure Container Registry 또는 Docker Hub를 만듭니다.

    클라우드 레지스트리 대신 로컬 Docker 레지스트리를 프로토타입 및 테스트 목적으로 사용할 수 있습니다.

  • Azure CLI를 설치합니다.

  • 디바이스에서 모듈을 테스트하려면 하나 이상의 IoT Edge 디바이스가 있는 활성 IoT Hub가 필요합니다. 테스트용 IoT Edge 디바이스를 만들려면 Azure Portal에서 또는 CLI를 사용하여 디바이스를 만들 수 있습니다.

    • Azure Portal에서 만드는 것이 가장 빠릅니다. Azure Portal에서 IoT Hub 리소스로 이동합니다. 디바이스 관리 메뉴에서 디바이스를 선택한 다음, 디바이스 추가를 선택합니다.

      디바이스 만들기에서 디바이스ID를 사용하여 디바이스 이름을 지정하고 IoT Edge 디바이스를 체크한 다음 왼쪽 아래에서 저장을 선택합니다.

      마지막으로 디바이스 관리 > 디바이스 메뉴에서 새 디바이스가 IoT Hub에 있는지 확인합니다. Azure Portal을 통해 IoT Edge 디바이스를 만드는 방법에 대한 자세한 내용은 대칭 키를 사용하여 Linux에서 IoT Edge 디바이스 만들기 및 프로비전을 참조하세요.

    • CLI로 IoT Edge 디바이스를 만들려면 Linux 또는 Windows에 대한 빠른 시작의 단계를 수행합니다. IoT Edge 디바이스를 등록하는 과정에서 IoT Edge 디바이스를 만듭니다.

    개발 머신에서 IoT Edge 디먼을 실행할 경우, Visual Studio에서 개발을 시작하기 전 EdgeHub 및 EdgeAgent를 중지해야 할 수도 있습니다.

Azure IoT Edge 프로젝트 만들기

Visual Studio의 IoT Edge 프로젝트 템플릿은 IoT Edge 디바이스에 배포할 솔루션을 만듭니다. 먼저 Azure IoT Edge 솔루션을 만듭니다. 그런 다음, 해당 솔루션에서 모듈을 만듭니다. 각 IoT Edge 솔루션에는 둘 이상의 모듈이 포함될 수 있습니다.

솔루션에서 세 개의 프로젝트를 빌드하게 됩니다. 온도 센서 모듈 외에도 EdgeAgentEdgeHub가 포함된 기본 모듈이 포함됩니다. 다음으로 두 개의 IoT Edge 모듈을 더 추가합니다.

Important

Visual Studio에서 만든 IoT Edge 프로젝트 구조는 Visual Studio Code의 구조와는 다릅니다.

현재 Azure IoT Edge 개발자 도구 CLI는 Visual Studio 프로젝트 형식 만들기를 지원하지 않습니다. Visual Studio IoT Edge 확장을 사용하여 Visual Studio 프로젝트를 만들어야 합니다.

  1. Visual Studio에서 새 프로젝트를 만듭니다.

  2. 새 프로젝트 만들기에서 Azure IoT Edge를 검색합니다. IoT Edge 디바이스의 플랫폼 및 아키텍처와 일치하는 프로젝트를 선택하고 다음을 선택합니다.

  3. 새 프로젝트 구성에서 프로젝트 이름을 입력하고, 위치를 지정하고, 만들기를 선택합니다.

  4. 모듈 추가에서 개발할 모듈 유형을 선택합니다. 배포에 추가하려는 기존 모듈이 있는 경우 기존 모듈을 선택합니다.

  5. 모듈 이름에 모듈의 이름을 입력합니다. 컨테이너 레지스트리 내에서 고유한 이름을 선택합니다.

  6. 리포지토리 URL에서 모듈의 이미지 리포지토리 이름을 제공합니다. Visual Studio는 localhost:5000/<모듈 이름>으로 모듈 이름을 자동으로 채웁니다. 고유한 레지스트리 정보로 바꿉니다. 테스트를 위해 로컬 Docker 레지스트리를 사용하는 경우 localhost를 사용합니다. Azure Container Registry를 사용하는 경우 레지스트리 설정의 로그인 서버를 사용합니다. 로그인 서버는 <레지스트리 이름>.azurecr.io와 같이 표시됩니다. 최종 결과가 <레지스트리 이름>.azurecr.io/<모듈 이름>과 같이 표시되도록 문자열의 localhost:5000 부분을 바꾸기만 하면 됩니다.

  7. 추가를 선택하여 프로젝트에 모듈을 추가합니다.

    애플리케이션 및 모듈을 추가하는 방법의 스크린샷.

    참고 항목

    기존 IoT Edge 프로젝트가 있는 경우 module.json 파일을 열어 리포지토리 URL을 변경할 수 있습니다. 리포지토리 URL은 JSON 파일의 리포지토리 속성에 있습니다.

이제 Visual Studio 솔루션에 IoT Edge 프로젝트와 IoT Edge 모듈이 있습니다.

프로젝트 구조

솔루션에는 기본 프로젝트 폴더와 단일 모듈 폴더를 포함한 두 개의 프로젝트 수준 폴더가 있습니다. 예를 들어 AzureIotEdgeApp1이라는 기본 프로젝트 폴더와 IotEdgeModule1이라는 모듈 폴더가 있을 수 있습니다. 기본 프로젝트 폴더에는 배포 매니페스트가 포함되어 있습니다.

모듈 프로젝트 폴더에는 선택한 언어에 따라 이름이 Program.cs 또는 main.c인 모듈 코드용 파일이 포함되어 있습니다. 이 폴더에는 모듈의 메타데이터를 설명하는 module.json이라는 파일도 포함되어 있습니다. 여기 포함된 다양한 Docker 파일은 모듈을 Windows 또는 Linux 컨테이너로 빌드하는 데 필요한 정보를 제공합니다.

프로젝트의 배포 매니페스트

편집할 배포 매니페스트를 deployment.debug.template.json이라고 합니다. 이 파일은 IoT Edge 배포 매니페스트의 템플릿으로, 서로 통신하는 방법과 함께 디바이스에서 실행될 모든 모듈을 정의합니다. 배포 매니페스트에 대한 자세한 내용은 모듈을 배포하고 경로를 설정하는 방법 알아보기를 참조하세요.

이 배포 템플릿을 열면 이 Visual Studio 프로젝트에서 만든 사용자 지정 모듈과 함께 두 개의 런타임 모듈인 edgeAgentedgeHub가 포함되어 있음을 알 수 있습니다. SimulatedTemperatureSensor라는 네 번째 모듈도 포함되어 있습니다. 이 기본 모듈은 모듈을 테스트하는 데 사용할 수 있는 시뮬레이션된 데이터를 생성하거나 필요하지 않은 경우 삭제할 수 있습니다. 시뮬레이션된 온도 센서의 작동 방법을 확인하려면 SimulatedTemperatureSensor.csproj 소스 코드를 확인합니다.

IoT Edge 런타임 버전 설정

현재 안정적인 최신 런타임 버전은 1.5입니다. IoT Edge 런타임 버전을 안정적인 최신 릴리스 또는 디바이스의 대상으로 지정할 버전으로 업데이트해야 합니다.

  1. 솔루션 탐색기에서 기본 프로젝트 이름을 마우스 오른쪽 단추로 선택하고 IoT Edge 런타임 버전 설정을 선택합니다.

    ‘IoT Edge 런타임 버전’이라는 메뉴 항목을 찾아서 선택하는 방법의 스크린샷.

  2. 드롭다운 메뉴를 사용하여 IoT Edge 디바이스에서 실행 중인 런타임 버전을 선택한 다음 확인을 선택하여 변경 사항을 저장합니다. 변경 내용이 없으면 취소를 선택하여 종료합니다.

    현재 확장에는 최신 런타임 버전에 대한 선택 항목이 포함되어 있지 않습니다. 런타임 버전을 1.2보다 높게 설정하려면 deployment.debug.template.json 배포 매니페스트 파일을 엽니다. 시스템 런타임 모듈 이미지 edgeAgentedgeHub의 런타임 버전을 변경합니다. 예를 들어 IoT Edge 런타임 버전 1.5를 사용하려면 배포 매니페스트 파일에서 다음 줄을 변경합니다.

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.5"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
       //...
    
  3. 버전을 변경한 경우 프로젝트 이름을 마우스 오른쪽 단추로 선택하여 배포 매니페스트를 다시 만들고 IoT Edge에 대한 배포 만들기를 선택합니다. 그러면 배포 템플릿을 기반으로 배포 매니페스트가 생성되고 Visual Studio 프로젝트의 config 폴더에 나타납니다.

  1. deployment.debug.template.json 배포 매니페스트 파일을 엽니다. 배포 매니페스트는 대상 IoT Edge 디바이스에 구성할 모듈을 설명하는 JSON 문서입니다.

  2. 시스템 런타임 모듈 이미지 edgeAgentedgeHub의 런타임 버전을 변경합니다. 예를 들어 IoT Edge 런타임 버전 1.5를 사용하려면 배포 매니페스트 파일에서 다음 줄을 변경합니다.

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
        //...
    

모듈 인프라 및 개발 옵션

새 모듈을 추가하면 코드를 건드리지 않고도 테스트를 시작할 수 있도록 빌드 및 디바이스에 배포할 준비가 된 기본 코드가 함께 제공됩니다. 모듈 코드는 Program.cs(C#의 경우) 또는 main.c(C의 경우)라는 파일의 모듈 폴더에 있습니다.

기본 솔루션은 SimulatedTemperatureSensor 모듈의 시뮬레이션된 데이터가 입력을 받아 IoT Hub로 전송하는 모듈로 라우팅되도록 빌드됩니다.

고유한 코드를 사용하여 모듈 템플릿을 사용자 지정할 준비가 된 경우 Azure IoT Hub SDK를 사용하여 보안, 디바이스 관리 및 안정성 등 IoT 솔루션에 대한 주요 요구 사항을 해결하는 모듈을 빌드합니다.

시뮬레이터를 사용하여 디버그

Azure IoT EdgeHub 개발자 도구는 로컬 개발 및 디버그 환경을 제공합니다. 이 도구는 IoT Edge 런타임 없이 IoT Edge 모듈을 시작할 수 있도록 하므로 IoT Edge 모듈 및 솔루션을 로컬로 만들고 개발하고 테스트하고 실행하고 디버그할 수 있습니다. 이미지를 컨테이너 레지스트리로 푸시한 후 테스트용 디바이스에 배포할 필요가 없습니다.

자세한 내용은 Azure IoT EdgeHub 개발 도구를 참조하세요.

Visual Studio에서 도구를 초기화하려면 다음을 수행합니다.

  1. Azure Portal 또는 Azure CLI에서 IoT Edge 디바이스의 연결 문자열(IoT Hub에서 찾음)을 검색합니다.

    CLI를 사용하여 연결 문자열을 검색하는 경우 이 명령을 사용하여 “[device_id]” 및 “[hub_name]”을 사용자 고유의 값으로 바꿉니다.

    az iot hub device-identity connection-string show --device-id [device_id] --hub-name [hub_name]
    
  2. Visual Studio의 도구 메뉴에서 Azure IoT Edge Tools>IoT Edge 시뮬레이터 설정을 선택합니다.

  3. 연결 문자열을 붙여넣고 확인을 선택합니다.

참고 항목

모든 후속 Azure IoT Edge 솔루션에 결과가 자동으로 적용되기 때문에 이 단계들은 개발 컴퓨터에서 한 번만 수행해야 합니다. 다른 연결 스트링으로 변경해야 할 경우 이 과정을 다시 밟으면 됩니다.

단일 모듈 빌드 및 디버그

여러 모듈이 포함된 전체 솔루션 내에서 실행하기 전데 모듈을 각각 테스트 및 디버그하는 것이 일반적입니다. IoT Edge 시뮬레이터 도구를 사용하면 포트 53000을 통해 메시지 보내기를 격리하여 단일 모듈을 실행할 수 있습니다.

  1. 솔루션 탐색기에서 모듈 프로젝트 폴더(예: IotEdgeModule1)를 선택하고 강조 표시합니다. 사용자 지정 모듈 프로젝트를 시작 프로젝트로 설정합니다. 메뉴에서 프로젝트>을 선택합니다.

  2. F5 키를 누르거나 도구 모음 실행 단추를 선택하여 단일 모듈에 대한 IoT Edge 시뮬레이터를 시작합니다. 처음에는 10~20초 정도 걸릴 수 있습니다.

    모듈을 실행하는 방법의 스크린샷.

  3. 모듈이 성공적으로 초기화된 경우 .NET Core 콘솔 앱 창이 표시된 것을 볼 수 있습니다.

  4. 모듈을 검사하기 위해 중단점을 설정합니다.

    • C#으로 개발하는 경우 ModuleBackgroundService.csPipeMessage() 함수에 중단점을 설정합니다.
    • C를 사용하는 경우 main.cInputQueue1Callback() 함수에 중단점을 설정합니다.
  5. 메시지를 보내 모듈을 테스트합니다. 단일 모듈을 디버깅할 때 시뮬레이터는 메시지에 대한 기본 포트 53000에서 수신 대기합니다. 모듈에 메시지를 보내려면 Git Bash 또는 WSL Bash와 같은 명령 셸에서 다음 curl 명령을 실행합니다.

    curl --header "Content-Type: application/json" --request POST --data '{"inputName": "input1","data":"hello world"}' http://localhost:53000/api/v1/messages
    

    URL에서 일치하지 않는 닫기 중괄호/대괄호 오류가 발생하면 대신 다음 명령을 시도합니다.

    curl --header "Content-Type: application/json" --request POST --data "{\"inputName\": \"input1\", \"data\", \"hello world\"}"  http://localhost:53000/api/v1/messages
    

    출력 콘솔, Visual Studio 프로젝트 및 Bash 창의 스크린샷.

    중단점이 트리거됩니다. 디버거가 실행 중일 때 찾은 변수를 Visual Studio 로컬 창에서 볼 수 있습니다. 디버그>Windows>로컬로 이동합니다.

    Bash 또는 셸에 {"message":"accepted"} 확인이 표시됩니다.

    .NET 콘솔에 다음이 표시됩니다.

    IoT Hub module client initialized.
    Received message: 1, Body: [hello world]
    

    curl 대신 PostMan 또는 다른 API 도구를 사용하여 메시지를 보낼 수도 있습니다.

  6. Ctrl + F5를 누르거나 중지 버튼을 클릭하여 디버깅을 중지합니다.

여러 모듈 빌드 및 디버그

단일 모듈 개발을 마친 후 여러 모듈이 있는 전체 솔루션을 실행하고 디버그합니다. IoT Edge 시뮬레이터 도구를 사용하면 메시지 라우팅을 위해 시뮬레이션된 edgeHub를 포함하여 배포 매니페스트에 정의된 모든 모듈을 실행할 수 있습니다. 이 예제에서는 두 개의 사용자 지정 모듈과 시뮬레이션된 온도 센서 모듈을 실행합니다. 시뮬레이션된 온도 센서 모듈의 메시지는 각 사용자 지정 모듈로 라우팅됩니다.

  1. 솔루션 탐색기에서 기본 프로젝트 폴더를 마우스 오른쪽 단추로 클릭하여 솔루션에 두 번째 모듈을 추가합니다. 메뉴에서 추가>새 IoT Edge 모듈을 선택합니다.

    메뉴에서 '새 IoT Edge 모듈'을 추가하는 방법의 스크린샷.

  2. Add module창에서 새 모듈에 이름을 지정하고 리포지토리 URL의 localhost:5000 부분을 이전처럼 Azure Container Registry 로그인 서버로 바꿉니다.

  3. deployment.debug.template.json 파일을 열면 모듈 섹션에 새 모듈이 추가된 것을 볼 수 있습니다. 새 모듈에서 IoT Hub로 메시지를 보내기 위한 새 경로도 EdgeHub경로 섹션에 추가되었습니다. 시뮬레이션된 온도 센서에서 새 모듈로 데이터를 보내려면 JSON의 다음 줄이 포함된 또 다른 경로를 추가합니다. <NewModuleName>(두 위치에서)을 사용자 고유의 모듈 이름으로 대체합니다.

    "sensorTo<NewModuleName>": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/<NewModuleName>/inputs/input1\")"
    
  4. 기본 프로젝트(예: AzureIotEdgeApp1)를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다. 기본 프로젝트를 시작 프로젝트로 설정하면 솔루션의 모든 모듈이 실행됩니다. 여기에는 솔루션에 추가한 모듈, 시뮬레이션된 온도 센서 모듈 및 시뮬레이션된 Edge 허브가 모두 포함됩니다.

  5. F5 키를 누르거나 도구 모음 실행 단추를 선택하여 솔루션을 실행합니다. 처음에는 10~20초가 걸릴 수 있습니다. 이 프로젝트에 필요한 포트를 바인딩할 수 있는 다른 Docker 컨테이너가 실행되고 있지 않은지 확인합니다.

  6. 두 개의 .NET Core 콘솔 앱 창이 각 모듈에 하나씩 표시되는 것을 볼 수 있습니다.

  7. 모듈을 검사하기 위해 중단점을 설정합니다.

    • C#으로 개발하는 경우 ModuleBackgroundService.csPipeMessage() 함수에 중단점을 설정합니다.
    • C를 사용하는 경우 main.cInputQueue1Callback() 함수에 중단점을 설정합니다.
  8. 각 모듈에 중단점을 만든 다음 F5를 눌러 여러 개의 모듈을 동시에 실행 및 디버그합니다. 여러 개의 .NET Core 콘솔 앱 창을 볼 수 있으며 각 창은 각기 다른 모듈을 나타냅니다.

    두 개의 출력 콘솔이 있는 Visual Studio의 스크린샷.

  9. Ctrl + F5를 누르거나 중지 버튼을 클릭하여 디버깅을 중지합니다.

이미지를 빌드하고 레지스트리에 푸시

모듈을 개발하고 디버그하면 모듈 이미지를 빌드하고 Azure Container Registry에 푸시할 수 있습니다. 그런 다음, 모듈을 IoT Edge 디바이스에 배포할 수 있습니다.

  1. 기본 IoT Edge 프로젝트를 개별 모듈 중 하나가 아니라 시작 프로젝트로 설정합니다.

  2. 모듈 이미지를 빌드할 구성으로 디버그릴리스 중 하나를 선택합니다.

    참고 항목

    디버그를 선택하면, Visual Studio가 Dockerfile.(amd64|windows-amd64).debug을(를) 사용하여 Docker 이미지를 빌드합니다. 이미지를 빌드하는 동안 컨테이너 이미지의 .NET Core 명령 줄 디버거 VSDBG가 포함됩니다. 프로덕션이 준비된 IoT Edge 모듈의 경우, VSDBG 없이 Dockerfile.(amd64|windows-amd64)을(를) 사용하는 릴리스 구성을 권장합니다.

  3. ACR(Azure Container Registry) 같은 프라이빗 레지스트리를 사용할 경우, 다음 Docker 명령을 사용하여 로그인합니다. Azure Portal에 있는 레지스트리의 액세스 키 페이지에서 사용자 이름과 암호를 가져올 수 있습니다.

    docker login <ACR login server>
    
  4. deployment.debug.template.json 파일에 있는 런타임 설정에 Azure Container Registry 로그인 정보를 추가해 보겠습니다. 두 가지 방법으로 이 작업을 수행할 수 있습니다. 레지스트리 자격 증명을 .env 파일에 추가하거나(가장 안전함) deployment.debug.template.json 파일에 직접 추가할 수 있습니다.

    자격 증명을 .env 파일에 추가합니다.

    솔루션 탐색기에서 모든 파일 표시 도구 모음 단추를 선택합니다. .env 파일이 나타납니다. Azure Container Registry 사용자 이름과 암호를 .env 파일에 추가합니다. 이러한 자격 증명은 Azure Portal의 Azure Container Registry 액세스 키 페이지에서 찾을 수 있습니다.

    솔루션 탐색기의 모든 파일을 보여 주는 단추의 스크린샷.

        DEFAULT_RT_IMAGE=1.2
        CONTAINER_REGISTRY_USERNAME_myregistry=<my-registry-name>
        CONTAINER_REGISTRY_PASSWORD_myregistry=<my-registry-password>
    

    deploy.debug.template.json에 직접 자격 증명 추가

    배포 템플릿에 직접 자격 증명을 추가하려는 경우 자리 표시자를 ACR 관리자 사용자 이름, 암호, 레지스트리 이름으로 바꿀 수 있습니다.

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    참고 항목

    이 문서에서는 개발 및 테스트 시나리오에 편리하게 사용할 수 있는 관리자 로그인 자격 증명을 Azure Container Registry에 사용합니다. 프로덕션 시나리오에 사용할 준비가 되면 서비스 주체 같은 최소 권한 인증 옵션을 사용하는 것이 좋습니다. 자세한 내용은 컨테이너 레지스트리에 대한 액세스 관리를 참조하세요.

  5. 로컬 레지스트리를 사용할 경우 로컬 레지스트리를 실행할 수 있습니다.

  6. 마지막으로 솔루션 탐색기에서 기본 프로젝트 폴더를 마우스 오른쪽 단추로 클릭한 다음, IoT Edge 모듈 빌드 및 푸시를 선택하여 각 모듈의 Docker 이미지를 빌드하고 푸시합니다. 이 작업은 1분 정도 걸릴 수 있습니다. Visual Studio의 출력 콘솔에 Finished Build and Push IoT Edge Modules.가 표시되면 완료됩니다.

솔루션 배포

이제 모듈 이미지를 빌드하고 Azure Container Registry에 푸시했으므로 솔루션을 IoT Edge 디바이스에 배포할 수 있습니다. 이 자습서 전체에서 보았던 배포 매니페스트 템플릿이 이미 있습니다. 그로부터 배포 매니페스트를 생성한 다음, Azure CLI 명령을 사용하여 모듈을 Azure의 IoT Edge 디바이스에 배포해 보겠습니다.

  1. Visual Studio 솔루션 탐색기에서 기본 프로젝트를 마우스 오른쪽 단추로 클릭하고 IoT Edge 배포 만들기를 선택합니다.

    ‘배포 만들기’ 메뉴 항목의 위치 스크린샷.

  2. 로컬 Visual Studio 기본 프로젝트 폴더로 이동하여 config 폴더를 확인합니다. 파일 경로는 다음과 같습니다. C:\Users\<YOUR-USER-NAME>\source\repos\<YOUR-IOT-EDGE-PROJECT-NAME>\config 여기서 deployment.amd64.debug.json과 같이 만들어진 배포 매니페스트를 찾을 수 있습니다.

  3. deployment.amd64.debug.json 파일을 확인하여 edgeHub 스키마 버전이 1.2로 설정되어 있는지 확인합니다.

     "$edgeHub": {
         "properties.desired": {
           "schemaVersion": "1.2",
           "routes": {
             "IotEdgeModule2022ToIoTHub": "FROM /messages/modules/IotEdgeModule2022/outputs/* INTO $upstream",
             "sensorToIotEdgeModule2022": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/IotEdgeModule2022/inputs/input1\")",
             "IotEdgeModule2022bToIoTHub": "FROM /messages/modules/IotEdgeModule2022b/outputs/* INTO $upstream"
           },
           "storeAndForwardConfiguration": {
             "timeToLiveSecs": 7200
           }
         }
       }
    

    Visual Studio 2022용 배포 템플릿에는 1.2 스키마 버전이 필요합니다. 1.1 또는 1.0이어야 하는 경우 배포가 생성될 때까지 기다립니다(deployment.debug.template.json에서 변경하지 마세요). 배포를 만들면 기본적으로 1.2 스키마가 생성됩니다. 그러나 Azure에 배포하기 전에 필요한 경우 생성된 매니페스트 deployment.amd64.debug.json을 수동으로 변경할 수 있습니다.

    Important

    IoT Edge 디바이스가 배포되면 현재 스키마 버전 1.2로는 Azure Portal에서 올바르게 표시되지 않습니다(버전 1.1은 괜찮음). 이는 알려진 버그이며 곧 수정될 예정입니다. 그러나 디바이스는 여전히 IoT Hub에서 연결되어 있으며 언제든지 Azure CLI를 사용하여 통신할 수 있으므로 디바이스에 영향을 주지 않습니다.

    IoT Edge 디바이스 페이지의 Azure Portal 오류 스크린샷.

  4. 이제 Azure CLI 명령을 사용하여 매니페스트를 배포해 보겠습니다. Visual Studio 개발자 명령 프롬프트를 열고 config 디렉터리로 변경합니다.

        cd config
    
  5. IoT Edge 디바이스에 대한 매니페스트를 IoT Hub에 배포합니다. 명령은 솔루션에서 개발된 모듈을 사용하도록 디바이스를 구성합니다. 배포 매니페스트는 이전 단계에서 만들어졌고 config 폴더에 저장되었습니다. config 폴더에서 다음 배포 명령을 실행합니다. [device id], [hub name][file path]를 자신의 값으로 바꿉니다. IoT Edge에 IoT Edge 디바이스 ID가 없는 경우 만들어야 합니다.

        az iot edge set-modules --device-id [device id] --hub-name [hub name] --content [file path]
    

    예를 들어 명령은 다음과 같을 수 있습니다.

    az iot edge set-modules --device-id my-device-name --hub-name my-iot-hub-name --content deployment.amd64.debug.json
    
  6. 명령을 실행하면 명령 프롬프트에 JSON에서 인쇄된 배포 확인이 표시됩니다.

모듈 Docker 이미지 빌드

모듈을 개발한 후에는 모듈 이미지를 빌드하여 IoT Edge 디바이스에 배포하기 위해 컨테이너 레지스트리에 저장할 수 있습니다.

모듈의 Dockerfile을 사용하여 모듈 Docker 이미지를 빌드합니다.

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

예를 들어 명령 셸이 프로젝트 디렉터리에 있고 모듈 이름이 IotEdgeModule1이라고 가정해 보겠습니다. 로컬 레지스트리 또는 Azure 컨테이너 레지스트리에 대한 이미지를 빌드하려면 다음 명령을 사용합니다.

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

모듈 Docker 이미지 푸시

모듈 이미지를 로컬 레지스트리 또는 컨테이너 레지스트리에 푸시합니다.

docker push <ImageName>

예시:

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

모듈을 IoT Edge 디바이스에 배포합니다.

Visual Studio의 기본 프로젝트에서 deployment.debug.template.json 배포 매니페스트 파일을 엽니다. 배포 매니페스트는 대상 IoT Edge 디바이스에 구성할 모듈을 설명하는 JSON 문서입니다. 배포하기 전에 Azure Container Registry 자격 증명, 모듈 이미지, 적절한 createOptions 값을 업데이트해야 합니다. createOption 값에 대한 자세한 내용은 IoT Edge 모듈에 대한 컨테이너 만들기 옵션 구성 방법을 참조하세요.

  1. Azure Container Registry를 사용하여 모듈 이미지를 저장하는 경우 edgeAgent 설정의 deployment.debug.template.json에 자격 증명을 추가해야 합니다. 예를 들면 다음과 같습니다.

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. image 속성 값을 레지스트리에 푸시한 모듈 이미지 이름으로 바꿉니다. 예를 들어 사용자 지정 모듈 IotEdgeModule1myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 태그가 지정된 이미지를 푸시한 경우 image 속성 값을 태그 값으로 바꿉니다.

  3. createOptions 값을 배포 템플릿의 각 시스템 및 사용자 지정 모듈에 대해 문자열화된 콘텐츠로 추가하거나 바꿉니다.

    예를 들어 IotEdgeModule1의 imagecreateOptions 설정은 다음과 유사합니다.

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

IoT Edge Azure CLI set-modules 명령을 사용하여 모듈을 Azure IoT Hub에 배포합니다. 예를 들어 deployment.debug.amd64.json 파일에 정의된 모듈을 IoT Edge 디바이스 my-device에 대한 my-iot-hub에 배포하려면 다음 명령을 사용합니다.

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

Azure Portal에서 Azure IoT Hub 보안 설정공유 액세스 정책에서 IoT Hub 연결 문자열을 찾을 수 있습니다.>>

디바이스에 대한 배포 확인

IoT Edge 모듈이 Azure에 배포되었는지 확인하려면 예를 들어 SSH 또는 Azure Bastion을 통해 디바이스(또는 가상 머신)에 로그인하고 IoT Edge list 명령을 실행합니다.

   iotedge list

디바이스 또는 가상 머신에서 실행되는 모듈 목록이 표시됩니다.

   NAME                        STATUS           DESCRIPTION      CONFIG
   SimulatedTemperatureSensor  running          Up a minute      mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0
   edgeAgent                   running          Up a minute      mcr.microsoft.com/azureiotedge-agent:1.2
   edgeHub                     running          Up a minute      mcr.microsoft.com/azureiotedge-hub:1.2
   IotEdgeModule1              running          Up a minute      myacr.azurecr.io/iotedgemodule1:0.0.1-amd64.debug
   myIotEdgeModule2            running          Up a minute      myacr.azurecr.io/myiotedgemodule2:0.0.1-amd64.debug

Docker 원격 SSH를 사용하여 디버그

Docker 및 Moby 엔진은 컨테이너에 대한 SSH 연결을 지원하여 Visual Studio를 사용하여 원격 디바이스에서 코드를 연결하고 디버그할 수 있습니다.

  1. Docker에 원격으로 연결하려면 루트 수준 권한이 필요합니다. 루트가 아닌 사용자로 docker 관리의 단계에 따라 원격 디바이스에서 Docker 디먼에 대한 연결을 허용합니다. 디버깅을 마치면 Docker 그룹에서 사용자를 제거할 수 있습니다.

  2. Visual Studio를 사용하여 원격 디바이스의 Docker 컨테이너에서 실행되는 프로세스에 연결하는 단계를 수행합니다.

  3. Visual Studio에서 중단점을 사용자 지정 모듈에 설정합니다.

  4. 중단점에 도달하면 변수를 검사하고, 코드를 단계별로 실행하고, 모듈을 디버그할 수 있습니다.

    중단점에서 일시 중지된 디바이스의 원격 Docker 컨테이너에 연결된 Visual Studio의 스크린샷.

다음 단계