

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

# ゴールデンイメージの手順
<a name="procedure"></a>

以下のセクションでは、ゴールデンイメージを作成し、そのイメージを本番稼働用ライン上の各デバイスに書き込む手順について説明します。

## ゴールデンデバイスを作成する
<a name="create"></a>

**ステップ 1: Greengrass をインストールしてプロビジョニングします。**

通常どおり[、Greengrass エッジランタイム](https://docs.aws.amazon.com/greengrass/v2/developerguide/install-greengrass-core-v2.html)をゴールデンデバイスにインストールし、任意のプロビジョニング[方法を使用してプロビジョニング](https://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html)します。

**ステップ 2: コンポーネントをデプロイします。**

クラウドから、通常どおり、アプリケーションコンポーネントと設定をゴールデンデバイスにデプロイします。

## ゴールデンデバイスからゴールデンイメージを読み取る
<a name="read"></a>

これで、ゴールデンデバイスのスナップショットを作成してゴールデンイメージを作成できるようになりました。

**ステップ 1: Greengrass をシャットダウンします。**

golden デバイスで Greengrass サービスをシャットダウンします。例：

```
sudo systemctl stop greengrass.service
```

**ステップ 2: Greengrass ファイルツリーをスナップショットします。**

任意のゴールデンメソッドに応じて、Greengrass ファイルツリーの全体または一部のスナップショットを作成し、ゴールデンイメージに含めます。

**ステップ 3: Docker イメージをコピーします。**

コンポーネントがアーティファクトとして Docker イメージを使用する場合は、Docker イメージレジストリのスナップショットを作成し、ゴールデンイメージに含めます。

または、 `docker save`を使用して各 Docker イメージのアーカイブを作成し、ゴールデンデバイスからコピーすることもできます。例：

```
user@machine:~/environment $ docker images
REPOSITORY                     TAG       IMAGE ID       CREATED      SIZE
homeassistant/home-assistant   2024.6    2b4c9de733f1   9 days ago   1.6GB
user@machine:~/environment $ docker save homeassistant/home-assistant | gzip > home-assistant.tar.gz
```

一般的に、このアプローチは Docker イメージレジストリをゴールデンイメージに追加するよりも遅くなります。

## ゴールデンイメージを本稼働デバイスに書き込む
<a name="write"></a>

これで、製造ラインを通過する各本番デバイスにゴールデンイメージを書き込む必要があります。通常、次の手順はスクリプトを使用して自動化されます。

**ステップ 1: イメージを記述します。**

ゴールデンイメージを本番デバイスに書き込みます。必要に応じて、Greengrass ディレクトリツリーと Docker イメージレジストリのスナップショット全体または一部が含まれていることを確認します。

**ステップ 2: Docker イメージをロードします。**

`docker save` を使用してゴールデンデバイスから Docker イメージアーティファクトをコピーすることを選択した場合は、 `docker load` を使用してこれらのイメージを本稼働デバイスにロードします。例：

```
user@machine:~/environment $ docker load < home-assistant.tar.gz
user@machine:~/environment $ docker images
REPOSITORY                     TAG       IMAGE ID       CREATED      SIZE
homeassistant/home-assistant   2024.6    2b4c9de733f1   9 days ago   1.6GB
```

一般的に、このアプローチは Docker イメージレジストリをゴールデンイメージに追加するよりも遅くなります。

**ステップ 3: 認証情報を追加する。**

デバイスが[フリートプロビジョニング](https://docs.aws.amazon.com/greengrass/v2/developerguide/fleet-provisioning.html)を使用しない場合は、本番稼働用デバイスの一意の X.509 証明書とプライベートキーをインストールし、ゴールデンデバイスの認証情報を置き換えます。これを実現する正確な方法は、[ハードウェアセキュリティモジュール (HSM)](https://docs.aws.amazon.com/greengrass/v2/developerguide/hardware-security.html) と特定のパブリックキーインフラストラクチャ (PKI) を使用するかどうかによって異なります。

## 本番稼働用デバイスを設定する
<a name="configure"></a>

ゴールデンイメージを書き込んだら、各本番稼働用デバイスを設定する必要があります。この設定は、Greengrass スナップショットメソッド全体を使用するか部分を使用するかによって異なります。ステップは自動化する必要があります。

### 完全な Greengrass スナップショットメソッド
<a name="full-snapshot"></a>

**重要**  
**完全な** Greengrass スナップショットメソッドを使用している場合にのみ、以下の手順に従います。

**ステップ 1: 設定を編集します。**

`config/effectiveConfig.yaml` ファイルを編集します。例：

```
sudo nano /greengrass/v2/config/effectiveConfig.yaml
```

**ステップ 2: モノの名前を設定します。**

新しい本番稼働用デバイスのモノの名前を設定するために必要なアクションは、フリートプロビジョニングを使用しているかどうかによって異なります。ユースケースに合わせて正しい変更を加えます。

フリートプロビジョニングを使用していない場合は、 `thingName`プロパティを編集して、ゴールデンデバイスのモノの名前を本番デバイスのモノの名前に置き換えることで、本番デバイスのモノの名前を設定できます。例：

```
system:
  certificateFilePath: "/greengrass/v2/thingCert.crt"
  privateKeyPath: "/greengrass/v2/privKey.key"
  rootCaPath: "/greengrass/v2/rootCA.pem"
  rootpath: "/greengrass/v2"
  thingName: "ProductionDeviceThingName1"
```

フリートプロビジョニングを使用している場合は、まずゴールデンデバイス設定の一部を消去して、[フリートプロビジョニングプラグイン](https://github.com/aws-greengrass/aws-greengrass-fleet-provisioning-by-claim)が本番デバイスで実行されるようにする必要があります。これを行うには、 `thingName`プロパティのゴールデンデバイスのモノの名前を空の文字列に置き換えます。例：

```
system:
  certificateFilePath: "/greengrass/v2/thingCert.crt"
  privateKeyPath: "/greengrass/v2/privKey.key"
  rootCaPath: "/greengrass/v2/rootCA.pem"
  rootpath: "/greengrass/v2"
  thingName: ""
```

さらに、フリートプロビジョニングプラグイン設定を `services`プロパティに追加し、本番デバイスのモノの名前を `templateParameters`プロパティ内のプロパティとして渡す必要があります。次の例では、[フリートプロビジョニングテンプレート](https://docs.aws.amazon.com/iot/latest/developerguide/provision-template.html#fleet-provision-template)に という名前のパラメータがあるため`ThingName`、プラグイン設定`templateParameters`の 内に `ThingName`プロパティがあることを前提としています。

```
system:
  certificateFilePath: "/greengrass/v2/thingCert.crt"
  privateKeyPath: "/greengrass/v2/privKey.key"
  rootCaPath: "/greengrass/v2/rootCA.pem"
  rootpath: "/greengrass/v2"
  thingName: ""
services:
  aws.greengrass.FleetProvisioningByClaim:
    configuration:
      rootPath: "/greengrass/v2"
      awsRegion: "us-east-1"
      iotDataEndpoint: "<prefix>-ats.iot.us-east-1.amazonaws.com"
      iotCredentialEndpoint: "<prefix>.credentials.iot.us-east-1.amazonaws.com"
      iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias"
      provisioningTemplate: "GreengrassFleetProvisioningTemplate"
      claimCertificatePath: "/greengrass/v2/claim-certs/claim.pem.crt"
      claimCertificatePrivateKeyPath: "/greengrass/v2/claim-certs/claim.private.pem.key"
      rootCaPath: "/greengrass/v2/rootCA.pem"
      templateParameters:
        ThingName: "ProductionDeviceThingName1"
```

ユースケースでは、ここに示すものとは異なるフリートプロビジョニングプラグイン設定パラメータが必要になる場合があります。詳細については、 AWS IoT Greengrass ドキュメント[の AWS IoT 「フリートプロビジョニングプラグインを設定する](https://docs.aws.amazon.com/greengrass/v2/developerguide/fleet-provisioning-configuration.html)」を参照してください。

**ステップ 3: 補間されたモノの名前を更新する。**

`iot:thingName` [レシピ変数](https://docs.aws.amazon.com/greengrass/v2/developerguide/component-recipe-reference.html#recipe-variables)を使用してモノの名前を[補間](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html#greengrass-nucleus-component-configuration-interpolate-component-configuration)するコンポーネントがある場合、ゴールデンデバイスのモノの名前が補間されたアクセスコントロールステートメントがある可能性があります。たとえば、 [Certificate Rotator コミュニティコンポーネント](https://github.com/awslabs/aws-greengrass-labs-certificate-rotator)の場合：

```
services:
  aws.greengrass.labs.CertificateRotator:
    componentType: "GENERIC"
    configuration:
      accessControl:
        aws.greengrass.ipc.mqttproxy:
          aws.greengrass.labs.CertificateRotator:mqttproxy:1:
            operations:
            - "aws.greengrass#PublishToIoTCore"
            policyDescription: "Allows access to publish to relevant topics"
            resources:
            - "$aws/things/GoldenDeviceThingName/jobs/+/get"
            - "$aws/things/GoldenDeviceThingName/jobs/+/update"
            - "awslabs/things/GoldenDeviceThingName/certificate/create"
            - "awslabs/things/GoldenDeviceThingName/certificate/commit"
          aws.greengrass.labs.CertificateRotator:mqttproxy:2:
            operations:
            - "aws.greengrass#SubscribeToIoTCore"
            policyDescription: "Allows access to subscribe to relevant topics"
            resources:
            - "$aws/things/GoldenDeviceThingName/jobs/notify-next"
            - "$aws/things/GoldenDeviceThingName/jobs/+/get/accepted"
            - "$aws/things/GoldenDeviceThingName/jobs/+/get/rejected"
            - "$aws/things/GoldenDeviceThingName/jobs/+/update/accepted"
            - "$aws/things/GoldenDeviceThingName/jobs/+/update/rejected"
            - "awslabs/things/GoldenDeviceThingName/certificate/create/accepted"
            - "awslabs/things/GoldenDeviceThingName/certificate/create/rejected"
            - "awslabs/things/GoldenDeviceThingName/certificate/commit/accepted"
            - "awslabs/things/GoldenDeviceThingName/certificate/commit/rejected"
      keyAlgorithm: "RSA-2048"
      signingAlgorithm: "SHA256WITHRSA"
```

このような場合はすべて、ゴールデンデバイスのモノの名前のすべてのインスタンスを本番デバイスのモノの名前に置き換える必要があります。

**ステップ 4: ゴールデンデバイスシークレットを削除します。**

ゴールデンデバイスによって保存された暗号化されたシークレット`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"
```

このシークレットを削除して、本番デバイスがゴールデンデバイスによって暗号化されたシークレットを復号しようとしないようにする必要があります。`secretResponse` プロパティを削除します。例：

```
  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:
    version: "2.1.8"
```

**ステップ 5: 変更された設定を適用します。**

変更された設定を適用して、 を更新します`config/config.tlog`。例：

```
sudo java -Droot="/greengrass/v2" \
  -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar \
  --start false \
  --init-config /greengrass/v2/config/effectiveConfig.yaml
```

### 部分 Greengrass スナップショットメソッド
<a name="partial-snapshot"></a>

部分的な Greengrass スナップショット方式を使用する場合、本番稼働用デバイスの設定は簡単です。この手順は、[Greengrass をインストールする](https://docs.aws.amazon.com/greengrass/v2/developerguide/install-greengrass-core-v2.html)ときの通常のブートストラップ部分設定手順と同じですが、初期設定が既にインストールされている Greengrass ランタイムに渡される点が異なります。

**重要**  
Greengrass スナップショット**メソッドの一部**を使用している場合にのみ、以下の手順に従います。

**ステップ 1: 設定を作成します。**

必要な部分設定は、フリートプロビジョニングを使用しているかどうかによって異なります。ユースケースに合わせて正しい変更を行ってください。

フリートプロビジョニングを使用していない場合は、フリートプロビジョニングプラグインの設定を含まない部分設定ファイルを作成できます。`thingName` プロパティを本番稼働用デバイスのモノの名前に設定します。例：

```
system:
  certificateFilePath: "/greengrass/v2/device.pem.crt"
  privateKeyPath: "/greengrass/v2/private.pem.key"
  rootCaPath: "/greengrass/v2/AmazonRootCA1.pem"
  rootpath: "/greengrass/v2"
  thingName: "ProductionDeviceThingName1"
services:
  aws.greengrass.Nucleus:
    componentType: "NUCLEUS"
    version: "2.12.6"
    configuration:
      awsRegion: "us-east-1"
      iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias"
      iotDataEndpoint: "<prefix>-ats.iot.us-east-1.amazonaws.com"
      iotCredEndpoint: "<prefix>.credentials.iot.us-east-1.amazonaws.com"
```

フリートプロビジョニングを使用している場合、部分的な設定には[フリートプロビジョニングプラグイン](https://github.com/aws-greengrass/aws-greengrass-fleet-provisioning-by-claim)の設定を含める必要があります。この設定では、本番稼働用デバイスのモノの名前を プロパティ内の`templateParameters`プロパティとして渡す必要があります。次の例では、[フリートプロビジョニングテンプレート](https://docs.aws.amazon.com/iot/latest/developerguide/provision-template.html#fleet-provision-template)に という名前のパラメータがあり`ThingName`、プラグイン設定`templateParameters`の 内に `ThingName`プロパティがあることを前提としています。

```
services:
  aws.greengrass.Nucleus:
    version: "2.12.6"
  aws.greengrass.FleetProvisioningByClaim:
    configuration:
      rootPath: "/greengrass/v2"
      awsRegion: "us-east-1"
      iotDataEndpoint: "<prefix>-ats.iot.us-east-1.amazonaws.com"
      iotCredentialEndpoint: "<prefix>.credentials.iot.us-east-1.amazonaws.com"
      iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias"
      provisioningTemplate: "GreengrassFleetProvisioningTemplate"
      claimCertificatePath: "/greengrass/v2/claim-certs/claim.pem.crt"
      claimCertificatePrivateKeyPath: "/greengrass/v2/claim-certs/claim.private.pem.key"
      rootCaPath: "/greengrass/v2/AmazonRootCA1.pem"
      templateParameters:
        ThingName: "ProductionDeviceThingName1"
```

ユースケースでは、ここに示すものとは異なるフリートプロビジョニングプラグイン設定パラメータが必要になる場合があります。詳細については、 AWS IoT Greengrass ドキュメント[の AWS IoT 「フリートプロビジョニングプラグインを設定する](https://docs.aws.amazon.com/greengrass/v2/developerguide/fleet-provisioning-configuration.html)」を参照してください。

**ステップ 2: 設定を適用します。**

設定を適用して を作成します`config/config.tlog`。例：

```
sudo java -Droot="/greengrass/v2" \
  -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar \
  --start false \
  --init-config config.yaml
```