다음을 통해 공유


자습서: Windows에서 Linux용 IoT Edge를 사용하여 Linux 컨테이너를 사용하여 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 업데이트를 참조하세요.

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

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

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

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

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

필수 조건

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

시작하기 전에 다음을 수행하십시오.

  • Windows에 Linux용 IoT Edge를 설치 합니다.

  • Windows 디바이스에 첫 번째 IoT Edge 모듈 배포 빠른 시작을 읽어보세요.

  • .NET Core SDK다운로드합니다.

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

  • Visual Studio 2022 설치가 준비되면 Visual Studio Marketplace에서 Azure IoT Edge 도구를 다운로드하여 설치합니다.

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

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

  • Azure에서 무료 또는 표준 계층 IoT Hub 를 클라우드 리소스로 만듭니다.

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

주요 개념

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

IoT Edge 모듈을 개발할 때는 개발 머신과 모듈이 최종적으로 배포될 대상 IoT Edge 디바이스 간의 차이를 이해하는 것이 중요합니다. 모듈 코드를 포함하기 위해 빌드하는 컨테이너는 대상 디바이스의 OS(운영 체제)와 일치해야 합니다.

예를 들어 가장 일반적인 시나리오는 IoT Edge를 실행하는 Linux 디바이스를 대상으로 하는 Windows 컴퓨터에서 모듈을 개발하는 사람입니다. 이 경우 컨테이너 OS는 Linux입니다.

이 자습서를 진행할 때는 개발 머신 OS와 컨테이너 OS 간의 차이점에 유의해야 합니다. 이 자습서에서는 개발에 Windows 호스트를 사용하고, 모듈을 빌드하고 배포하기 위해 Windows VM(가상 머신)의 Linux용 IoT Edge를 사용합니다.

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

원격 연결에 대한 Docker CLI 및 Docker 엔진 설정

IoT Edge 모듈은 컨테이너로 패키지되므로, 개발 머신에 컨테이너 엔진을 빌드하고 관리해야 합니다.

Windows VM의 Linux용 IoT Edge에는 Docker 엔진의 인스턴스가 이미 포함되어 있습니다. 이 자습서에서는 Windows 개발자 컴퓨터에서 Windows VM Docker 인스턴스의 Linux용 IoT Edge로 원격으로 연결하는 방법을 보여 줍니다. 이 원격 연결을 사용하여 Windows용 Docker Desktop에 대한 종속성을 제거합니다.

Docker CLI 구성

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

  1. Chocolatey에서 미리 컴파일된 docker.exe 버전의 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 버전이 표시됩니다. Docker version 20.10.12, build e91ed57과 같이 표시됩니다.

Docker 엔진 구성

두 번째 단계는 외부 연결을 허용하도록 Windows VM Docker 엔진에서 Linux용 IoT Edge를 구성하고 적절한 방화벽 규칙을 추가하는 것입니다.

Warning

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

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

    # Configure the IoT Edge for Linux on Windows VM 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 IoT Edge for Linux on Windows 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 IoT Edge for Linux on Windows 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 IoT Edge for Linux on Windows 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 IoT Edge for Linux on Windows 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 IoT Edge for Linux on Windows 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
    

연결 테스트

최종 설치 단계는 Windows VM Docker 엔진에서 Linux용 IoT Edge에 대한 Docker 연결을 테스트하는 것입니다.

  1. Windows VM에서 Linux용 IoT Edge의 IP 주소를 가져옵니다.

    Get-EflowVmAddr
    

    Windows VM의 Linux용 IoT Edge가 고정 IP 없이 배포된 경우 Windows 호스트 OS에서 IP 주소가 변경되거나 네트워크 변경이 발생할 수 있습니다. Docker 엔진에 대한 원격 연결을 설정할 때마다 Windows VM에서 Linux용 IoT Edge에 올바른 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 
    
  2. Windows VM Docker 엔진에서 Linux용 IoT Edge에 연결하고 샘플 컨테이너를 hello-world 실행합니다. 이전 단계에서 얻은 Windows VM IP 주소의 Linux용 IoT Edge로 바꿉 <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're 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의 IoT Edge 프로젝트 구조와 다릅니다.

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

  1. Visual Studio에서 시작 페이지에서 새 프로젝트 만들기를 선택하거나 도구 모음에서 새 프로젝트 단추를 선택하여 새 프로젝트를 만듭니다.

  2. 새 프로젝트 만들기 페이지에서 Azure IoT Edge를 검색합니다. IoT Edge 디바이스에 대한 플랫폼(Linux IoT Edge 모듈) 및 아키텍처와 일치하는 프로젝트를 선택한 다음, 다음을 선택합니다.

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

  4. 모듈 추가 대화 상자에서 개발하려는 모듈 유형을 선택합니다. 기존 모듈을 선택하여 기존 IoT Edge 모듈을 배포에 추가할 수도 있습니다.

  5. 모듈 이름에서 모듈 이름을 지정합니다.

  6. 리포지토리 URL에서 모듈의 이미지 리포지토리 이름을 제공합니다. Visual Studio는 모듈 이름을 localhost:5000/<모듈 이름으로> 자동으로 채웁니다. 고유한 레지스트리 정보로 바꿉니다.

    테스트를 위해 로컬 Docker 레지스트리를 사용하는 경우 localhost를 사용합니다. Azure Container Registry를 사용하는 경우 레지스트리 설정의 로그인 서버를 사용합니다. 로그인 서버는 레지스트리 이름>.azurecr.io와 같이 표시됩니다.< 최종 결과가 registry name.azurecr.io/ your 모듈 이름>처럼 <보이도록 문자열의 localhost:5000 부분만 바꿉다.><

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

    Visual Studio 솔루션에 애플리케이션 및 모듈을 추가하기 위한 선택 항목의 스크린샷

    참고 항목

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

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

프로젝트 구조

솔루션에는 주 프로젝트 폴더와 모듈 폴더라는 두 개의 프로젝트 수준 폴더가 있습니다. 예를 들어 명명된 주 프로젝트 폴더와 이름이 AzureIotEdgeApp1IotEdgeModule1모듈 폴더가 있을 수 있습니다.

기본 프로젝트 폴더에는 배포 매니페스트가 포함됩니다. 배포 매니페스트는 대상 IoT Edge 디바이스에 구성할 모듈을 설명하는 JSON 문서입니다.

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

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

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

배포 템플릿에는 다음이 포함됩니다.

  • 두 런타임 모듈 및 edgeAgent edgeHub.
  • 이 Visual Studio 프로젝트에서 만든 사용자 지정 모듈입니다.
  • 라는 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 배포 매니페스트 파일을 엽니다.

  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 엔진 인스턴스 설정

Windows VM의 Linux용 IoT Edge 내에서 실행되는 원격 Docker 엔진을 사용하도록 Azure IoT Edge 도구 확장을 구성합니다.

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

  2. DOCKER_HOST localhost 값을 Windows VM의 Linux용 IoT Edge에 대한 IP 주소로 바꿉니다. IP 주소를 기억하지 못하는 경우 Windows PowerShell cmdlet Get-EflowVmAddr 에서 Linux용 IoT Edge를 사용하여 가져옵니다. 예를 들어 Windows VM IP 주소의 Linux용 IoT Edge가 172.20.1.100인 경우 새 값은 tcp://172.20.1.100:2375 합니다.

    IoT Edge 도구 설정 스크린샷.

  3. 확인을 선택합니다.

모듈 개발

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

기본 솔루션에서 모듈의 시뮬레이션된 데이터는 SimulatedTemperatureSensor 모듈로 라우팅됩니다. 모듈은 입력을 받아서 Azure IoT Hub로 보냅니다.

사용자 고유의 코드로 모듈 템플릿을 사용자 지정할 준비가 되면 Azure IoT Hub SDK를 사용하여 IoT 솔루션의 주요 요구 사항을 해결하는 다른 모듈을 빌드합니다. 이러한 요구 사항에는 보안, 디바이스 관리 및 안정성이 포함될 수 있습니다.

단일 모듈 빌드 및 푸시

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

  1. 솔루션 탐색기 모듈 프로젝트 폴더(예: myIotEdgeModule)를 선택합니다.

  2. 사용자 지정 모듈 프로젝트를 시작 프로젝트로 설정합니다. 메뉴에서 프로젝트 집합을 시작 프로젝트>로 선택합니다.

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

    참고 항목

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

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

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

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

    SSH 키를 만드는 PowerShell 명령의 스크린샷

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

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

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

          "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 디바이스를 마우스 오른쪽 단추로 클릭하고 배포 만들기를 선택합니다. 플랫폼에 대해 구성된 디버그 배포 매니페스트로 이동합니다. Visual Studio 솔루션의 폴더에 config 있습니다(예: deployment.amd64.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 .

배포하기 전에 Azure Container Registry 자격 증명, 모듈 이미지, 적절한 createOptions 값을 업데이트해야 합니다. 값에 대한 createOption 자세한 내용은 IoT Edge 모듈에 대한 컨테이너 만들기 옵션을 구성하는 방법을 참조 하세요.

  1. Azure 컨테이너 레지스트리를 사용하여 모듈 이미지를 저장하는 경우 설정에 자격 증명을 deployment.debug.template.json edgeAgent 추가합니다. 예시:

    "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 속성 값을 레지스트리에 푸시한 모듈 이미지 이름으로 바꿉 있습니다. 예를 들어 사용자 지정 모듈IotEdgeModule1에 태그가 지정된 이미지를 푸시한 myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 경우 이미지 속성 값을 태그 값으로 바꿉다.

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

    예를 들어 설정 image 및 설정 IotEdgeModule1 은 다음 예제와 createOptions 유사합니다.

    "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\"}]}}}"
    }
    
  4. IoT Edge Azure CLI set-modules 명령을 사용하여 모듈을 Azure IoT Hub에 배포합니다. 예를 들어 파일에 정의된 deployment.debug.amd64.json 모듈을 IoT Edge 디바이스my-device의 IoT Hub 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>연결 문자열 찾을 수 있습니다.

  5. 클라우드 탐색기에서 에지 디바이스를 마우스 오른쪽 단추로 $edgeAgent 클릭하고 새로 고침을 수행하여 새 모듈이 실행 중인지 확인합니다$edgeHub.

솔루션 디버그

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

    1. moduleId Linux C# 모듈의 이름을 기반으로 값을 가져옵니다. <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. Windows VM의 Linux용 IoT Edge에서 모듈의 SSH 포트를 엽니다. (이 자습서에서는 포트 10022를 사용합니다.)

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

    Warning

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

  2. SSH 서비스를 성공적으로 시작한 후 프로세스에 연결 디버그>를 선택하고, 연결 유형을 SSH설정하고, Windows VM에서 Linux용 IoT Edge의 IP 주소로 연결 대상을 설정합니다. Windows VM에서 Linux용 IoT Edge의 IP 주소를 모르는 경우 PowerShell cmdlet을 Get-EflowVmAddr 사용할 수 있습니다.

    IP를 입력한 다음 Enter 키를 선택합니다. 팝업 창에서 다음 구성을 입력합니다.

    필드
    Hostname Windows VM에서 Linux용 IoT Edge의 IP 주소
    포트 10022 (또는 배포 구성에서 사용한 항목)
    사용자 이름 root
    인증 유형 프라이빗 키
    프라이빗 키 파일 이전 단계에서 만든 값의 id_rsa 전체 경로
    암호 이전 단계에서 만든 키에 사용된 암호
  3. SSH를 사용하여 모듈에 성공적으로 연결한 후 프로세스를 선택하고 연결을 선택할 수 있습니다. C# 모듈의 경우 프로세스 dotnetManaged에 연결(CoreCLR)선택해야 합니다. 처음 10~20초가 걸릴 수 있습니다.

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

    • C#에서 개발하는 경우 함수ModuleBackgroundService.cs의 중단점을 PipeMessage() 설정합니다.
    • C를 사용하는 경우 함수main.c의 중단점을 InputQueue1Callback() 설정합니다.
  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 모듈을 배포하고 디버그했습니다. 이제 기본 개념을 알고 있으므로 모듈을 통과하는 데이터를 분석할 수 있도록 모듈에 기능을 추가해 보세요.