AWS IoT Greengrass Version 1 於 2023 年 6 月 30 日進入延長使用壽命階段。如需詳細資訊,請參閱AWS IoT Greengrass V1 維護政策。在此日期之後, AWS IoT Greengrass V1 將不會發行提供功能、增強功能、錯誤修正或安全性修補程式的更新。在上運行的設備 AWS IoT Greengrass V1 不會中斷,並將繼續運行並連接到雲。我們強烈建議您移轉至 AWS IoT Greengrass Version 2,這會增加重要的新功能,並支援其他平台。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS IoT Greengrass 核心軟體的 OTA 更新
AWS IoT Greengrass核心軟體套件包含可執行 over-the-air (OTA) AWS IoT Greengrass 軟體更新的更新代理程式。您可以使用 OTA 更新在一個或多個核心上安裝最新版本的 AWS IoT Greengrass Core 軟體或 OTA 更新代理程式軟體。透過 OTA 更新,您的核心裝置就不需要實際存在。
我們建議您盡可能使用 OTA 更新。它們提供了一種機制,讓您用來追蹤更新狀態和更新歷程記錄。如果發生更新失敗,OTA 更新代理程式會回復到先前的軟體版本。
注意
在您使用 apt
安裝 AWS IoT Greengrass 核心軟體時,不支援 OTA 更新。針對這些安裝,我們建議您使用 apt
以升級軟體。如需詳細資訊,請參閱從 APT 儲存庫安裝 AWS IoT Greengrass 核心軟體。
OTA 更新可讓您更有效率地執行下列作業:
-
修復安全漏洞。
-
解決軟體穩定性問題。
-
部署新功能和改良的功能。
此功能與 AWS IoT 任務整合。
請求
下列需求適用於 AWS IoT Greengrass 軟體的 OTA 更新。
-
Greengrass 核心在本機儲存空間中必須有至少 400 MB 的可用磁碟空間。OTA 更新代理程式需要AWS IoT Greengrass核心軟體的執行階段使用需求的三倍左右。如需詳細資訊,請參閱. Amazon Web Services 一般參考
-
Greengrass 核心必須與. AWS 雲端
-
Greengrass 核心必須正確設定並佈建憑證和金鑰,以便使用 AWS IoT Core 和 AWS IoT Greengrass 進行身分驗證。如需詳細資訊,請參閱X.509 憑證。
-
Greengrass 核心無法設定為使用網路代理。
注意
從 AWS IoT Greengrass v1.9.3 開始,將 MQTT 流量設定為使用連接埠 443 的核心便已支援 OTA 更新 (預設連接埠 8883 的核心未支援)。不過,OTA 更新代理程式不支援透過網路 Proxy 進行更新。如需詳細資訊,請參閱連線至連接埠 443 或透過網路代理。
-
無法在包含 AWS IoT Greengrass Core 軟體的磁碟分割區中啟用信任開機。
注意
您可以在已啟用信任開機的磁碟分割區上安裝並執行 AWS IoT Greengrass Core 軟體,但不支援 OTA 更新。
-
AWS IoT Greengrass 必須在包含 AWS IoT Greengrass Core 軟體的磁碟分割區上具有讀取/寫入許可。
-
如果您使用初始化系統來管理您的 Greengrass 核心,則必須設定 OTA 更新以與初始化系統整合。如需詳細資訊,請參閱與初始化系統整合。
-
您必須建立用於預先簽署 Amazon S3 URL 以AWS IoT Greengrass軟體更新成品的角色。此簽署者角色可AWS IoT Core讓您存取存放在 Amazon S3 中的軟體更新成品。如需詳細資訊,請參閱OTA 更新的 IAM 許可。
OTA 更新的 IAM 許可
AWS IoT Greengrass發行新版的AWS IoT Greengrass核心軟體時,會AWS IoT Greengrass更新存放在 Amazon S3 中用於 OTA 更新的軟體成品。
您AWS 帳戶必須包含可用來存取這些成品的 Amazon S3 URL 簽署者角色。角色必須具有權限原則,允許在目標 AWS 區域 s 中的值區s3:GetObject
執行動作。該角色也必須具有允許 iot.amazonaws.com
將角色視為信任實體的信任政策。
- 許可政策
-
針對角色許可,您可以使用 AWS 受管政策或建立自訂政策。
-
使用 AWS 受管政策
「綠色管理」
策略UpdateArtifactAccess由提供。AWS IoT Greengrass如果您想要允許目前和未來支援的所有 Amazon Web 服務區域存取AWS IoT Greengrass,請使用此政策。 -
建立自訂原則
如果您想要明確指定部署核心的 Amazon Web 服務區域,則應建立自訂政策。以下範例政策允許在六個區域中存取 AWS IoT Greengrass 軟體更新:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToGreengrassOTAUpdateArtifacts", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::us-east-1-greengrass-updates/*", "arn:aws:s3:::us-west-2-greengrass-updates/*", "arn:aws:s3:::ap-northeast-1-greengrass-updates/*", "arn:aws:s3:::ap-southeast-2-greengrass-updates/*", "arn:aws:s3:::eu-central-1-greengrass-updates/*", "arn:aws:s3:::eu-west-1-greengrass-updates/*" ] } ] }
-
- 信任政策
-
連接至角色的信任政策必須允許
sts:AssumeRole
動作並定義iot.amazonaws.com
為委託人。這允許 AWS IoT Core 將角色擔任信任的實體。以下是範例政策文件:{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIotToAssumeRole", "Action": "sts:AssumeRole", "Principal": { "Service": "iot.amazonaws.com" }, "Effect": "Allow" } ] }
此外,起始 OTA 更新的使用者必須具有 greengrass:CreateSoftwareUpdateJob
和 iot:CreateJob
的使用許可,以及使用 iam:PassRole
傳遞簽署者角色的許可。以下是 IAM 政策範例:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "greengrass:CreateSoftwareUpdateJob" ], "Effect": "Allow", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:CreateJob" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "
arn-of-s3-url-signer-role
" } ] }
考量事項
啟動 Greengrass 核心軟體的 OTA 更新前,請注意更新會對 Greengrass 群組中的裝置造成的影響,不論群組是在核心裝置上還是在本機連線至該核心的用戶端裝置上:
-
更新期間會關閉核心。
-
會關閉在核心執行的任何 Lambda 函數。如果這些函數寫入到本機資源,這些函數可能會讓這些資源處於不正確的狀態,除非有正確地關閉。
-
在核心停機期間,與核心的所有連線AWS 雲端都會遺失。由用戶端裝置透過核心路由傳送的訊息將會遺失。
-
登入資料快取會遺失。
-
佇列為 Lambda 函數所保留待處理的工作會遺失。
-
長壽命的 Lambda 函數會遺失其動態狀態資訊,且所有擱置中的工作都會中斷
在 OTA 更新期間,以下狀態資訊皆會保留:
-
核心組態
-
Greengrass 群組組態
-
本機陰影
-
Greengrass 日誌
-
OTA 更新代理記錄檔
Greengrass OTA 更新代理程式
Greengrass OTA 更新代理程式是裝置上的軟體元件,可處理在雲端中建立和部署的更新工作。OTA 更新代理程式散佈在與AWS IoT Greengrass核心軟體相同的軟體套件中。代理程式位於 /
中。它會將日誌寫入 greengrass-root
/ota/ota_agent/ggc-ota/var/log/greengrass/ota/ggc_ota.txt
。
注意
greengrass-root
代表 AWS IoT Greengrass 核心軟體在裝置上安裝所在的路徑。通常,這是 /greengrass
目錄。
您可以通過手動執行二進製文件或將其集成為 init 腳本(例如 systemd 服務文件)的一部分來啟動 OTA 更新代理程序。如果您手動執行二進製文件,則應以 root 身份運行。當它啟動時,OTA 更新代理程式會偵聽AWS IoT Greengrass軟體更新作業,AWS IoT Core並依序執行它們。OTA 更新代理程式會忽略所有其他AWS IoT作業類型。
下列摘錄顯示用於啟動、停止和重新啟動 OTA 更新代理程式的 systemd 服務檔案範例:
[Unit] Description=Greengrass OTA Daemon [Service] Type=forking Restart=on-failure ExecStart=/greengrass/ota/ota_agent/ggc-ota [Install] WantedBy=multi-user.target
作為更新目標的核心不得運行 OTA 更新代理的兩個實例。這麼做會讓兩個代理程式處理相同的任務,而造成衝突。
與初始化系統整合
在 OTA 更新期間,OTA 更新代理會重新啟動核心設備上的二進製文件。如果二進位檔案正在執行,當初始化系統在更新期間監控 AWS IoT Greengrass Core 軟體或代理程式的狀態時,這可能會造成衝突。為了協助整合 OTA 更新機制與監控策略,您可以撰寫在更新前後執行的 shell 指令碼。例如,您可以使用指ggc_pre_update.sh
令碼在裝置關閉之前備份資料或停止處理程序。
要告訴 OTA 更新代理程序運行這些腳本,您必須在 config.json 文件中包含該"managedRespawn" : true
標誌。此設定會顯示在下列摘錄中:
{ "coreThing": { … }, "runtime": { … }, "managedRespawn": true … }
透過 OTA 更新受管的 respawn
下列需求適用於managedRespawn
設定為的 OTA 更新true
:
-
以下 shell 腳本必須存在於目
/
錄中:greengrass-root
/usr/scripts-
ggc_pre_update.sh
-
ggc_post_update.sh
-
ota_pre_update.sh
-
ota_post_update.sh
-
-
指令碼必須傳回成功的傳回碼。
-
這些指令碼必須由根目錄擁有,而且只能由根目錄執行。
-
該
ggc_pre_update.sh
腳本必須停止 Greengrass 守護進程。 -
該
ggc_post_update.sh
腳本必須啟動 Greengrass 守護進程。
注意
由於 OTA 更新代理程序管理自己的進程,因此ota_pre_update.sh
和ota_post_update.sh
腳本不需要停止或啟動 OTA 服務。
OTA 更新代理程式會從/
. 目錄樹狀圖看起來應該如下所示:greengrass-root
/usr/scripts
<greengrass_root> |-- certs |-- config | |-- config.json |-- ggc |-- usr/scripts | |-- ggc_pre_update.sh | |-- ggc_post_update.sh | |-- ota_pre_update.sh | |-- ota_post_update.sh |-- ota
設定managedRespawn
為時true
,OTA 更新代理程式會在軟體更新前後檢查/
目錄中是否有這些指令碼。如果指令碼不存在,則更新會失敗。 AWS IoT Greengrass不會驗證這些指令碼的內容。最佳做法是驗證您的指令碼是否正常運作,並針對錯誤發出適當的結束代碼。greengrass-root
/usr/scripts
針對 AWS IoT Greengrass 核心軟體的 OTA 更新:
-
在開始更新之前,代理程式會執行
ggc_pre_update.sh
指令碼。使用此指令碼來執行 OTA 更新代理程式啟動 AWS IoT Greengrass Core 軟體更新之前必須執行的命令,例如備份資料或停止任何執行中的程序。下面的示例顯示了一個簡單的腳本來停止 Greengrass 守護進程。#!/bin/bash set -euo pipefail systemctl stop greengrass
-
完成更新後,代理程式會執行
ggc_post_update.sh
指令碼。對於 OTA 更新代理程式啟動 AWS IoT Greengrass Core 軟體更新後需要執行的命令,例如重新啟動處理程序,請使用此指令碼。下列範例顯示啟動 Greengrass 常駐程式的簡單指令碼。#!/bin/bash set -euo pipefail systemctl start greengrass
如需 OTA 更新代理程式的 OTA 更新:
-
在開始更新之前,代理程式會執行
ota_pre_update.sh
指令碼。對於在 OTA 更新代理更新自身之前需要運行的命令,例如備份數據或停止任何正在運行的進程,請使用此腳本。 -
完成更新後,代理程式會執行
ota_post_update.sh
指令碼。對於在 OTA 更新代理自身更新之後需要運行的命令,例如重新啟動進程,請使用此腳本。
注意
如果設定managedRespawn
為false
,則 OTA 更新代理程式不會執行指令碼。
建立 OTA 更新
請依照下列步驟在一或多個核心上執行 AWS IoT Greengrass 軟體的 OTA 更新:
-
確定您的核心符合 OTA 更新的要求。
-
在核心設備終端中,啟動 OTA 更新代理程序。
cd /
greengrass-root
/ota/ota_agent sudo ./ggc-ota注意
greengrass-root
代表 AWS IoT Greengrass 核心軟體在裝置上安裝所在的路徑。通常,這是/greengrass
目錄。請勿在核心上啟動 OTA 更新代理程式的多個執行個體,因為這可能會造成衝突。
-
使用 AWS IoT Greengrass API 建立軟體更新工作。
-
呼叫 CreateSoftwareUpdateJob API。在此範例程序中,我們使用 AWS CLI 命令。
下面的命令會建立在一個核心上更新 AWS IoT Greengrass Core 軟體的任務。取代範例值,然後執行命令。
該命令會傳回下列回應。
{ "IotJobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "IotJobArn": "arn:aws:iot:
region
:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "PlatformSoftwareVersion": "1.10.1" } -
從回應複製
IoTJobId
。 -
呼叫 DescribeJobAWS IoT CoreAPI 以查看工作狀態。以您的任務 ID 取代範例值,然後執行命令。
aws iot describe-job --job-id GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE
此命令會傳回包含任務相關資訊的回應物件,包括
status
和jobProcessDetails
。{ "job": { "jobArn": "arn:aws:iot:
region
:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "jobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "targetSelection": "SNAPSHOT", "status": "IN_PROGRESS", "targets": [ "arn:aws:iot:region
:123456789012:thing/myCoreDevice" ], "description": "This job was created by Greengrass to update the Greengrass Cores in the targets with version 1.10.1 of the core software running on x86_64 architecture.", "presignedUrlConfig": { "roleArn": "arn:aws::iam::123456789012:role/myS3UrlSignerRole", "expiresInSec": 3600 }, "jobExecutionsRolloutConfig": {}, "createdAt": 1588718249.079, "lastUpdatedAt": 1588718253.419, "jobProcessDetails": { "numberOfCanceledThings": 0, "numberOfSucceededThings": 0, "numberOfFailedThings": 0, "numberOfRejectedThings": 0, "numberOfQueuedThings": 1, "numberOfInProgressThings": 0, "numberOfRemovedThings": 0, "numberOfTimedOutThings": 0 }, "timeoutConfig": {} } }
如需故障診斷協助,請參閱AWS IoT Greengrass 疑難排解。
-
CreateSoftwareUpdateJob API
您可以使用 CreateSoftwareUpdateJob
API 更新核心裝置上的AWS IoT Greengrass核心軟體或 OTA 更新代理程式軟體。此 API 會建立 AWS IoT 快照任務,在有可用更新時通知裝置。呼叫 CreateSoftwareUpdateJob
之後,您可以使用其他 AWS IoT 任務命令來追蹤軟體更新。如需詳細資訊,請參閱AWS IoT開發人員指南中的工作。
以下範例說明如何使用 AWS CLI 來建立更新核心裝置上 AWS IoT Greengrass 核心軟體的任務:
aws greengrass create-software-update-job \ --update-targets-architecture x86_64 \ --update-targets [\"arn:aws:iot:
region
:123456789012:thing/myCoreDevice\"] \ --update-targets-operating-system ubuntu \ --software-to-update core \ --s3-url-signer-role arn:aws:iam::123456789012:role/myS3UrlSignerRole \ --update-agent-log-level WARN \ --amzn-client-token myClientToken1
create-software-update-job
命令會傳回一個 JSON 回應,其中包含任務 ID、任務 ARN,以及更新所安裝的軟體版本:
{
"IotJobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE",
"IotJobArn": "arn:aws:iot:region
:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE",
"PlatformSoftwareVersion": "1.9.2"
}
如需說明如何使用 create-software-update-job
更新核心裝置的步驟,請參閱 建立 OTA 更新。
create-software-update-job
命令具有下列參數:
--update-targets-architecture
-
核心裝置的架構。
有效值:
armv7l
、armv6l
、x86_64
或aarch64
--update-targets
-
要更新的核心。此清單可包含個別核心的 ARN,以及其成員為核心之物件群組的 ARN。如需有關物件群組的詳細資訊,請參閱AWS IoT開發人員指南中的靜態物件群組。
--update-targets-operating-system
-
核心裝置的作業系統。
有效值:
ubuntu
、amazon_linux
、raspbian
或openwrt
--software-to-update
-
指定是否應更新核心的軟體或 OTA 更新代理程式軟體。
有效值:
core
或ota_agent
--s3-url-signer-role
-
IAM 角色的 ARN 用來預先簽署連結至AWS IoT Greengrass軟體更新成品的 Amazon S3 URL。角色的附加權限原則必須允許對目標AWS 區域中的值區
s3:GetObject
執行動作。角色也必須允許iot.amazonaws.com
將角色擔任為信任的實體。如需詳細資訊,請參閱OTA 更新的 IAM 許可。 --amzn-client-token
-
(選用) 使用用戶端字符發出等冪請求。提供一組唯一的字符,避免因內部重新嘗試而產生重複更新。
--update-agent-log-level
-
(選擇性) OTA 更新代理程式所產生之記錄陳述式的記錄層級。預設值為
ERROR
。有效值:
NONE
、TRACE
、DEBUG
、VERBOSE
、INFO
、WARN
、ERROR
或FATAL
注意
CreateSoftwareUpdateJob
僅接受下列支援架構和作業系統組合的要求:
-
ubuntu/x86_64
-
ubuntu/aarch64
-
amazon_linux/x86_64
-
raspbian/armv7l
-
raspbian/armv6l
-
openwrt/aarch64
-
openwrt/armv7l