

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ゴールデンイメージの構造
<a name="anatomy"></a>

AWS IoT Greengrass 大規模に製造される コアデバイスは、一般的に [Yocto](https://www.yoctoproject.org/) などのツールを使用して構築された Linux ディストリビューションを持つ組み込み Linux デバイスです。通常、[Meta AWS](https://github.com/aws4embeddedlinux/meta-aws) プロジェクトで示されているように、Greengrass エッジランタイムは ディストリビューションにベイクされます。

このようなデバイスは、多くの場合、ファイルシステムを複数のパーティションに整理します。このガイドでは、キャッチオール用語として*ゴールデンイメージ*を使用します。デバイスには、さまざまなパーティションをフラッシュするためのゴールデンイメージがいくつかある場合があります。

ゴールデンイメージには、デバイスのファイルシステム全体またはその一部が含まれる場合があります。このガイドでは、イメージをより広範に組み立てる方法を規定せずに AWS IoT Greengrass、考慮する必要があるファイルシステムの部分に焦点を当てています。

## Greengrass ディレクトリツリー
<a name="greengrass-directory"></a>

このガイドで説明されているゴールデンイメージの方法を理解するには、次の表に示す Greengrass ディレクトリツリーの構造を確認してください。


| 
| 
| **ディレクトリ** | **説明** | 
| --- |--- |
| `alts` | 現在アクティブな Greengrass nucleus バージョンへのパラメータとシンボリックリンクを起動します。 | 
| `bin` | バイナリがインストールされている場合 (たとえば、そのコンポーネントがインストールされている場合は [Greengrass CLI](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-cli-component.html) バイナリ）。このディレクトリは空であることが多いです。 | 
| `cli_ipc_info` | Greengrass CLI プロセス間通信 (IPC) 用のスクラッチパッド。Greengrass CLI をインストールしていない場合、このディレクトリは空です。 | 
| `config` | コンポーネント設定を含むすべての Greengrass 設定。 | 
| `deployments` | デプロイとロールバックの状態を管理するためのデータ。 | 
| `logs` | nucleus およびその他のコンポーネントのログファイル。 | 
| `packages` | すべてのコンポーネントのアーティファクトとレシピ。 | 
| `plugins` | 手動でインストール`aws.greengrass.plugin`したタイプのコンポーネントのストレージ。それ以外の場合、このディレクトリはデータを保持しません。 | 
| `telemetry` | Greengrass がテレメトリデータを集約して公開するために使用されるスクラッチパッド。 | 
| `work` | コンポーネントのスクラッチパッド。 | 

`logs`、`telemetry`、および `work` ディレクトリにはエフェメラルデータのみが含まれます。ゴールデンイメージに含める必要がないため、イメージのサイズを最小限に抑える場合は省略します。

Greengrass CLI は通常、本稼働デバイスにインストールされないため、 `bin`および `cli_ipc_info` ディレクトリは空であることが多く、通常、ゴールデンイメージに含める必要はありません。

`plugins` ディレクトリには、Greengrass のインストール時に手動でプラグイン ([フリートプロビジョニングプラグイン](https://docs.aws.amazon.com/greengrass/v2/developerguide/fleet-provisioning.html#download-fleet-provisioning-plugin)やカスタムプロビジョニングプラグインなど) をインストールした場合にのみデータが含まれます。

`deployments` ディレクトリ内のデータは、デプロイが進行中の場合にのみ使用されるため、ゴールデンイメージでは必要ありません。

したがって、`alts`、、および `config` `packages` ディレクトリが最も重要です。イメージサイズを最小限に抑える場合、これらはゴールデンイメージに含める必要がある唯一の Greengrass ディレクトリであることがあります。

## packages ディレクトリの内容
<a name="packages-directory"></a>

次の表に示すように、パッケージディレクトリには 3 つのサブディレクトリがあります。


| 
| 
| **サブディレクトリ** | **説明** | 
| --- |--- |
| `artifacts` | デプロイ中に Greengrass がダウンロードする圧縮コンポーネントアーティファクト。 | 
| `artifacts-unarchived` | `.zip` アーカイブであるアーティファクトの場合、このディレクトリには同じアーティファクトが含まれますが、コンポーネントがアーティファクトの内容を使用できるように解凍されます。 | 
| `recipes` | コンポーネントレシピファイル。 | 

### artifacts
<a name="artifacts"></a>

次の のツリーリストの例は、アーティファクトの保存方法`packages/artifacts`を示しています。

```
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
```

### artifacts-unarchived
<a name="artifacts-unarchived"></a>

次の のツリーリストの例は、`.zip`ファイルから抽出されたアーティファクト`packages/artifacts-unarchived`を示しています。

```
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
```

`alts` ディレクトリは、 の Nucleus `.jar` ファイルにリンクされていることに注意してください`packages/artifacts-unarchived`。例：

```
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
```

したがって、 はゴールデンイメージに含める`packages/artifacts-unarchived`必要があります。

### recipes
<a name="recipes"></a>

次の のツリーリストの例は、レシピの保存方法`packages/recipes`を示しています。リストが示すように、レシピはダイジェストとともに保存され、デプロイを受信したときに Greengrass が既に正しいファイルがあるかどうかを判断するのに役立ちます。この非常に具体的な形式により、ゴールデンイメージの作成が困難になります。したがって、ゴールデンデバイスのスナップショットを撮ることは、ゴールデンイメージを作成するために推奨される方法です。

```
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
```

## システムサービス
<a name="systemd"></a>

Greengrass がシステムサービスとしてインストールされている場合、一般的に埋め込み Linux デバイスの場合、ゴールデンイメージには`systemd`スタートアップスクリプトを含むディレクトリも含める必要があります。

## Docker イメージ
<a name="docker"></a>

デバイスが Docker イメージをアーティファクトとして使用する AWS IoT Greengrass コンポーネントを使用している場合、これらのアーティファクトは Greengrass ディレクトリツリーの外部にあります。したがって、ゴールデンデバイスの Docker イメージレジストリをゴールデンイメージに含める必要があります。このレジストリは通常、 に保存されます`/var/lib/docker`。

または、Docker コマンドを使用して、ゴールデンデバイスに保存されている Docker イメージのコピーを作成し、それらの Docker イメージを製造ライン上の各デバイスにロードすることもできます。一般に、この方法は遅くなり、Docker イメージの数が増えるにつれてスケーラビリティが低下します。

## シークレット
<a name="secrets"></a>

デバイスがシー[クレットマネージャーコンポーネント](https://docs.aws.amazon.com/greengrass/v2/developerguide/secret-manager-component.html)を使用して からのシークレットを同期する場合[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)、これらのシークレットはゴールデンデバイスの Greengrass ディレクトリツリーの `config/config.tlog`ファイルに保存されます。例：

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

これらのシークレットは、対応する `config/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"
```

ゴールデンイメージに `config` ディレクトリを含める場合でも、Greengrass シーク[レットマネージャーコンポーネントはゴールデンデバイスのプライベートキーでシークレットを暗号化](https://docs.aws.amazon.com/greengrass/v2/developerguide/secret-manager-component.html)することに注意してください。各デバイスには一意のプライベートキーがあるため、ゴールデンデバイスによって暗号化されたキーは本番稼働用デバイスによって復号化できません。

このため、暗号化されたシークレットをゴールデンイメージから削除して、本稼働デバイスがゴールデンデバイスシークレットを誤って復号しないようにすることをお勧めします。シークレットがディスクに存在しない場合、デバイスがクラウドと最初に通信する前に、アプリケーションコンポーネントが適切に機能するか、少なくとも正常に機能しない必要があります。

### シークレットが厳しい要件である場合
<a name="secrets-req"></a>

組織が製造中に本番稼働用デバイスにシークレットを入力する必要がある場合、本番稼働用ラインには、各本番稼働用デバイスにシークレットを入力するためのシークレットマネージャーコンポーネントの動作をレプリケートするスクリプトまたはプログラムが必要です。このアプローチは、複雑さと、シークレットが本番環境のプログラミングステーションで一時的にクリアテキストに保持される可能性があるため、お勧めしません。