黃金映像剖析 - AWS 方案指引

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

黃金映像剖析

AWS IoT Greengrass 大規模製造的核心裝置通常是內嵌的 Linux 裝置,具有使用 Yocto 等工具建構的 Linux 發行版本。一般而言,Greengrass 節點執行時間會分為分佈,如 Meta AWS 專案所示。

這類裝置通常會將其檔案系統組織成多個分割區。本指南使用黃金影像做為全部截獲詞彙。您的裝置可能有數個黃金映像,用來刷新各種分割區。

您的黃金映像可能包含整個裝置的檔案系統,或只是其中的一部分。本指南著重於您需要考慮的檔案系統部分 AWS IoT Greengrass,而無需開立更廣泛組合映像的指令。

Greengrass 目錄樹狀目錄

若要了解本指南中討論的黃金映像方法,請檢閱下表所示的 Greengrass 目錄樹狀結構。

目錄

Description

alts

啟動目前作用中的 Greengrass 核版本的參數和符號連結。

bin

二進位檔,如果已安裝任何 (例如,如果已安裝該元件,則為 Greengrass CLI 二進位檔)。此目錄通常是空的。

cli_ipc_info

Greengrass CLI 處理程序間通訊 (IPC) 的速記板。如果您尚未安裝 Greengrass CLI,則此目錄為空。

config

所有 Greengrass 組態,包括元件組態。

deployments

用於管理部署和復原狀態的資料。

logs

核心和其他元件的日誌檔案。

packages

所有元件的成品和配方。

plugins

您手動安裝之 類型元件aws.greengrass.plugin的儲存體。否則,此目錄不會保留任何資料。

telemetry

Greengrass 用來彙總準備好發佈的遙測資料的速記板。

work

元件的速記板。

logstelemetrywork目錄僅包含暫時性資料。它們不需要包含在黃金影像中,因此如果您想要將影像的大小降至最低,請省略它們。

Greengrass CLI 通常不會安裝在生產裝置上,因此 bincli_ipc_info目錄通常是空的,而且通常不需要包含在黃金映像中。

只有在安裝 Greengrass 時手動安裝外掛程式 (例如機群佈建外掛程式或自訂佈建外掛程式) 時, plugins目錄才會包含資料。

deployments 目錄中的資料只會在部署進行中時使用,因此不需要在黃金映像中使用。

因此 altsconfigpackages目錄最受關注。如果您想要將影像大小降至最低,有時這些是您需要包含在黃金映像中的唯一 Greengrass 目錄。

套件目錄的內容

套件目錄有三個子目錄,如下表所示。

子目錄

Description

artifacts

Greengrass 在部署期間下載的壓縮元件成品。

artifacts-unarchived

對於.zip封存的成品,此目錄包含相同的成品,但會解壓縮,以便元件可以使用成品內容。

recipes

元件配方檔案。

成品

下列範例樹狀目錄清單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

下列範例樹狀目錄清單packages/artifacts-unarchived顯示從 .zip 檔案擷取的成品。

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

下列範例樹狀目錄清單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

系統服務

如果 Greengrass 已安裝為系統服務,因為它通常適用於內嵌 Linux 裝置,則黃金映像也必須包含包含systemd啟動指令碼的目錄。

Docker 影像

如果您的裝置使用具有 Docker 影像做為成品的 AWS IoT Greengrass 元件,這些成品會位於 Greengrass 目錄樹狀目錄之外。因此,您需要在黃金映像中包含黃金裝置的 Docker 映像登錄檔。此登錄檔通常存放在 中/var/lib/docker

或者,您可以使用 Docker 命令來複製存放在黃金裝置上的 Docker 映像,然後將這些 Docker 映像載入製造線上的每個裝置。一般而言,此方法速度較慢,且隨著 Docker 映像數量增加而變得較不可擴展。

秘密

如果您的裝置使用秘密管理員元件來同步來自 的秘密AWS Secrets Manager,這些秘密會存放在黃金裝置的 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 秘密管理員元件會使用黃金裝置的私有金鑰加密秘密。由於每個裝置都有唯一的私有金鑰,因此您的生產裝置無法解密黃金裝置加密的金鑰。

因此,我們建議您從黃金映像中移除加密的秘密,以防止生產裝置錯誤解密黃金裝置秘密。在裝置第一次與雲端通訊之前,當秘密不存在於磁碟上時,您的應用程式元件應正常運作,或至少正常失敗。

當秘密是硬性要求時

如果您的組織要求生產裝置在製造期間填入秘密,您的生產線需要指令碼或程式來複寫秘密管理員元件的行為,以在每個生產裝置上填入秘密。我們不建議這種方法,因為其複雜性和秘密可能會在生產程式設計工作站上短暫以純文字形式保留。