Anatomia da imagem dourada - AWS Orientação prescritiva

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Anatomia da imagem dourada

AWS IoT Greengrass os dispositivos principais fabricados em grande escala geralmente são dispositivos Linux incorporados que têm uma distribuição Linux construída usando ferramentas como o Yocto. Normalmente, o tempo de execução do Greengrass edge é incorporado à distribuição, conforme demonstrado pelo projeto Meta AWS.

Esses dispositivos geralmente têm seu sistema de arquivos organizado em várias partições. Este guia usa imagem dourada como um termo abrangente. Seu dispositivo pode ter várias imagens douradas para exibir as várias partições.

Sua imagem dourada pode abranger todo o sistema de arquivos do dispositivo ou apenas parte dele. Este guia se concentra nas partes do sistema de arquivos que você precisa considerar AWS IoT Greengrass, sem prescrever como montar suas imagens de forma mais ampla.

Árvore de diretórios do Greengrass

Para entender os métodos de imagem dourada discutidos neste guia, revise a estrutura da árvore de diretórios do Greengrass mostrada na tabela a seguir.

Diretório

Descrição

alts

Parâmetros de inicialização e links simbólicos para a versão do núcleo do Greengrass que está atualmente ativa.

bin

Binários, se houver, estão instalados (por exemplo, o binário da CLI do Greengrass se esse componente estiver instalado). Esse diretório geralmente está vazio.

cli_ipc_info

Scratchpad para comunicação entre processos (IPC) do Greengrass CLI. Esse diretório estará vazio se você não tiver instalado a CLI do Greengrass.

config

Toda a configuração do Greengrass, incluindo a configuração de componentes.

deployments

Dados para gerenciar o estado das implantações e reversões.

logs

Arquivos de log para o núcleo e outros componentes.

packages

Artefatos e receitas para todos os componentes.

plugins

Armazenamento para componentes do tipo aws.greengrass.plugin que você instalou manualmente. Caso contrário, esse diretório não contém dados.

telemetry

Scratchpad usado pelo Greengrass para agregar dados de telemetria prontos para publicação.

work

Bloco de anotações para componentes.

Os work diretórios logstelemetry, e contêm somente dados efêmeros. Eles não precisam ser incluídos em uma imagem dourada, então omita-os se quiser minimizar o tamanho da imagem.

A CLI do Greengrass geralmente não é instalada em dispositivos de produção, então os cli_ipc_info diretórios bin e geralmente estão vazios e normalmente não precisam ser incluídos em uma imagem dourada.

O plugins diretório inclui dados somente se você instalou manualmente um plug-in (como o plug-in de provisionamento de frota ou um plug-in de provisionamento personalizado) ao instalar o Greengrass.

Os dados no deployments diretório são usados somente quando uma implantação está em andamento e, portanto, não são necessários em uma imagem dourada.

Consequentementealts, os packages diretórios, config e são de grande interesse. Às vezes, esses são os únicos diretórios do Greengrass que você precisa incluir em uma imagem dourada, se quiser minimizar o tamanho da imagem.

Conteúdo do diretório de pacotes

O diretório de pacotes tem três subdiretórios, conforme mostrado na tabela a seguir.

Subdiretório

Descrição

artifacts

Os artefatos do componente compactado que o Greengrass baixa durante as implantações.

artifacts-unarchived

Para artefatos que são .zip arquivos, esse diretório contém os mesmos artefatos, mas eles são descompactados para que os componentes possam usar o conteúdo do artefato.

recipes

Os arquivos de receita do componente.

artefatos

O exemplo de listagem em árvore a seguir packages/artifacts mostra como os artefatos são armazenados.

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

artefatos não arquivados

O exemplo de listagem em árvore a seguir packages/artifacts-unarchived mostra artefatos que são .zip extraídos dos arquivos.

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

Observe que o alts diretório está vinculado ao .jar arquivo Nucleus empackages/artifacts-unarchived. Por exemplo:

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

Portanto, packages/artifacts-unarchived deve ser incluído na sua imagem dourada.

recipes

O exemplo de listagem em árvore a seguir packages/recipes mostra como as receitas são armazenadas. Como indica a lista, as receitas são armazenadas com resumos para ajudar o Greengrass a determinar se ele já tem os arquivos corretos quando recebe uma implantação. Esse formato altamente específico dificulta a composição de uma imagem dourada. Consequentemente, tirar uma foto de um dispositivo dourado é o método recomendado para criar uma imagem dourada.

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

Serviço de sistema

Se o Greengrass for instalado como um serviço do sistema, como é comum em dispositivos Linux embarcados, a imagem dourada também deve incluir os diretórios que contêm os systemd scripts de inicialização.

Imagens de Docker

Se seu dispositivo usa AWS IoT Greengrass componentes que apresentam imagens do Docker como artefatos, esses artefatos ficam fora da árvore de diretórios do Greengrass. Portanto, você precisa incluir o registro de imagem Docker do dispositivo dourado em sua imagem dourada. Esse registro geralmente é armazenado em/var/lib/docker.

Como alternativa, você pode usar os comandos do Docker para fazer uma cópia das imagens do Docker que estão armazenadas em seu dispositivo dourado e, em seguida, carregar essas imagens do Docker em cada dispositivo em sua linha de fabricação. Em geral, esse método é mais lento e se torna menos escalável à medida que o número de imagens do Docker aumenta.

Segredos

Se seus dispositivos usam o componente gerenciador de segredos para sincronizar segredos AWS Secrets Manager, esses segredos são armazenados no config/config.tlog arquivo na árvore de diretórios do Greengrass do seu dispositivo dourado. Por exemplo:

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

Esses segredos também são armazenados no config/effectiveConfig.yaml arquivo correspondente:

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"

Mesmo que você inclua o config diretório em sua imagem dourada, é importante lembrar que o componente gerenciador de segredos do Greengrass criptografa o segredo com a chave privada do dispositivo dourado. Como cada dispositivo tem uma chave privada exclusiva, as chaves que foram criptografadas por seu dispositivo dourado não podem ser descriptografadas por seus dispositivos de produção.

Por esse motivo, recomendamos que você remova os segredos criptografados da imagem dourada para evitar que seus dispositivos de produção descriptografem incorretamente os segredos dourados do dispositivo. Os componentes do seu aplicativo devem funcionar adequadamente, ou pelo menos falhar normalmente, quando os segredos não estão presentes no disco, antes que um dispositivo tenha sua primeira comunicação com a nuvem.

Quando segredos são um requisito difícil

Se sua organização exige que seus dispositivos de produção sejam preenchidos com segredos durante a fabricação, sua linha de produção precisa de um script ou programa que replique o comportamento do componente gerenciador secreto para preencher segredos em cada dispositivo de produção. Não recomendamos essa abordagem devido à sua complexidade e à possibilidade de que seus segredos possam ser mantidos brevemente em texto não criptografado em sua estação de programação de produção.