Tutorial: criar uma hierarquia de dispositivos IoT Edge

Aplica-se a:marca de seleção do IoT Edge 1.4 IoT Edge 1.4

Importante

A versão com suporte é a IoT Edge 1.4. Se você estiver em uma versão anterior, confira Atualizar o Azure IoT Edge.

Você pode implantar nós da Azure IoT Edge em redes organizadas em níveis hierárquicos. 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.

Você pode estruturar 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 upstream e downstream adjacentes. Essa disposição em camadas da rede é a base da maioria das redes industriais, que seguem o padrão ISA-95.

Esse tutorial explica como criar uma hierarquia de dispositivos do IoT Edge, implantar contêineres do runtime do IoT Edge nos seus dispositivos e configurar os 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, você poderá seguir a amostra 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 do IoT Edge, confira o guia de instruções sobre as hierarquias de gateway do dispositivo do 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.

Estrutura da hierarquia do tutorial contendo dois dispositivos: o dispositivo de camada superior e o dispositivo de camada inferior

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 do IoT Edge, será necessário:

  • Um computador (Windows ou Linux) com conectividade com a Internet.

  • 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.

  • Um shell Bash no Azure Cloud Shell usando a CLI do Azure com a extensão Internet das Coisas do Azure 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 Linux para configurar sua hierarquia. Caso não tenha dispositivos disponíveis, será possível criar máquinas virtuais do Azure para cada dispositivo na hierarquia usando o modelo do Resource Manager do Azure IoT Edge. A versão 1.4 do IoT Edge é pré-instalada com esse modelo do Resource Manager. Se você estiver instalando o IoT Edge em seus dispositivos, confira Instalar o Azure IoT Edge para Linux ou Atualizar o IoT Edge.

  • Para simplificar a comunicação de rede entre os dispositivos, as máquinas virtuais devem estar na mesma rede virtual ou usar o emparelhamento de rede virtual.

  • 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.

    Para obter mais informações, confira Como abrir as portas de uma máquina virtual com o portal do Azure.

    Dica

    Você usa o identificador SSH e o FQDN ou o endereço IP de cada máquina virtual para configuração em etapas posteriores, portanto, mantenha essas informações sempre à mão. Você encontra o endereço IP e o FQDN no portal do Azure. Para o endereço IP, navegue até a sua lista de máquinas virtuais e anote o campo endereço IP público. Para o FQDN, vá para a página de visão geral de cada máquina virtual e procure o campo nome DNS. Para o identificador SSH, acesse a página conectar de cada máquina virtual.

Criar a hierarquia de dispositivos do 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.

  1. 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.

  2. 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.

  3. 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 são diferentes entre um dispositivo de camada superior e um dispositivo de camada inferior. Portanto, tenha sempre em mente qual arquivo de configuração de dispositivo você está aplicando a cada dispositivo.

  1. Copie cada arquivo morto do pacote de configuração para seu dispositivo correspondente. Você pode usar uma unidade USB, um serviço como o Azure Key Vault ou uma função como uma Cópia de arquivo segura. Escolha entre esses métodos aquele que melhor corresponde ao seu cenário.

    Por exemplo, para enviar o pacote de configuração parent-1 para o diretório base na VM parent-1, você pode usar um comando como o seguinte exemplo:

    scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~
    
  2. Em cada dispositivo, extraia o arquivo do pacote de configuração. Por exemplo, use o comando tar para extrair o arquivo morto parent-1:

    tar -xzf ./parent-1.tgz
    
  3. Defina a permissão de execução para o script de instalação.

    chmod +x install.sh
    
  4. Em cada dispositivo, aplique o pacote de configuração ao dispositivo usando a permissão raiz:

    sudo ./install.sh
    

    A instalação dos pacotes de configuração atualiza os arquivos config.toml no dispositivo e reinicia todos os serviços do IoT Edge automaticamente

    Se você quiser uma análise mais detalhada de quais modificações estão sendo feitas no arquivo de configuração do dispositivo, confiraConectar dispositivos do Azure IoT Edge em conjunto para criar uma hierarquia.

Para verificar se os dispositivos estão configurados corretamente, execute as verificações de configuração e conectividade em seus dispositivos.

sudo iotedge check
admin@child-1-vm:~$ sudo iotedge check

Configuration checks (aziot-identity-service)
---------------------------------------------
√ keyd configuration is well-formed - OK
√ certd configuration is well-formed - OK
√ tpmd configuration is well-formed - OK
√ identityd configuration is well-formed - OK
√ daemon configurations up-to-date with config.toml - OK
√ identityd config toml file specifies a valid hostname - OK
√ host time is close to reference time - OK
√ preloaded certificates are valid - OK
√ keyd is running - OK
√ certd is running - OK
√ identityd is running - OK
√ read all preloaded certificates from the Certificates Service - OK
√ read all preloaded key pairs from the Keys Service - OK
√ check all EST server URLs utilize HTTPS - OK
√ ensure all preloaded certificates match preloaded private keys with the same ID - OK

Connectivity checks (aziot-identity-service)
--------------------------------------------
√ host can connect to and perform TLS handshake with iothub AMQP port - OK
√ host can connect to and perform TLS handshake with iothub HTTPS / WebSockets port - OK
√ host can connect to and perform TLS handshake with iothub MQTT port - OK

Configuration checks
--------------------
√ aziot-edged configuration is well-formed - OK
√ configuration up-to-date with config.toml - OK
√ container engine is installed and functional - OK
√ configuration has correct parent_hostname - OK
√ configuration has correct URIs for daemon mgmt endpoint - OK
√ container time is close to host time - OK
‼ DNS server - Warning
    Container engine is not configured with DNS server setting, which may impact connectivity to IoT Hub.
    Please see https://aka.ms/iotedge-prod-checklist-dns for best practices.
    You can ignore this warning if you are setting DNS server per module in the Edge deployment.
‼ production readiness: logs policy - Warning
    Container engine is not configured to rotate module logs which may cause it run out of disk space.
    Please see https://aka.ms/iotedge-prod-checklist-logs for best practices.
    You can ignore this warning if you are setting log policy per module in the Edge deployment.
‼ production readiness: Edge Agent's storage directory is persisted on the host filesystem - Warning
    The edgeAgent module is not configured to persist its /tmp/edgeAgent directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
‼ production readiness: Edge Hub's storage directory is persisted on the host filesystem - Warning
    The edgeHub module is not configured to persist its /tmp/edgeHub directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
√ Agent image is valid and can be pulled from upstream - OK
√ proxy settings are consistent in aziot-edged, aziot-identityd, moby daemon and config.toml - OK

Connectivity checks
-------------------
√ container on the default network can connect to upstream AMQP port - OK
√ container on the default network can connect to upstream HTTPS / WebSockets port - OK
√ container on the IoT Edge module network can connect to upstream AMQP port - OK
√ container on the IoT Edge module network can connect to upstream HTTPS / WebSockets port - OK
30 check(s) succeeded.
4 check(s) raised warnings. Re-run with --verbose for more details.
2 check(s) were skipped due to errors from other checks. Re-run with --verbose for more details.

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.

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.

É possível executar iotedge check em uma hierarquia aninhada, mesmo que os computadores 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.

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:

  1. Entre no portal do Azure e selecione Grupos de recursos.

  2. Selecione o nome do grupo de recursos que contém os recursos de teste do IoT Edge.

  3. 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ê efetuou pull de uma imagem de contêiner para o dispositivo downstream por meio de um gateway usando o módulo do proxy da 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.