Anatomía de la imagen dorada - AWS Guía prescriptiva

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Anatomía de la imagen dorada

AWS IoT Greengrass Los dispositivos principales que se fabrican a escala suelen ser dispositivos Linux integrados que tienen una distribución de Linux creada con herramientas como Yocto. Por lo general, el entorno de ejecución de Greengrass Edge está integrado en la distribución, como lo demuestra el proyecto Meta AWS.

Estos dispositivos suelen tener su sistema de archivos organizado en varias particiones. Esta guía utiliza la imagen dorada como un término general. Es posible que su dispositivo tenga varias imágenes doradas para mostrar las distintas particiones.

La imagen dorada puede abarcar la totalidad del sistema de archivos del dispositivo o solo una parte de él. Esta guía se centra en las partes del sistema de archivos que debe tener en cuenta AWS IoT Greengrass, sin especificar cómo ensamblar las imágenes de manera más amplia.

Árbol de directorios de Greengrass

Para entender los métodos de imagen dorada descritos en esta guía, revise la estructura del árbol de directorios de Greengrass que se muestra en la siguiente tabla.

Directorio

Descripción

alts

Parámetros de lanzamiento y enlaces simbólicos a la versión núcleo de Greengrass que está activa actualmente.

bin

Binarios, si hay alguno instalado (por ejemplo, el binario CLI de Greengrass si ese componente está instalado). Este directorio suele estar vacío.

cli_ipc_info

Scratchpad para la comunicación entre procesos (IPC) CLI de Greengrass. Este directorio está vacío si no ha instalado la CLI de Greengrass.

config

Toda la configuración de Greengrass, incluida la configuración de los componentes.

deployments

Datos para gestionar el estado de las implementaciones y las reversiones.

logs

Archivos de registro del núcleo y otros componentes.

packages

Artefactos y recetas para todos los componentes.

plugins

Almacenamiento para los componentes del tipo aws.greengrass.plugin que ha instalado manualmente. De lo contrario, este directorio no contiene datos.

telemetry

Scratchpad utilizado por Greengrass para agregar datos de telemetría listos para su publicación.

work

Bloc de notas para componentes.

Los work directorios logstelemetry, y contienen solo datos efímeros. No es necesario incluirlos en una imagen dorada, así que omítelos si quiere minimizar el tamaño de la imagen.

La CLI de Greengrass no suele instalarse en los dispositivos de producción, por lo que los cli_ipc_info directorios bin y suelen estar vacíos y, por lo general, no es necesario incluirlos en una imagen dorada.

El plugins directorio incluye datos solo si instaló manualmente un complemento (como el complemento de aprovisionamiento de flota o un complemento de aprovisionamiento personalizado) al instalar Greengrass.

Los datos del deployments directorio se usan solo cuando hay una implementación en curso y, por lo tanto, no son necesarios en una imagen completa.

Por lo tantoalts, los packages directorios config y son los de mayor interés. A veces, estos son los únicos directorios de Greengrass que hay que incluir en una imagen dorada si se quiere minimizar el tamaño de la imagen.

Contenido del directorio de paquetes

El directorio de paquetes tiene tres subdirectorios, como se muestra en la siguiente tabla.

Subdirectorio

Descripción

artifacts

Los artefactos de componentes comprimidos que Greengrass descarga durante las implementaciones.

artifacts-unarchived

En el caso de los artefactos .zip archivados, este directorio contiene los mismos artefactos, pero están descomprimidos para que los componentes puedan utilizar el contenido del artefacto.

recipes

Los archivos de recetas de los componentes.

artefactos

El siguiente ejemplo de lista en árbol packages/artifacts muestra cómo se almacenan los artefactos.

user@machine:~$ sudo tree /greengrass/v2/packages/artifacts /greengrass/v2/packages/artifacts ├── aws.greengrass.DockerApplicationManager ├── aws.greengrass.LogManager │ └── 2.3.7 │ └── aws.greengrass.LogManager.jar ├── aws.greengrass.Nucleus │ └── 2.12.6 │ └── aws.greengrass.nucleus.zip ├── aws.greengrass.SecretManager │ └── 2.1.8 │ └── aws.greengrass.SecretManager.jar ├── aws.greengrass.SecureTunneling │ └── 1.0.19 │ └── GreengrassV2SecureTunnelingComponent-1.0-all.jar ├── aws.greengrass.labs.CertificateRotator │ └── 1.1.0 │ └── certificate-rotator.zip ├── aws.greengrass.labs.HomeAssistant │ └── 1.0.0 │ └── home-assistant.zip └── aws.greengrass.telemetry.NucleusEmitter └── 1.0.8 └── aws.greengrass.telemetry.NucleusEmitter.jar 15 directories, 7 files

artefactos sin archivar

El siguiente ejemplo de lista en árbol packages/artifacts-unarchived muestra los artefactos que se extraen de los archivos. .zip

user@machine:~$ sudo tree /greengrass/v2/packages/artifacts-unarchived /greengrass/v2/packages/artifacts-unarchived ├── aws.greengrass.Nucleus │ └── 2.12.6 │ └── aws.greengrass.nucleus │ ├── LICENSE │ ├── NOTICE │ ├── README.md │ ├── THIRD-PARTY-LICENSES │ ├── bin │ │ ├── greengrass.exe │ │ ├── greengrass.service │ │ ├── greengrass.service.procd.template │ │ ├── greengrass.service.template │ │ ├── greengrass.xml.template │ │ ├── loader │ │ └── loader.cmd │ ├── conf │ │ └── recipe.yaml │ └── lib │ └── Greengrass.jar ├── aws.greengrass.SecureTunneling │ └── 1.0.19 ├── aws.greengrass.labs.CertificateRotator │ └── 1.1.0 │ └── certificate-rotator │ ├── __pycache__ │ │ ├── config.cpython-310.pyc │ │ ├── config.cpython-311.pyc │ │ ├── effective_config.cpython-310.pyc │ │ ├── effective_config.cpython-311.pyc │ │ ├── main.cpython-311.pyc │ │ ├── pki.cpython-310.pyc │ │ ├── pki.cpython-311.pyc │ │ ├── pki_file.cpython-310.pyc │ │ ├── pki_file.cpython-311.pyc │ │ ├── pki_hsm.cpython-310.pyc │ │ ├── pki_hsm.cpython-311.pyc │ │ ├── pubsub.cpython-310.pyc │ │ ├── pubsub.cpython-311.pyc │ │ ├── state.cpython-310.pyc │ │ ├── state.cpython-311.pyc │ │ ├── state_committing_certificate.cpython-310.pyc │ │ ├── state_committing_certificate.cpython-311.pyc │ │ ├── state_creating_certificate.cpython-310.pyc │ │ ├── state_creating_certificate.cpython-311.pyc │ │ ├── state_getting_job.cpython-310.pyc │ │ ├── state_getting_job.cpython-311.pyc │ │ ├── state_idle.cpython-310.pyc │ │ ├── state_idle.cpython-311.pyc │ │ ├── state_machine.cpython-310.pyc │ │ ├── state_machine.cpython-311.pyc │ │ ├── state_updating_job.cpython-310.pyc │ │ ├── state_updating_job.cpython-311.pyc │ │ ├── topic_base.cpython-310.pyc │ │ └── topic_base.cpython-311.pyc │ ├── config.py │ ├── effective_config.py │ ├── main.py │ ├── pki.py │ ├── pki_file.py │ ├── pki_hsm.py │ ├── pubsub.py │ ├── requirements.txt │ ├── scripts │ │ └── run.cmd │ ├── state.py │ ├── state_committing_certificate.py │ ├── state_creating_certificate.py │ ├── state_getting_job.py │ ├── state_idle.py │ ├── state_machine.py │ ├── state_updating_job.py │ └── topic_base.py └── aws.greengrass.labs.HomeAssistant └── 1.0.0 └── home-assistant ├── config │ ├── automations.yaml │ ├── configuration.yaml │ ├── groups.yaml │ ├── scenes.yaml │ └── scripts.yaml ├── docker-compose.yml ├── install.py └── secret.py 17 directories, 67 files

Tenga en cuenta que el alts directorio enlaza con el .jar archivo Nucleus enpackages/artifacts-unarchived. Por ejemplo:

user@machine:~$ sudo ls -l /greengrass/v2/alts/init total 8 lrwxrwxrwx 1 root root 97 Jun 27 08:12 distro -> /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.12.6/aws.greengrass.nucleus -rw-r--r-- 1 root root 16 Jun 27 07:07 launch.params

Por lo tanto, packages/artifacts-unarchived debe incluirse en su imagen dorada.

recipes

El siguiente ejemplo de lista en árbol packages/recipes muestra cómo se almacenan las recetas. Como se indica en la lista, las recetas se almacenan con resúmenes para ayudar a Greengrass a determinar si ya tiene los archivos correctos cuando recibe una implementación. Este formato tan específico dificulta la composición de una imagen dorada. Por lo tanto, tomar una instantánea de un dispositivo dorado es el método recomendado para crear una imagen dorada.

user@machine:~$ sudo tree /greengrass/v2/packages/recipes /greengrass/v2/packages/recipes ├── 0ya1warrMfzlq5PUTvOgfHOununru_xCLUFACECM_R0@2.3.7.metadata.json ├── 0ya1warrMfzlq5PUTvOgfHOununru_xCLUFACECM_R0@2.3.7.recipe.yaml ├── 89r1-ak7xPauDt4O7EG03sSXVUO8ysdHTk-YdF0NAAc@2.12.6.metadata.json ├── 89r1-ak7xPauDt4O7EG03sSXVUO8ysdHTk-YdF0NAAc@2.12.6.recipe.yaml ├── VAZ-Grqe5g43yO7UtasQOR5jcQGILgPeRZQhVikLd9o@1.0.0.metadata.json ├── VAZ-Grqe5g43yO7UtasQOR5jcQGILgPeRZQhVikLd9o@1.0.0.recipe.yaml ├── ViMYPYs99-AzSt1gL2L2YD5P7sIN-yEhy23wWJK_JN8@1.0.8.metadata.json ├── ViMYPYs99-AzSt1gL2L2YD5P7sIN-yEhy23wWJK_JN8@1.0.8.recipe.yaml ├── _1hT2A6X0ZYtB_CfI_ZUOEMDV96DfQVkSmZh2bbGYXg@1.0.19.metadata.json ├── _1hT2A6X0ZYtB_CfI_ZUOEMDV96DfQVkSmZh2bbGYXg@1.0.19.recipe.yaml ├── gQWwM7MSL2kOsBADU9bOQJ1QqO8ZI3hqpbKT5Bv4Ijk@1.1.0.metadata.json ├── gQWwM7MSL2kOsBADU9bOQJ1QqO8ZI3hqpbKT5Bv4Ijk@1.1.0.recipe.yaml ├── j_j5Seyy01FOcIh95nBFy4HYf8P1kT-jW_nmV18ldbk@2.1.8.metadata.json └── j_j5Seyy01FOcIh95nBFy4HYf8P1kT-jW_nmV18ldbk@2.1.8.recipe.yaml 0 directories, 14 files

Servicio del sistema

Si Greengrass se instala como un servicio del sistema, como suele ocurrir en los dispositivos Linux integrados, la imagen dorada también debe incluir los directorios que contienen los scripts de systemd inicio.

Imágenes de Docker

Si su dispositivo utiliza AWS IoT Greengrass componentes que incluyen imágenes de Docker como artefactos, estos artefactos se encuentran fuera del árbol de directorios de Greengrass. Por lo tanto, debe incluir el registro de imágenes de Docker del dispositivo dorado en su imagen dorada. Este registro se suele almacenar en/var/lib/docker.

Como alternativa, puede usar los comandos de Docker para hacer una copia de las imágenes de Docker que están almacenadas en su dispositivo principal y, a continuación, cargar esas imágenes de Docker en cada dispositivo de la línea de fabricación. En general, este método es más lento y se vuelve menos escalable a medida que aumenta el número de imágenes de Docker.

Secretos

Si sus dispositivos utilizan el componente de administrador de secretos para sincronizar los secretos AWS Secrets Manager, estos secretos se almacenan en el config/config.tlog archivo del árbol de directorios de Greengrass de su dispositivo dorado. Por ejemplo:

{"TS":1718878001465, "TP":["services","aws.greengrass.SecretManager","runtime","secretResponse"], "W":"changed", "V":"{\"secrets\":[ { \"arn\":\"arn:aws:secretsmanager:us-east-1:111122223333:secret:greengrass-home-assistant-KIzJfZ\", \"name\":\"greengrass-home-assistant\", \"versionId\":\"8e481177-9250-4458-9f1f-3690d28e4ae9\", \"encryptedSecretString\":\"AgV4j+We ... A7QjdE1w==\", \"versionStages\":[\"AWSCURRENT\"], \"createdDate\":1660648425915 } ] } "}

Estos secretos también se guardan en el archivo correspondienteconfig/effectiveConfig.yaml:

aws.greengrass.SecretManager: componentType: "PLUGIN" configuration: cloudSecrets: - arn: "arn:aws:secretsmanager:us-east-1:111122223333:secret:greengrass-home-assistant-KIzJfZ" dependencies: - "aws.greengrass.Nucleus:SOFT" lifecycle: {} runtime: secretResponse: "{\"secrets\":[{\"arn\":\"arn:aws:secretsmanager:us-east-1:111122223333:secret:greengrass-home-assistant-KIzJfZ\"\ ,\"name\":\"greengrass-home-assistant\",\"versionId\":\"8e481177-9250-4458-9f1f-3690d28e4ae9\"\ ,\"encryptedSecretString\":\"AgV4Rpc9 ... MYeVALYQ==\"\ ,\"versionStages\":[\"AWSCURRENT\"],\"createdDate\":1660648425915}]}" version: "2.1.8"

Incluso si incluyes el config directorio en tu imagen dorada, es importante recordar que el componente gestor de secretos de Greengrass cifra el secreto con la clave privada del dispositivo dorado. Como cada dispositivo tiene una clave privada única, las claves cifradas por el dispositivo dorado no las pueden descifrar los dispositivos de producción.

Por este motivo, le recomendamos que elimine los secretos cifrados de la imagen dorada para evitar que sus dispositivos de producción descifren incorrectamente los secretos de los dispositivos dorados. Los componentes de la aplicación deberían funcionar adecuadamente, o al menos fallar correctamente, cuando los secretos no estén presentes en el disco, antes de que el dispositivo se comunique por primera vez con la nube.

Cuando los secretos son un requisito ineludible

Si su organización requiere que sus dispositivos de producción se llenen de secretos durante la fabricación, su línea de producción necesita un script o un programa que reproduzca el comportamiento del componente del administrador de secretos para rellenar los secretos de cada dispositivo de producción. No recomendamos este enfoque debido a su complejidad y a la posibilidad de que sus secretos se guarden brevemente en texto claro en su estación de programación de producción.