Azure IoT Edge 통합 테스트 템플릿 - 1부

17236 단어

요약



이것은 Azure IoT Edge 통합 템플릿을 소개하는 기사 시리즈의 일부입니다 - azure-iot-edge-integration-test-template . 이번 Part.1에서는 Infrastructure as Code와 통합 테스트를 포함한 전체 파이프라인에 대해 설명하겠습니다. Part.2에서는 각 IoT Edge 모듈에 대한 정보를 제공하고 Part.3에서는 IoT Edge 매니페스트 생성기에 대해 공유합니다.



  • 목차


  • Overview
  • Architecture
  • Test steps

  • Infrastructure deployment
  • Network Security Group - inbound Port 22
  • VM domain name label
  • IoT Hub consumer group


  • Setup and installation
  • VM Service Connection
  • Blob Contributor Role


  • Code deployment and test execution
  • edge-module.yml
  • test-prep.yml
  • test-execution.yml
  • test-cleanup.yml


  • 개요

    When you have multiple Azure IoT Edge modules on an edge device and want to update codes of one of those modules, you can make sure the code quality by implementing linter and unit tests, but it is difficult to validate communications among modules. That is why executing integration tests every time you update the software.



    이 템플릿에서는 Azure Virtual Machine의 테스트 환경에서 Azure IoT Edge 모듈의 통합 테스트를 실행할 수 있습니다. 테스트 절차는 Azure Pipelines에서 모두 자동화됩니다. 이 템플릿을 활용하여 에지 장치에 코드를 배포하기 전에 통합 테스트를 배포하고 실행합니다.



    건축물

    This template includes six IoT Edge sample modules - FileGenerator , FileUpdater , FileUploader , IothubConnector , WeatherObserverLocalBlobStorage . IoT Edge 모듈에 대한 자세한 내용은 에 설명되어 있습니다.



    테스트 단계

    You need to execute three steps, 1) Infrastructure deployment, 2) Setup and installation, and 3) Code deployment and test execution. Everything to know to run this template is described in Getting-started 하지만 해당 파이프라인에 대한 세부 사항과 중요한 사항을 안내하겠습니다.



    인프라 구축

    Azure resources needed for this template are defined in main.bicep Azure Pipelines에서 iac.yml의 IaC(Infrastructure as Code) 파이프라인을 실행할 수 있습니다.



    네트워크 보안 그룹 - 인바운드 포트 22

    main.bicep은 포트 22를 여는 네트워크 보안 그룹 인바운드 규칙을 정의합니다. 이는 다음 단계에서 Azure IoT Edge를 설치할 때 SSH를 통해 VM에 액세스하고 Azure Pipelines 에이전트가 VM의 디렉토리를 설정하고 test-prep.yml에서 디렉토리 액세스 권한을 부여합니다.

    properties: {
      securityRules: [
        {
          name: 'SSH'
          properties: {
            protocol: 'Tcp'
            sourcePortRange: '*'
            destinationPortRange: '22'
            sourceAddressPrefix: '*'
            destinationAddressPrefix: '*'
            access: 'Allow'
            priority: 100
            direction: 'Inbound'
          }
        }
      ]
    }
    


    VM 도메인 이름 레이블

    Setting up the domain name label for the VM is important because IP Address is dynamically allocated and Azure Pipelines agent accesses with VM Service Connection descrited in Create SSH Service Connection .

    호스트 이름은 edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com 이어야 하며 main.bicep 에 정의되어 있습니다.

    var dns_label = 'edge-${base_name}'
    
    resource PublicIp 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
      name: public_ip_name
      location: location
      sku: {
        name: 'Basic'
      }
      properties: {
        publicIPAllocationMethod: 'Dynamic'
        publicIPAddressVersion: 'IPv4'
        dnsSettings: {
          domainNameLabel: dns_label
        }
        idleTimeoutInMinutes: 4
      }
    }
    


    IoT Hub 소비자 그룹

    It is better to create consumer groups IoT Hub. 통합 테스트 오류를 ​​일으키는 Azure IoT Hub Explorer과 같은 다른 도구를 통해 IoT Hub에서 메시지를 사용하려는 경우. main.bicep 통합 테스트를 실행하는 Azure Pipelines 에이전트 전용 소비자 그룹을 배포합니다.

    param iothub_cg_name string
    resource IoTHubConsumerGroup 'Microsoft.Devices/IotHubs/eventHubEndpoints/ConsumerGroups@2021-07-02' = {
      name: '${IoTHub.name}/events/${iothub_cg_name}'
      properties:{
        name: iothub_cg_name
      }
    }
    


    설정 및 설치

    VM 서비스 연결

    In this template, it uses SSH service connection . ssh testuser@edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com 와 같은 bash 명령을 사용할 수 있습니다. Azure Pipelines 태스크retryCountOnTaskFailure를 결합하여 SSH의 불안정한 연결 오류를 처리할 수 있습니다.

    Blob 기여자 역할

    You need to set up manually Storage Blob Data Contributor of Azure built-in roles Azure 구독에 연결된 Azure RBAC의 Azure Pipelines 에이전트는 Blob Storage의 SAS 토큰을 생성할 수 있습니다. Azure 구독 소유자 또는 사용자 액세스 관리자 역할이 필요합니다.

    az role assignment create `
        --role "Storage Blob Data Contributor" `
        --assignee {Object ID of Azure Service Connection} `
        --scope "/subscriptions/{Azure Subscription ID}/resourceGroups/rg-{BASE_NAME}/providers/Microsoft.Storage/storageAccounts/st{BASE_NAME}"
    




    코드 배포 및 테스트 실행

    에지 모듈.yml

  • Call this template with each IoT Edge module. This builds and pushes container images to Azure Container Registry.

  • Use not Azure Pipeline Docker task 하지만 Docker Registry service connection을 수동으로 생성할 필요가 없기 때문에 docker 명령이 필요합니다. Azure Pipelines가 Azure Container Registry 키를 추출하고 빌드하고 푸시하는 프로세스는 모두 자동화되어 있습니다.

  • acrkey=$(az acr credential show --name $(ACR_NAME) --query passwords[0].value -o tsv)
    cd ${{ parameters.dockerfileDirectory }}
    docker login -u $(ACR_NAME) -p $acrkey $(ACR_NAME).azurecr.io
    docker build --rm -f Dockerfile -t $(ACR_NAME).azurecr.io/${{ parameters.repositoryName }}:$(Build.BuildNumber) .
    docker push $(ACR_NAME).azurecr.io/${{ parameters.repositoryName }}:$(Build.BuildNumber)
    


    테스트 준비.yml

    • Call this template with IoT Edge modules as parameters. The parameters are used for iterative tasks that check if module images exist in Azure Container Registry and each module is running on IoT Edge runtime.
    - template: ./templates/test-prep.yml
      parameters:
        azureSvcName: $(AZURE_SVC_NAME)
        vmSshSvcName: $(VM_SVC_NAME)
        EdgeImages:
          module1:
            name: IothubConnector
            repository: iothub-connector
            tag: $(Build.BuildNumber)
          module2:
            name: WeatherObserver
            repository: weather-observer
            tag: $(Build.BuildNumber)
          module3:
            name: FileGenerator
            repository: file-generator
            tag: $(Build.BuildNumber)
          module4:
            name: FileUploader
            repository: file-uploader
            tag: $(Build.BuildNumber)
          module5:
            name: FileUpdater
            repository: file-updater
            tag: $(Build.BuildNumber)
    
  • SSH task
  • Remove /edge directory to refresh the leftover of past test executions.
  • Grant read, write, and execute permissions to the host machine directory. Azure IoT Edge Hub with UID 1000 and Azure IoT Edge local blob storage with user ID 11000 and user group ID 11000 .
  • Host system permissions
  • Granting directory access to container user on Linux
  • 로그에 호스트 시스템 디렉토리를 표시할 수 있도록 tree 명령을 설치합니다.
  • 현재 모듈이 바인드 마운트를 구현하는 디렉터리를 삭제했기 때문에 Azure IoT Edge 런타임을 다시 시작합니다. 모듈과 디렉터리 간의 연결을 새로 고치려면 런타임을 다시 시작해야 합니다. 그렇지 않으면 오류가 발생합니다.


  • if [ -d "/edge" ]
    then
      sudo rm -r /edge
    fi
    
    sudo mkdir -p $(FILE_UPLOADER_DIR)
    sudo chown -R 1000 $(FILE_UPLOADER_DIR)
    sudo chmod -R 700 $(FILE_UPLOADER_DIR)
    
    sudo mkdir -p $(FILE_UPDATER_DIR)
    sudo chown -R 1000 $(FILE_UPDATER_DIR)
    sudo chmod -R 700 $(FILE_UPDATER_DIR)
    
    sudo mkdir -p $(LOCAL_BLOB_STORAGE_DIR)
    sudo chown -R 11000:11000 $(LOCAL_BLOB_STORAGE_DIR)
    sudo chmod -R 700 $(LOCAL_BLOB_STORAGE_DIR)
    
    sudo apt-get install tree
    tree /edge
    
    sudo iotedge system restart
    


    테스트 실행.yml

    • Use acynchronous bash method & so the Azure Pipelines agent sends a direct method request to IoT Hub and at the same time listens to messages on IoT Hub sent from IoT Edge modules. --timeout is currently set 30 sec. Sometimes the response from IoT Edge is slow and they do not respond and cause errors. 30 seconds is probably is good time to wait. If it is longer than 30 seconds, something is going wrong on Edge modules.
    az iot hub invoke-module-method --hub-name $(IOTHUB_NAME) --device-id $(IOTHUB_DEVICE_ID) --module-id IothubConnector --method-name request_weather_report --method-payload '{"city": "Tokyo"}' &
    testResult=$(az iot hub monitor-events --hub-name $(IOTHUB_NAME) --device-id $(IOTHUB_DEVICE_ID) --module-id IothubConnector --cg $(IOTHUB_CONSUMER_GROUP) --timeout 30 -y)
    


    테스트 정리.yml

    • Remove all directory but keep the blob container weather
    az storage blob directory delete --account-name $(STORAGE_ACCOUNT_NAME) --container-name $(BLOB_CONTAINER_NAME) --directory-path $(TEST_ORGANIZATION_NAME) --recursive
    

    좋은 웹페이지 즐겨찾기