

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 黃金映像程序
<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。**

關閉黃金裝置上的 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)具有名為 `templateParameters`的參數`ThingName`，因此在外掛程式組態的 中有一個`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)具有名為 `templateParameters`的參數`ThingName`，因此在外掛程式組態的 中有一個`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
```