本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
金像程序
以下各节描述了创建黄金映像并将该图像写入生产线上的每台设备的过程。
创建您的黄金设备
第 1 步:安装和配置 Greengrass。
像往常一样@@ 在您的黄金设备上安装 Greengrass edge 运行时,然后使用首选的配置方法进行配置。
步骤 2:部署组件。
像往常一样,从云端将应用程序组件和配置部署到您的黄金设备。
从您的黄金设备上读取金色图像
现在,您可以对您的黄金设备进行快照以创建黄金映像。
第 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 镜像注册表添加到黄金映像要慢。
将黄金映像写入您的生产设备
现在,您需要为通过生产线生产的每台生产设备写下黄金形象。通常使用脚本可以自动执行以下步骤。
第 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:添加凭据。
如果您的设备不使用队列配置,请为生产设备安装唯一的 X.509 证书和私钥,替换黄金设备凭证。实现这一目标的确切方法取决于您是否使用硬件安全模块 (HSM) 和特定的公钥基础架构 (PKI)。
配置您的生产设备
编写黄金映像后,必须配置每台生产设备。此配置取决于您使用的是完整还是部分 Greengrass 快照方法。这些步骤应该是自动化的。
完整的 Greengrass 快照方法
重要
只有在使用完整的 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"
如果您使用的是队列配置,则必须先擦除部分黄金设备配置,以确保队列配置插件thingName
属性中的黄金设备事物名称替换为空字符串。例如:
system: certificateFilePath: "/greengrass/v2/thingCert.crt" privateKeyPath: "/greengrass/v2/privKey.key" rootCaPath: "/greengrass/v2/rootCA.pem" rootpath: "/greengrass/v2" thingName: ""
此外,您必须将舰队配置插件配置添加到services
属性中,并将生产设备事物名称作为属性中的templateParameters
属性传递。以下示例假设队列配置模板有一个名为的参数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 队列配置插件。
第 3 步:更新插值后的事物名称。
如果您有任何组件使用iot:thingName
配方变量来插值事物名称,则可能会有访问控制语句,其中插入了黄金设备事物名称。例如,就证书轮换器社区组件
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 快照方法
如果您使用部分 Greengrass 快照方法,则生产设备的配置非常简单。该过程与安装 Gre engrass 时的普通引导程序部分配置过程相同,唯一的不同是初始配置会传递到已经安装的 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"
如果您使用的是队列配置,则部分配置应包括队列配置插件的配置templateParameters
属性传递。以下示例假设队列配置模板有一个名为的参数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 队列配置插件。
步骤 2:应用配置。
应用配置进行创建config/config.tlog
。例如:
sudo java -Droot="/greengrass/v2" \ -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar \ --start false \ --init-config config.yaml