Acceso de los módulos al almacenamiento local de un dispositivo

Se aplica a:IoT Edge 1.4 checkmark IoT Edge 1.4

Importante

IoT Edge 1.4 es la versión admitida. Si está usando una versión anterior, consulte Actualización de IoT Edge.

Los módulos de IoT Edge pueden usar el almacenamiento del propio dispositivo IoT que actúa como host para mejorar la confiabilidad, especialmente cuando se trabaja sin conexión.

Configuración de módulos del sistema para usar almacenamiento persistente

De forma predeterminada, los módulos del sistema de IoT Edge, el agente de IoT Edge y el centro de IoT Edge almacenan el estado en el sistema de archivos efímero de su instancia de contenedor. Este estado se pierde cuando se recicla la instancia de contenedor, por ejemplo, cuando se actualiza la versión de imagen del módulo o createOptions.

En escenarios de producción, use una ubicación de almacenamiento persistente en el sistema de archivos host para almacenar el estado del módulo del sistema. De esta forma se mejora la solidez de la solución y las garantías de entrega de mensajes en la nube.

Para configurar módulos del sistema para usar el almacenamiento persistente:

  1. Tanto para el centro de IoT Edge como para el agente de IOT Edge, agregue una variable de entorno denominada StorageFolder que apunte a un directorio en el módulo.

  2. Tanto para el centro de IoT Edge como para el agente de IoT Edge, agregue enlaces para conectar un directorio local de la máquina host a un directorio del módulo. Por ejemplo:

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

    Reemplace <HostStoragePath> y <ModuleStoragePath> por la ruta de acceso de almacenamiento del host y del módulo. Ambos valores deben ser una ruta de acceso absoluta y <HostStoragePath> deben existir.

Puede configurar el almacenamiento local directamente en el manifiesto de implementación. Por ejemplo, si desea asignar las siguientes rutas de acceso de almacenamiento:

Módulo Ruta de acceso de almacenamiento del host Ruta de acceso de almacenamiento del módulo
edgeAgent /srv/edgeAgent /tmp/edgeAgent
edgeHub /srv/edgeHub /tmp/edgeHub

Su manifiesto de implementación sería similar al siguiente:

"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"
    }
}

Nota:

Si usa una instalación de instantáneas, asegúrese de elegir una ruta de acceso de almacenamiento de host a la que se pueda acceder a los ajustes. Por ejemplo, $HOME/snap/azure-iot-edge/current/modules/.

Administración automática de permisos del sistema host

En la versión 1.4 y posteriores, no es necesario establecer manualmente la propiedad ni los permisos para el almacenamiento del host que respalda StorageFolder. Los módulos del sistema administran automáticamente los permisos y la propiedad durante el inicio.

Nota:

La administración automática de permisos del almacenamiento enlazado al host solo se aplica a los módulos del sistema, el agente de IoT Edge y el centro de Edge. En el caso de los módulos personalizados, se requiere la administración manual de permisos y la propiedad del almacenamiento host enlazado si el contenedor de módulos personalizados no se ejecuta como usuario root.

Si el módulo personalizado requiere acceso a almacenamiento persistente en el sistema de archivos host, use las opciones de creación del módulo para enlazar una carpeta de almacenamiento en el contenedor de módulos a una carpeta de la máquina host. Por ejemplo:

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

Reemplace <HostStoragePath> y <ModuleStoragePath> por las rutas de almacenamiento de su host y de su módulo; ambos valores deben ser una ruta de acceso absoluta. Consulte la especificación de montaje del motor de Docker para información sobre las opciones.

Permisos del sistema host

Asegúrese de que el perfil de usuario del módulo esté usando los permisos de lectura, escritura y ejecución necesarios para el directorio del sistema host. De forma predeterminada, los contenedores se ejecutan como usuario root que ya tiene los permisos necesarios. Sin embargo, el archivo Dockerfile del módulo podría especificar el uso de un usuario no raíz, en cuyo caso se deben configurar manualmente los permisos de almacenamiento del host.

Hay varias maneras de administrar los permisos de directorio en los sistemas Linux; entre otros, usar chown para cambiar el propietario del directorio y, luego, chmod para cambiar los permisos. Por ejemplo, para permitir el acceso del almacenamiento del host a un módulo que se ejecuta como identificador de usuario no raíz 1000, use los siguientes comandos:

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

Datos cifrados en el almacenamiento de módulos

Cuando los módulos invocan la API de carga de trabajo del demonio de IoT Edge para cifrar datos, la clave de cifrado se deriva mediante el id. de módulo y el id. de generación del módulo. Un id. de generación se usa para proteger los secretos si se quita un módulo de la implementación y, posteriormente, se implementa otro módulo con el mismo id. de módulo en el mismo dispositivo. Puede ver el identificador de generación de un módulo mediante el comando az iot hub module-identity show de la CLI de Azure.

Si quiere compartir archivos entre módulos de varias generaciones, no debe contener ningún secreto o se podrá descifrar.

Pasos siguientes

Para ver otro ejemplo de acceso a almacenamiento host desde un módulo, consulte Almacenamiento de datos en el perímetro con Azure Blob Storage en IoT Edge.