

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
<a name="anatomy"></a>

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](https://www.yoctoproject.org/). Normalmente, o tempo de execução do Greengrass edge é incorporado à distribuição, conforme demonstrado pelo projeto Meta [AWS](https://github.com/aws4embeddedlinux/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
<a name="greengrass-directory"></a>

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](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-cli-component.html) 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 `logs``telemetry`, 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](https://docs.aws.amazon.com/greengrass/v2/developerguide/fleet-provisioning.html#download-fleet-provisioning-plugin) 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.

Consequentemente`alts`, 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
<a name="packages-directory"></a>

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
<a name="artifacts"></a>

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
<a name="artifacts-unarchived"></a>

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 em`packages/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
<a name="recipes"></a>

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
<a name="systemd"></a>

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
<a name="docker"></a>

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
<a name="secrets"></a>

Se seus dispositivos usam o [componente gerenciador de segredos](https://docs.aws.amazon.com/greengrass/v2/developerguide/secret-manager-component.html) para sincronizar segredos [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html), 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](https://docs.aws.amazon.com/greengrass/v2/developerguide/secret-manager-component.html). 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
<a name="secrets-req"></a>

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.