Fornecer acesso de módulos ao armazenamento local de um dispositivo

Aplica-se a:IoT Edge 1.4 checkmark 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 IoT Edge.

Para maior confiabilidade, especialmente ao operar offline, os módulos do IoT Edge podem usar o armazenamento no próprio dispositivo IoT Edge host.

Configurar módulos do sistema para usar o armazenamento persistente

Por padrão, os módulos do sistema, o agente e o hub do IoT Edge armazenam o estado no sistema de arquivos efêmero da respectiva instância de contêiner. Esse estado é perdido quando a instância do contêiner é reciclada, por exemplo, quando ocorre uma atualização na versão da imagem do módulo ou em createOptions.

Para cenários de produção, use um local de armazenamento persistente no sistema de arquivos host a fim de armazenar o estado do módulo do sistema. Isso melhora a robustez da solução e as garantias de entrega de mensagens na nuvem.

Para configurar módulos do sistema a fim de usar o armazenamento persistente:

  1. Tanto para o hub IoT Edge como para o agente IoT Edge, adicione uma variável de ambiente chamada StorageFolder que aponta para um diretório no módulo.

  2. Para o hub do IoT Edge e o agente do IoT Edge, adicione associações para conectar um diretório local no computador host em um diretório no módulo. Por exemplo:

    Screenshot that shows how to add create options and environment variables for local storage.

    Substitua <HostStoragePath>e<ModuleStoragePath> pelo caminho de armazenamento do host e do módulo. Ambos os valores devem ser um caminho absoluto e <HostStoragePath> deve existir.

Você pode configurar o armazenamento local diretamente no manifesto de implantação. Por exemplo, se você quiser mapear os seguintes caminhos de armazenamento:

Módulo Caminho de armazenamento do host Caminho de armazenamento do módulo
edgeAgent /srv/edgeAgent /tmp/edgeAgent
edgeHub /srv/edgeHub /tmp/edgeHub

Seu manifesto de implantação seria semelhante ao seguinte:

"systemModules": {
    "edgeAgent": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeAgent"
            }
        },
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeAgent:/tmp/edgeAgent\"]}}"
        },
        "type": "docker"
    },
    "edgeHub": {
        "env": {
            "StorageFolder": {
                "value": "/tmp/edgeHub"
            }
        },
        "restartPolicy": "always",
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/srv/edgeHub:/tmp/edgeHub\"],\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
        },
        "status": "running",
        "type": "docker"
    }
}

Observação

Se você estiver usando uma instalação instantânea, certifique-se de escolher um caminho de armazenamento do host que seja acessível aos snaps. Por exemplo, $HOME/snap/azure-iot-edge/current/modules/.

Gerenciamento automático de permissões do sistema host

Na versão 1.4 e mais recente, não há necessidade de definir manualmente a propriedade ou as permissões do armazenamento host que faz backup do StorageFolder. As permissões e a propriedade são gerenciadas automaticamente pelos módulos do sistema durante a inicialização.

Observação

O gerenciamento automático de permissões do armazenamento host vinculado se aplica apenas aos módulos do sistema, ao agente do IoT Edge e ao hub do Edge. Para módulos personalizados, o gerenciamento manual de permissões e propriedade do armazenamento do host vinculado será necessário se o contêiner do módulo personalizado não estiver sendo executado como root usuário.

Se o módulo personalizado requerer acesso ao armazenamento persistente no sistema de arquivos host, use as opções de criação do módulo para vincular uma pasta de armazenamento no contêiner do módulo a uma pasta no computador host. Por exemplo:

{
  "HostConfig": {
    "Mounts": [
      {
        "Target": "<ModuleStoragePath>",
        "Source": "<HostStoragePath>",
        "Type": "bind",
        "ReadOnly": false
      }
    ]
  }
}

Substitua <HostStoragePath> e <ModuleStoragePath> pelo caminho de armazenamento do módulo e do host. Ambos os valores precisam ser um caminho absoluto. Confira a Especificação de montagem de mecanismo do Docker para obter detalhes da opção.

Permissões do sistema de host

Certifique-se de que o perfil de usuário que o módulo está usando tenha as permissões de leitura, gravação e execução necessárias para o diretório do sistema host. Por padrão, os contêineres são executados com o usuário root que já tem as permissões necessárias. No entanto, o Dockerfile do módulo pode especificar o uso de um usuário não raiz, caso em que as permissões do armazenamento host devem ser configuradas manualmente.

Há várias maneiras de gerenciar permissões de diretório em sistemas Linux, incluindo usar chown para alterar o proprietário do diretório e, em seguida, chmod para alterar as permissões. Por exemplo, a fim de permitir o acesso ao armazenamento host para um módulo em execução como a ID de usuário não raiz 1000, use os seguintes comandos:

sudo chown 1000 <HostStoragePath>
sudo chmod 700 <HostStoragePath>

Dados criptografados no armazenamento de módulo

Quando os módulos invocam a API de carga de trabalho do daemon do IoT Edge para criptografar dados, a chave de criptografia é derivada usando o ID de módulo e o ID de geração do módulo. Um ID de geração é usado para proteger os segredos se um módulo for removido da implantação e outro módulo com o mesma ID de módulo for implantado posteriormente no mesmo dispositivo. É possível ver a ID de geração de um módulo usando o comando da CLI do Azure az iot hub module-identity show.

Se você quiser compartilhar arquivos entre os módulos em todas as gerações, eles não poderão conter segredos, caso contrário, não serão descriptografados.

Próximas etapas

Para obter um exemplo adicional de acesso ao armazenamento de host de um módulo, confira Armazenar dados na borda com o Armazenamento de Blobs do Azure no IoT Edge.