Azure IoT Edge 통합 테스트 템플릿 - 1부
요약
이것은 Azure IoT Edge 통합 템플릿을 소개하는 기사 시리즈의 일부입니다 - azure-iot-edge-integration-test-template . 이번 Part.1에서는 Infrastructure as Code와 통합 테스트를 포함한 전체 파이프라인에 대해 설명하겠습니다. Part.2에서는 각 IoT Edge 모듈에 대한 정보를 제공하고 Part.3에서는 IoT Edge 매니페스트 생성기에 대해 공유합니다.
목차
Infrastructure deployment
Setup and installation
Code deployment and test execution
개요
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 , WeatherObserver 및 LocalBlobStorage . 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.
테스트 단계
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.
네트워크 보안 그룹 - 인바운드 포트 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.
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.
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)
/edge
directory to refresh the leftover of past test executions.UID 1000
and Azure IoT Edge local blob storage with user ID 11000
and user group ID 11000
.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
Reference
이 문제에 관하여(Azure IoT Edge 통합 테스트 템플릿 - 1부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/koheikawata/azure-iot-edge-integration-test-template-part1-3911
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
&
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)
- 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
Reference
이 문제에 관하여(Azure IoT Edge 통합 테스트 템플릿 - 1부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/koheikawata/azure-iot-edge-integration-test-template-part1-3911텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)