Tutorial: criar uma hierarquia de dispositivos IoT Edge usando IoT Edge para Linux no Windows
Aplica-se a: IoT Edge 1.4
Importante
Azure IoT Edge 1.5 LTS e IoT Edge 1.4 são versões com suporte. O IoT Edge 1.4 LTS está chegando ao fim do serviço em 12/11/2024. Se você estiver em uma versão anterior, confira Atualizar o IoT Edge.
Você pode implantar nós do Azure IoT Edge em redes organizadas em camadas hierárquicas. Cada camada em uma hierarquia é um dispositivo de gateway que processa as mensagens e as solicitações de dispositivos na camada abaixo dele. Essa configuração também é conhecida como borda aninhada.
Estruture uma hierarquia de dispositivos para que apenas a camada superior tenha conectividade com a nuvem e as camadas inferiores só possam se comunicar com as camadas norte e sul adjacentes. Essa camada de rede é a base da maioria das redes industriais, que seguem o padrão ISA-95.
Este tutorial explica como criar uma hierarquia de dispositivos da IoT Edge usando o IoT Edge para Linux no Windows, implantar contêineres do runtime da IoT Edge nos seus dispositivos e configurar seus dispositivos localmente. Você realizará as seguintes tarefas:
- Criar e definir as relações em uma hierarquia de dispositivos IoT Edge.
- Configurar o runtime do IoT Edge nos dispositivos da sua hierarquia.
- Instalar certificados consistentes na hierarquia de dispositivos.
- Adicionar cargas de trabalho aos dispositivos da hierarquia.
- Use o módulo de Proxy de API do IoT Edge para rotear o tráfego HTTP com segurança em uma porta única de dispositivos de camada inferior.
Dica
Este tutorial inclui uma combinação de etapas manuais e automatizadas para fornecer uma demonstração dos recursos aninhados de IoT Edge.
Caso queira obter uma visão totalmente automatizada da configuração de uma hierarquia de dispositivos do IoT Edge, guie seu próprio script com base no o exemplo com script do Azure IoT Edge para o IoT Industrial. Esse cenário com script implantará máquinas virtuais do Azure como dispositivos pré-configurados para simular um ambiente de fábrica.
Se você quiser uma análise detalhada das etapas manuais para criar e gerenciar uma hierarquia de dispositivos IoT Edge, confira o guia de instruções sobre hierarquias de gateway do dispositivo IoT Edge.
Neste tutorial, as seguintes camadas de rede são definidas:
Camada superior: os dispositivos IoT Edge dessa camada podem se conectar diretamente à nuvem.
Camadas inferiores: os dispositivos do IoT Edge que estão em camada abaixo da camada superior não podem se conectar diretamente à nuvem. Eles precisam passar por um ou mais dispositivos IoT Edge intermediários para enviar e receber dados.
Este tutorial usa uma hierarquia de dois dispositivos para simplificar. O dispositivo de nível superior representa um dispositivo no nível superior da hierarquia que pode se conectar diretamente à nuvem. Esse dispositivo é chamado de dispositivo pai. O dispositivo de nível inferior representa um dispositivo no nível inferior da hierarquia que não pode se conectar diretamente à nuvem. Você pode adicionar mais dispositivos para representar seu ambiente de produção, conforme necessário. Os dispositivos nos níveis inferiores são chamados de dispositivos filho.
Observação
Um dispositivo filho pode ser um dispositivo de downstream ou um dispositivo de gateway em uma topologia aninhada.
Pré-requisitos
Para criar uma hierarquia de dispositivos da IoT Edge, você precisa fazer o seguinte:
- Um shell do Bash no Azure Cloud Shell usando a CLI do Azure v2.3.1 com a extensão do Azure IoT v0.10.6 ou superior instalada. Este tutorial usa o Azure Cloud Shell. Execute o comando az version para conferir as versões atuais de módulos e extensões da CLI do Azure.
- Dois dispositivos do Windows que executam o Azure IoT Edge para Linux no Windows. Ambos os dispositivos devem ser implantados usando um comutador virtual externo.
Dica
É possível usar o comutador virtual interno ou padrão se um encaminhamento de porta estiver configurado no sistema operacional host do Windows. No entanto, para simplificar este tutorial, ambos os dispositivos devem usar um comutador virtual externo e estar conectados à mesma rede externa.
Para obter mais informações sobre rede, consulte Azure IoT Edge para o Linux na rede do Windows e Configuração de rede para Azure IoT Edge para Linux no Windows.
Se você precisar configurar os dispositivos EFLOW em um DMZ, consulte Como configurar o Azure IoT Edge para Linux no Windows Industrial IoT e configuração DMZ.
- Uma conta do Azure com uma assinatura válida. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
- Um Hub IoT gratuito ou da camada Standard no Azure.
- Verifique se as seguintes portas estão abertas para entrada em todos os dispositivos, exceto o dispositivo de camada mais baixa: 443, 5671 e 8883:
- 443: usado entre hubs de borda pai e filho para chamadas à API REST e pull das imagens de contêiner do Docker.
- 5671, 8883: Usado para AMQP e MQTT.
Dica
Para obter mais informações sobre o firewall de máquina virtual EFLOW, consulte Segurança do IoT Edge para Linux no Windows.
Configurar sua hierarquia de dispositivos da IoT Edge
Os dispositivos do IoT Edge compõem as camadas da hierarquia. Este tutorial criará uma hierarquia de dois dispositivos da IoT Edge: um dispositivo de nível superior e um dispositivo de nível inferior. Você pode criar mais dispositivos downstream conforme necessário.
Para criar e configurar sua hierarquia de dispositivos da IoT Edge, use o comando az iot edge devices create da CLI do Azure. Essa ferramenta simplifica a configuração da hierarquia automatizando e condensando várias etapas:
- Cria dispositivos no seu Hub IoT
- Define as relações pai-filho para autorizar a comunicação entre os dispositivos
- Aplica o manifesto de implantação a cada dispositivo
- Gera uma cadeia de certificados para cada dispositivo de modo a estabelecer uma comunicação segura entre eles
- Gera arquivos de configuração para cada dispositivo
Criar uma configuração de dispositivo
Você cria um grupo de dispositivos de borda aninhados que contém um dispositivo pai com um dispositivo filho. Neste tutorial, usamos amostras de manifestos de implantação básicos. Para outros exemplos de cenário, analise os modelos de exemplos de configuração.
Antes de usar o comando az iot edge devices create, você precisa definir o manifesto de implantação para os dispositivos dos níveis superior e inferior. Baixe a amostra do arquivo deploymentTopLayer.json no seu computador local.
O manifesto de implantação do dispositivo de nível superior define o módulo de Proxy da API da IoT Edge e declara a rota a partir do dispositivo de nível inferior para o Hub IoT.
Baixe a amostra do arquivo deploymentLowerLayer.json no seu computador local.
O manifesto de implantação do dispositivo de nível inferior inclui o módulo de sensor de temperatura simulado e declara a rota para o dispositivo de nível superior. Você pode ver na seção systemModules que os módulos de runtime estão definidos para efetuar pull a partir do $upstream:443, em vez do mcr.microsoft.com. O dispositivo de camada inferior envia as solicitações de imagem do Docker ao módulo do Proxy de API do IoT Edge na porta 443, pois não pode efetuar pull diretamente das imagens na nuvem. O outro módulo implantado no dispositivo de camada inferior, o módulo do Sensor de temperatura simulado, também faz sua solicitação de imagem para
$upstream:443
.Para obter mais informações sobre como criar um manifesto de implantação de nível inferior, confira Conectar dispositivos da Azure IoT Edge para criar uma hierarquia.
No Azure Cloud Shell, use o comando az iot edge devices create da CLI do Azure para criar dispositivos no Hub IoT e pacotes de configuração para cada dispositivo na sua hierarquia. Substitua os espaços reservados pelos valores adequados:
Espaço reservado Descrição <hub-name> O nome do seu Hub IoT. <config-bundle-output-path> O caminho da pasta na qual você deseja salvar os pacotes de configuração. <parent-device-name> O nome da ID do dispositivo pai de nível superior. <parent-deployment-manifest> O arquivo de manifesto da implantação do dispositivo pai. <parent-fqdn-or-ip> Nome de domínio totalmente qualificado (FQDN) ou endereço IP do dispositivo pai. <child-device-name> O nome da ID do dispositivo filho de nível inferior. <child-deployment-manifest> O arquivo de manifesto de implantação do dispositivo filho. <child-fqdn-or-ip> Nome de domínio totalmente qualificado (FQDN) ou endereço IP do dispositivo filho. az iot edge devices create \ --hub-name <hub-name> \ --output-path <config-bundle-output-path> \ --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \ --device id=<parent-device-name> \ deployment=<parent-deployment-manifest> \ hostname=<parent-fqdn-or-ip> \ --device id=child-1 \ parent=parent-1 \ deployment=<child-deployment-manifest> \ hostname=<child-fqdn-or-ip>
Por exemplo, o comando a seguir cria uma hierarquia de dois dispositivos da IoT Edge no Hub IoT. Um dispositivo de nível superior chamado parent-1 e um dispositivo de nível inferior chamado child-1.* O comando salva os pacotes de configuração para cada dispositivo no diretório de saída. O comando também gera certificados de teste autoassinados e os inclui no pacote de configuração. Os pacotes de configuração são instalados em cada dispositivo usando um script de instalação.
az iot edge devices create \ --hub-name my-iot-hub \ --output-path ./output \ --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \ --device id=parent-1 \ deployment=./deploymentTopLayer.json \ hostname=10.0.0.4 \ --device id=child-1 \ parent=parent-1 \ deployment=./deploymentLowerLayer.json \ hostname=10.1.0.4
Após executar o comando, você pode encontrar os pacotes de configuração do dispositivo no diretório de saída. Por exemplo:
PS C:\nested-edge\output> dir
Directory: C:\nested-edge\output
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 4/10/2023 4:12 PM 7192 child-1.tgz
-a--- 4/10/2023 4:12 PM 6851 parent-1.tgz
Você pode usar seus próprios certificados e chaves transmitidos como argumentos para o comando ou criar uma hierarquia de dispositivos mais complexa. Para obter mais informações sobre como criar dispositivos aninhados usando o comando az , confira az iot edge devices create. Se não estiver familiarizado com o modo como os certificados são usados em um cenário de gateway, confira a seção “certificado” do guia de instruções.
Neste tutorial, você usa argumentos embutidos para criar os dispositivos e pacotes de configuração. Você também pode usar um arquivo de configuração nos formatos YAML ou JSON. Para obter uma amostra de arquivo de configuração, confira o exemplo sample_devices_config.yaml.
Configurar o runtime do IoT Edge
Além do provisionamento dos dispositivos, as etapas de configuração estabelecem uma comunicação confiável entre os dispositivos da hierarquia usando os certificados criados anteriormente. As etapas também começam a estabelecer uma estrutura de rede da hierarquia. O dispositivo de nível superior manterá a conectividade com a internet, permitindo que efetue um pull de imagens da nuvem para o respectivo runtime, enquanto os dispositivos de nível inferior serão roteados através do dispositivo de nível superior para acessar essas imagens.
Para configurar o runtime da IoT Edge, você precisa aplicar os pacotes de configuração aos seus dispositivos. As configurações diferem um pouco entre um dispositivo de nível superior e um dispositivo de nível inferior, então tenha sempre em mente qual arquivo de configuração de dispositivo você está aplicando a cada dispositivo.
Cada dispositivo precisa do seu pacote de configuração correspondente. Você pode usar a unidade USB ou uma cópia de arquivo seguro para mover os pacotes de certificados para cada dispositivo. Você precisará copiar o pacote de configuração para o sistema operacional host do Windows de cada dispositivo da EFLOW e, a seguir, copiá-lo para a VM da EFLOW.
Aviso
Fique atento para enviar o pacote de configuração correto a cada dispositivo.
Configuração de dispositivo de camada superior
Conecte-se ao seu dispositivo host do Windows de nível superior e copie o arquivo parent-1.tzg para o dispositivo.
Inicie uma sessão com privilégios elevados do PowerShell usando Executar como Administrador.
Copie o parent-1.tzg para a VM da EFLOW.
Copy-EflowVmFile -fromFile parent-1.tzg -toFile ~/ -pushFile
Conecte-se à máquina virtual EFLO
Connect-EflowVm
Extraia o arquivo do pacote de configuração. Por exemplo, use o comando tar para extrair o arquivo parent-1 compactado:
tar -xzf ./parent-1.tgz
Defina a permissão de execução para o script de instalação.
chmod +x install.sh
Execute o script install.sh.
sudo sh ./install.sh
Aplique as permissões de certificado corretas e reinicie o runtime do IoT Edge.
sudo chmod -R 755 /etc/aziot/certificates/ sudo iotedge system restart
Verifique se todos os serviços IoT Edge estão sendo executados corretamente.
sudo iotedge system status
Por fim, adicione as regras de firewall apropriadas para habilitar a conectividade entre o dispositivo de camada inferior e o dispositivo de camada superior.
sudo iptables -A INPUT -p tcp --dport 5671 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 8883 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT sudo iptables-save | sudo tee /etc/systemd/scripts/ip4save
Execute a configuração e as verificações de conectividade nos dispositivos.
sudo iotedge check
No dispositivo de camada superior, você deverá ver uma saída com várias avaliações de passagem. Talvez você veja alguns avisos sobre políticas de logs e, dependendo da rede, políticas de DNS.
Se você quiser uma análise mais detalhada de quais modificações estão sendo feitas no arquivo de configuração do dispositivo, confira a seção Configurar IoT Edge nos dispositivos do guia de instruções.
Configuração do dispositivo de camada superior
Conecte-se ao seu dispositivo host do Windows de nível inferior e copie o arquivo child-1.tzg para o dispositivo.
Inicie uma sessão com privilégios elevados do PowerShell usando Executar como Administrador.
Copie o child-1.tzg para a VM da EFLOW.
Copy-EflowVmFile -fromFile child-1.tzg -toFile ~/ -pushFile
Conecte-se à máquina virtual EFLO
Connect-EflowVm
Extraia o arquivo do pacote de configuração. Por exemplo, use o comando tar para extrair o arquivo child-1 compactado:
tar -xzf ./child-1.tgz
Defina a permissão de execução para o script de instalação.
chmod +x install.sh
Execute o script install.sh.
sudo sh ./install.sh
Aplique as permissões de certificado corretas e reinicie o runtime do IoT Edge.
sudo chmod -R 755 /etc/aziot/certificates/ sudo iotedge system restart
Verifique se todos os serviços IoT Edge estão sendo executados corretamente.
sudo iotedge system status
Execute a configuração e as verificações de conectividade nos dispositivos. Para o dispositivo de camada inferior, a imagem de diagnóstico precisa ser passada manualmente no comando:
sudo iotedge check --diagnostics-image-name <parent_device_fqdn_or_ip>:443/azureiotedge-diagnostics:1.2
Se tiver executado as etapas acima corretamente, você poderá verificar se os seus dispositivos estão configurados corretamente. Quanto estiver satisfeito com as configurações corretas em cada dispositivo, você estará pronto para prosseguir.
Implantação do módulo do dispositivo
A implantação do módulo para seus dispositivos foi aplicada quando os dispositivos foram criados no Hub IoT. O comando az iot edge devices create aplicou os arquivos JSON de implantação para os dispositivos de níveis superior e inferior. Após essas implantações serem concluídas, o dispositivo de nível inferior usará o módulo de Proxy da API da IoT Edge para efetuar pull das imagens necessárias.
Além dos módulos de runtime Agente do IoT Edge e Hub do IoT Edge, o dispositivo de camada superior recebe o módulo de registro do Docker e o módulo do proxy de API do IoT Edge.
O módulo de registro do Docker aponta para um Registro de Contêiner do Azure existente. Nesse caso, REGISTRY_PROXY_REMOTEURL
aponta para o Microsoft Container Registry. Por padrão, o registro do Docker escuta a porta 5000.
O módulo do Proxy de API do IoT Edge roteia as solicitações HTTP para outros módulos, permitindo que dispositivos de camada inferior efetuem pull das imagens de contêiner ou efetuem push dos blobs para o armazenamento. Neste tutorial, ele se comunica na porta 443 e está configurado para enviar a rota de solicitações de pull da imagem de contêiner do Docker para o módulo do registro do Docker na porta 5000. Além disso, qualquer solicitação de upload do armazenamento de blobs é roteada para o módulo AzureBlobStorageonIoTEdge na porta 11002. Para obter mais informações sobre o módulo do Proxy de API do IoT Edge e como configurá-lo, confira o Guia de instruções do módulo.
Se você quiser ver como criar uma implantação como esta por meio do portal do Azure ou do Azure Cloud Shell, confira a seção Dispositivo de camada superior do guia de instruções.
Você pode visualizar o status dos seus módulos usando o comando:
az iot hub module-twin show --device-id <edge-device-id> --module-id '$edgeAgent' --hub-name <iot-hub-name> --query "properties.reported.[systemModules, modules]"
Esse comando vai gerar como resultados todas as propriedades relatadas do edgeAgent. Aqui estão algumas úteis para monitorar o status do dispositivo: status do runtime, hora de início do runtime, hora da última saída do runtime e contagem de reinicialização do runtime.
Você também pode ver o status dos seus módulos no portal do Azure. Navegue até a seção Dispositivos do Hub IoT para ver seus dispositivos e módulos.
Exibir os dados gerados
O módulo Sensor de Temperatura Simulado que você enviou por push gera dados de ambiente de exemplo. Ele envia mensagens que incluem temperatura ambiente e umidade, temperatura do computador e pressão e um carimbo de data/hora.
Você também pode ver essas mensagens por meio do Azure Cloud Shell:
az iot hub monitor-events -n <iot-hub-name> -d <lower-layer-device-name>
Por exemplo:
az iot hub monitor-events -n my-iot-hub -d child-1
{
"event": {
"origin": "child-1",
"module": "simulatedTemperatureSensor",
"interface": "",
"component": "",
"payload": "{\"machine\":{\"temperature\":104.29281270901808,\"pressure\":10.48905461241978},\"ambient\":{\"temperature\":21.086561171611102,\"humidity\":24},\"timeCreated\":\"2023-04-17T21:50:30.1082487Z\"}"
}
}
Solução de problemas
Execute o comando iotedge check
para verificar a configuração e solucionar os erros.
Você pode executar iotedge check
em uma hierarquia aninhada, mesmo que os dispositivos de downstream não tenham acesso direto à Internet.
Quando você executa iotedge check
por meio da camada inferior, o programa tenta efetuar pull da imagem do pai pela porta 443.
sudo iotedge check --diagnostics-image-name $upstream:443/azureiotedge-diagnostics:1.2
O valor de azureiotedge-diagnostics
é extraído do registro de contêiner que está vinculado ao módulo do Registro. Este tutorial o definiu por padrão para https://mcr.microsoft.com:
Nome | Valor |
---|---|
REGISTRY_PROXY_REMOTEURL |
https://mcr.microsoft.com |
Se você estiver usando um registro de contêiner privado, verifique se todas as imagens (IoTEdgeAPIProxy, edgeAgent, edgeHub, sensor de temperatura simulado e diagnóstico) estão presentes no registro de contêiner.
Se um dispositivo downstream tiver uma arquitetura de processador diferente do dispositivo pai, você precisará da imagem de arquitetura apropriada. Você pode usar um registro conectado ou especificar a imagem correta para os módulos EdgeAgent e EdgeHub no arquivo config.toml do dispositivo downstream. Por exemplo, se o dispositivo pai estiver em execução em uma arquitetura ARM32v7 e o dispositivo downstream estiver em execução em uma arquitetura AMD64, você precisará especificar a tag de imagem de versão e arquitetura correspondentes no arquivo config.toml do dispositivo downstream.
[agent.config]
image = "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
"systemModules": {
"edgeAgent": {
"settings": {
"image": "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
},
},
"edgeHub": {
"settings": {
"image": "$upstream:443/azureiotedge-hub:1.4.10-linux-amd64",
}
}
}
Limpar os recursos
Exclua as configurações locais e os recursos do Azure criados neste artigo para evitar custos.
Para excluir os recursos:
Entre no portal do Azure e selecione Grupos de recursos.
Selecione o nome do grupo de recursos que contém os recursos de teste do IoT Edge.
Reveja a lista de recursos contidos no grupo de recursos. Se você deseja excluir todos eles, selecione Excluir grupo de recursos. Se quiser excluir apenas alguns, clique em cada recurso para excluí-los individualmente.
Próximas etapas
Neste tutorial, você configurou dois dispositivos IoT Edge como gateways e definiu um deles como o dispositivo pai do outro. Em seguida, você demonstrou como efetuar pull de uma imagem de contêiner para o dispositivo filho por meio do módulo do Proxy de API do IoT Edge. Confira o Guia de instruções sobre o uso do módulo do proxy se você quiser saber mais.
Para saber mais sobre como usar gateways para criar níveis hierárquicos de dispositivos da IoT Edge, confira o artigo a seguir.