자습서: IoT Edge for Linux on Windows를 사용하여 Linux 컨테이너로 IoT Edge 모듈 개발

적용 대상:IoT Edge 1.4 확인 표시 IoT Edge 1.4

Important

IoT Edge 1.5 LTS 및 IoT Edge 1.4는 지원되는 릴리스입니다. IoT Edge 1.4 LTS는 2024년 11월 12일에 수명이 종료됩니다. 이전 릴리스에 있는 경우 IoT Edge 업데이트를 참조하세요.

이 자습서에서는 IoT Edge for Linux on Windows 및 Visual Studio 2022를 사용하여 사용자 고유의 코드를 개발, 디버깅 및 IoT Edge 디바이스에 배포하는 방법을 안내합니다. Linux 디바이스에 C# 모듈을 배포하여 IoT Edge 솔루션에 대한 가장 일반적인 개발자 시나리오를 알아봅니다. Windows(EFLOW)의 Linux 컨테이너에서 실행되는 사용자 지정 Azure IoT Edge 모듈을 배포하고 디버그합니다. 다른 언어를 사용하거나 Azure 서비스를 배포하려는 경우에도 이 자습서는 개발 도구 및 개념에 대해 알아보는 데 유용합니다.

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

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

도구 버전을 선택하려면 이 문서의 시작 부분에 있는 도구 선택기 단추를 사용합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 개발 머신을 설정합니다.
  • Visual Studio Code용 IoT Edge 도구를 사용하여 새 프로젝트를 만듭니다.
  • 프로젝트를 컨테이너로 빌드하고 Azure Container Registry에 저장합니다.
  • IoT Edge 디바이스에 코드를 배포합니다.

필수 조건

이 문서에서는 Windows를 실행하는 컴퓨터를 개발 컴퓨터로 사용한다고 가정합니다. Windows 컴퓨터에서는 Windows 또는 Linux 모듈을 개발할 수 있습니다. 이 자습서에서는 모듈을 빌드하고 배포하기 위해 IoT Edge for Linux on Windows를 사용하여 Linux 컨테이너 개발 과정을 안내합니다.

Visual Studio 2022가 준비되면 다음 도구와 구성 요소도 필요합니다.

  • 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 마켓플레이스에서 VS 2019용 Azure IoT Edge Tools를 다운로드하여 설치합니다.

클라우드 리소스:

  • Azure의 무료 또는 표준 계층 IoT Hub입니다.

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

주요 개념

이 자습서는 IoT Edge 모듈 개발 과정을 안내합니다. IoT Edge 모듈 또는 경우에 따라 간단히 모듈이라고 하는 이 기능은 실행 코드가 있는 컨테이너입니다. 하나 이상의 모듈을 IoT Edge 디바이스에 배포할 수 있습니다. 모듈은 센서에서 데이터 수집, 데이터 정리 및 분석 또는 IoT 허브로 메시지 보내기 등의 특정 작업을 수행합니다. 자세한 내용은 Azure IoT Edge 모듈 이해를 참조하세요.

IoT Edge 모듈을 개발할 때 개발 머신과 모듈을 결과적으로 배치할 대상 IoT Edge 디바이스 간의 차이를 이해하는 것이 중요합니다. 모듈 코드를 포함하기 위해 빌드하는 컨테이너는 대상 디바이스의 OS(운영 체제)와 일치해야 합니다. 예를 들어, 가장 일반적인 시나리오는 Windows 머신에서 IoT Edge를 실행하는 Linux 디바이스 대상의 모듈을 개발하는 경우입니다. 이 경우 컨테이너 운영 체제는 Linux일 것입니다. 이 자습서를 진행할 때는 개발 머신 OS컨테이너 OS 간의 차이점에 유의해야 합니다. 이 자습서에서는 개발을 위해 Windows 호스트를 사용하고 모듈을 빌드하고 배포하기 위해 IoT EFLOW(Edge for Linux on Windows) VM을 사용합니다.

이 자습서는 Linux 컨테이너에서 IoT Edge를 실행하는 디바이스를 대상으로 합니다. 개발 머신이 Linux 컨테이너를 실행하는 한 선호하는 운영 체제를 사용할 수 있습니다. Visual Studio를 사용하여 Linux 컨테이너로 개발하는 것이 좋으므로 이 자습서에서 이를 사용합니다. 지원 차이점이 있지만 Visual Studio Code를 사용할 수도 있습니다. 자세한 내용은 Visual Studio Code를 사용하여 Azure IoT Edge 모듈 개발을 참조하세요.

docker-cli 및 Docker 엔진 원격 연결 설정

IoT Edge 모듈은 컨테이너로 패키지되므로, 개발 머신에 컨테이너 엔진을 빌드하고 관리해야 합니다. EFLOW 가상 머신에는 이미 Docker 엔진 인스턴스가 포함되어 있으므로 이 자습서에서는 Windows 개발자 컴퓨터에서 EFLOW VM Docker 인스턴스로 원격으로 연결하는 방법을 보여줍니다. 이를 사용하여 Windows용 Docker Desktop에 대한 종속성을 제거합니다.

첫 번째 단계는 원격 Docker 엔진에 연결할 수 있도록 Windows 개발 컴퓨터에서 docker-cli를 구성하는 것입니다.

  1. docker-cli Chocolatey에서 미리 컴파일된 docker.exe 버전의 docker-cli를 다운로드합니다. docker/cli GitHub에서 공식 cli 프로젝트를 다운로드하고 리포지토리 지침에 따라 컴파일할 수도 있습니다.
  2. 개발 컴퓨터의 디렉터리에 docker.exe 압축을 풉니다. C:\Docker\bin 디렉터리를 예로 들 수 있습니다.
  3. PC 정보 ->시스템 정보 ->고급 시스템 설정을 엽니다.
  4. 고급 ->환경 변수를 선택하고 >사용자 변수에서 경로를 선택합니다.
  5. Path 변수를 편집하고 docker.exe의 위치를 추가합니다.
  6. 승격된 PowerShell 세션 열기
  7. 명령을 사용하여 Docker CLI에 액세스할 수 있는지 확인합니다.
    docker --version
    

모든 항목이 성공적으로 구성되면 이전 명령은 Docker version 20.10.12, build e91ed57과 같은 docker 버전을 출력합니다.

두 번째 단계는 외부 연결을 허용하도록 EFLOW 가상 머신 Docker 엔진을 구성하고 적절한 방화벽 규칙을 추가하는 것입니다.

Warning

Docker 엔진을 외부 연결에 노출하면 보안 위험이 증가할 수 있습니다. 이 구성은 개발 목적으로만 사용해야 합니다. 개발이 완료된 후 구성을 기본 설정으로 되돌려야 합니다.

  1. 관리자 권한 PowerShell 세션을 열고 다음 명령을 실행합니다.

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    예제 출력은 다음과 같습니다.

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. 마지막 단계는 EFLOW VM Docker 엔진에 대한 Docker 연결을 테스트하는 것입니다. 먼저 EFLOW VM IP 주소가 필요합니다.

    Get-EflowVmAddr
    

    EFLOW VM이 고정 IP 없이 배포된 경우 Windows 호스트 OS가 재부팅되거나 네트워킹이 변경될 때 IP 주소가 변경될 수 있습니다. 원격 Docker 엔진 연결을 설정할 때마다 올바른 EFLOW VM IP 주소를 사용하고 있는지 확인합니다.

    예제 출력은 다음과 같습니다.

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. 가져온 IP 주소를 사용하여 EFLOW VM Docker 엔진에 연결하고 Hello-World 샘플 컨테이너를 실행합니다. <EFLOW-VM-IP>를 이전 단계에서 가져온 EFLOW VM IP 주소로 바꿉니다.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    컨테이너가 다운로드되고 있으며 이후에 실행되어 다음이 출력됩니다.

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

Azure IoT Edge 프로젝트 만들기

Visual Studio의 IoT Edge 프로젝트 템플릿은 IoT Edge 디바이스에 배포할 수 있는 솔루션을 만듭니다. 먼저 Azure IoT Edge 솔루션을 만든 다음, 이 솔루션에서 첫 번째 모듈을 생성합니다. 각 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 디바이스의 플랫폼(Linux IoT Edge 모듈) 및 아키텍처와 일치하는 프로젝트를 선택하고 다음을 선택합니다.

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

  4. 모듈 추가 창에서 개발할 모듈 유형을 선택합니다. 기존 모듈을 선택하여 기존 IoT Edge 모듈을 배포에 추가할 수도 있습니다. 모듈 이름과 모듈 이미지 리포지토리를 지정합니다.

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

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

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

    참고 항목

    기존 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.4입니다. IoT Edge 런타임 버전을 안정적인 최신 릴리스 또는 디바이스의 대상으로 지정할 버전으로 업데이트해야 합니다.

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

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

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

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

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

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

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

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

Visual Studio 2022 원격 Docker 엔진 인스턴스 설정

Azure IoT Edge 도구 확장을 사용하고 EFLOW 가상 머신 내에서 실행되는 원격 Docker 엔진을 사용하도록 구성합니다.

  1. 도구 ->Azure IoT Edge 도구 ->IoT Edge 도구 설정...을 선택합니다.

  2. DOCKER_HOST localhost 값을 EFLOW VM IP 주소로 바꿉니다. IP 주소가 기억나지 않는 경우 EFLOW PowerShell cmdlet Get-EflowVmAddr을 사용하여 가져옵니다. 예를 들어 EFLOW VM IP 주소가 172.20.1.100이면 새 값은 tcp://172.20.1.100:2375여야 합니다.

    IoT Edge 도구 설정 스크린샷.

  3. 확인을 선택합니다.

모듈 개발

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

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

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

단일 모듈 빌드 및 푸시

여러 모듈이 포함된 전체 솔루션 내에서 실행하기 전데 모듈을 각각 테스트 및 디버그하는 것이 일반적입니다. 솔루션은 EFLOW VM 내에서 실행되는 Docker 엔진을 사용하여 빌드 또는 디버그되므로 첫 번째 단계는 원격 디버깅을 사용할 수 있게 모듈을 빌드하고 게시하는 것입니다.

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

  2. C# Linux 모듈을 디버그하려면 SSH 서비스를 사용하도록 Dockerfile.amd64.debug 파일을 업데이트해야 합니다. 원격 디버그 지원이 있는 Azure IoT Edge AMD64 C# 모듈용 Dockerfile 템플릿을 사용하도록 Dockerfile.amd64.debug 파일을 업데이트합니다.

    참고 항목

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

    Warning

    템플릿의 마지막 줄인 ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"]에서 DLL 이름이 IoT Edge 모듈 프로젝트의 이름과 일치하는지 확인합니다.

    Dockerfile 템플릿 설정 스크린샷.

  3. Linux 모듈과의 SSH 연결을 설정하려면 RSA 키를 만들어야 합니다. 관리자 권한 PowerShell 세션을 열고 다음 명령을 실행하여 새 RSA 키를 만듭니다. RSA 키를 동일한 IoT Edge 모듈 폴더 아래에 저장하고 키 이름으로 id_rsa를 사용합니다.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    SSH 키를 만드는 방법 스크린샷.

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

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. 솔루션 탐색기에서 프로젝트 폴더를 마우스 오른쪽 단추로 클릭한 다음, IoT Edge 모듈 빌드 및 푸시를 선택하여 각 모듈의 Docker 이미지를 빌드하고 푸시합니다.

  2. Azure Container Registry 같은 프라이빗 레지스트리를 사용할 경우, deployment.template.json 파일에 있는 런타임 설정에 레지스트리 로그인 정보를 추가해야 합니다. 자리 표시자를 실제 ACR 관리 사용자 이름, 암호 및 레지스트리 이름으로 바꿉니다.

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

    참고 항목

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

  3. 모듈 SSH 서비스에 액세스하려면 포트 22를 노출해야 합니다. 이 자습서에서는 10022를 호스트 포트로 사용하지만 Linux C# 모듈에 연결하는 SSH 포트로 사용되는 다른 포트를 지정할 수 있습니다. 파일 deployment.debug.template.json에 있는 이 Linux 모듈 설정의 "createOptions"에 SSH 포트 정보를 추가해야 합니다.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. 솔루션 탐색기에서 프로젝트 폴더를 마우스 오른쪽 단추로 클릭하고 IoT Edge에 대한 배포 생성을 선택하여 새 IoT Edge 배포 json을 빌드합니다.

  5. 보기>클라우드 탐색기를 클릭하여 클라우드 탐색기를 엽니다. Visual Studio 2019에 로그인되었는지 확인합니다.

  6. 클라우드 탐색기에서 구독을 펼쳐서 배포하려는 Azure IoT Hub 및 Azure IoT Edge 디바이스를 찾습니다.

  7. IoT Edge 디바이스를 마우스 오른쪽 단추로 클릭하고 배포 만들기를 선택합니다. deployment.amd64.json과 같이 Visual Studio 솔루션의 config 폴더에 있는 플랫폼에 대해 구성된 디버그 배포 매니페스트로 이동합니다.

모듈 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 연결 문자열을 찾을 수 있습니다.>>

  1. 클라우드 탐색기에서 에지 디바이스를 마우스 오른쪽 단추로 클릭하고 새로 고쳐 $edgeAgent$edgeHub 모듈과 함께 실행되는 새 모듈을 확인합니다.

솔루션 디버그

  1. 관리자 권한 PowerShell 세션을 사용하여 다음 명령 실행

    1. Linux C# 모듈에 사용되는 이름을 기준으로 moduleId를 가져옵니다. <iot-edge-module-name> 자리 표시자를 모듈 이름으로 바꿔야 합니다.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. $moduleId가 올바른지 확인 - 변수가 비어 있는 경우 올바른 모듈 이름을 사용하고 있는지 확인

    3. Linux 컨테이너 내에서 SSH 서비스 시작

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. EFLOW VM에서 모듈 SSH 포트를 엽니다(이 자습서에서는 포트 10022 사용).

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    Warning

    보안상의 이유로 EFLOW VM이 다시 부팅될 때마다 IP 테이블 규칙이 삭제되고 원래 설정으로 돌아갑니다. 또한 모듈 SSH 서비스를 수동으로 다시 시작해야 합니다.

  2. SSH 서비스를 성공적으로 시작한 후 디버그 ->프로세스에 연결을 선택하고 연결 유형을 SSH로 설정하고 연결 대상을 EFLOW VM의 IP 주소로 설정합니다. EFLOW VM IP를 모르는 경우 Get-EflowVmAddr PowerShell cmdlet을 사용할 수 있습니다. 먼저 IP를 입력한 다음, Enter 키를 누릅니다. 팝업 창에서 다음 구성을 입력합니다.

    필드
    Hostname EFLOW VM IP 사용
    포트 10022(또는 배포 구성에서 사용한 항목)
    사용자 이름 root
    인증 유형 프라이빗 키
    프라이빗 키 파일 이전 단계에서 만든 id_rsa에 대한 전체 경로
    암호 이전 단계에서 만든 키에 사용된 암호

    원격 시스템에 연결하는 방법의 스크린샷.

  3. SSH를 사용하여 모듈에 성공적으로 연결한 후 프로세스를 선택하고 연결을 선택할 수 있습니다. C# 모듈의 경우 프로세스 dotnet 및 연결 대상 관리됨(CoreCLR)을 선택해야 합니다. 처음에는 10~20초 정도 걸릴 수 있습니다.

    에지 모듈 프로세스를 연결하는 방법의 스크린샷.

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

    • C#으로 개발하는 경우 ModuleBackgroundService.csPipeMessage() 함수에 중단점을 설정합니다.
    • C를 사용하는 경우 main.cInputQueue1Callback() 함수에 중단점을 설정합니다.
  5. SimulatedTemperatureSensor의 출력은 사용자 지정 Linux C# 모듈의 input1으로 리디렉션되어야 합니다. 중단점이 트리거됩니다. Visual Studio 로컬 창에서 변수를 확인할 수 있습니다.

    단일 모듈을 디버그하는 방법의 스크린샷.

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

리소스 정리

권장되는 다음 문서를 계속 진행하려는 경우 만든 리소스와 구성을 그대로 유지하고 다시 사용할 수 있습니다. 테스트 디바이스와 동일한 IoT Edge 디바이스를 계속 사용해도 됩니다.

그렇지 않은 경우 요금이 발생하지 않도록 이 문서에서 사용한 로컬 구성 및 Azure 리소스를 삭제할 수 있습니다.

Azure 리소스 삭제

Azure 리소스와 리소스 그룹을 삭제하면 되돌릴 수 없습니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 해야 합니다. 보관하려는 리소스가 있는 기존 리소스 그룹 내에 IoT 허브를 만든 경우 리소스 그룹이 아닌 IoT 허브 리소스만 삭제해야 합니다.

리소스를 삭제하려면:

  1. Azure Portal에 로그인한 다음, 리소스 그룹을 선택합니다.

  2. IoT Hub 테스트 리소스가 포함된 리소스 그룹 이름을 선택합니다.

  3. 리소스 그룹에 포함된 리소스의 목록을 검토합니다. 모든 항목을 삭제하려는 경우리소스 그룹 삭제를 선택할 수 있습니다. 일부만 삭제하려는 경우 각 리소스를 클릭하여 개별적으로 삭제할 수 있습니다.

다음 단계

이 자습서에서는 개발 머신에 Visual Studio를 설치하고 첫 번째 IoT Edge 모듈을 배포 및 디버그했습니다. 기본 개념을 파악했으므로 전달된 데이터를 분석할 수 있게 모듈에 기능을 추가해 보세요.