

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 金像程序
<a name="procedure"></a>

以下各节描述了创建黄金映像并将该图像写入生产线上的每台设备的过程。

## 创建您的黄金设备
<a name="create"></a>

**第 1 步：安装和配置 Greengrass。**

[像往常一样@@ [在您的黄金设备上安装 Greengrass edge](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)有一个名为的参数`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)事物名称，则可能会有访问控制语句，其中插入了黄金设备事物名称。例如，就[证书轮换器社区组件](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 快照方法，则生产设备的配置非常简单。该过程与安装 Gre [engrass 时的普通引导程序部分配置过程相同，唯一的不同是初始配置会传递到已经安装](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
```