AWS IoT Greengrass 核心軟體的 OTA 更新 - AWS IoT Greengrass

若我們提供該指南英語版本的翻譯,在有任何牴觸的狀況下請以英文版本的指南為主。其透過機器翻譯提供翻譯。

AWS IoT Greengrass 核心軟體的 OTA 更新

AWS IoT Greengrass 核心軟體套件包含可以執行 AWS IoT Greengrass 軟體無線 (OTA) 更新的更新代理程式。您可以使用 OTA 更新,在一或多個核心上安裝最新版的 AWS IoT Greengrass 核心軟體或 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 Core 軟體執行時間使用量需求。如需詳細資訊,請參閱 Amazon Web Services 一般參考 中的 Greengrass 核心的服務配額

  • Greengrass 核心必須與 AWS 雲端連線。

  • Greengrass 核心必須正確設定並佈建憑證和金鑰,以便使用 AWS IoT Core 和 AWS IoT Greengrass 進行身份驗證。如需詳細資訊,請參閱 X.509 憑證

  • Greengrass 核心無法設定為使用網路代理。

    注意

    從 AWS IoT Greengrass v1.9.3 開始,將 MQTT 流量設定為使用連接埠 443 的核心便已支援 OTA 更新 (預設連接埠 8883 的核心未支援)。不過,OTA 更新代理程式 不支援透過網路代理進行更新。如需詳細資訊,請參閱 連線至連接埠 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 中的軟體更新成品。如需詳細資訊,請參閱 IAM OTA 更新的許可

IAM OTA 更新的許可

AWS IoT Greengrass 發行新版本的 AWS IoT Greengrass Core 軟體時,AWS IoT Greengrass 會更新用於 OTA 更新、存放於 Amazon S3 的軟體成品。

您的 AWS 帳戶必須包含可用來存取這些成品的 Amazon S3 URL 簽署者角色。該角色必須具有允許對目標 AWS 區域中儲存貯體執行 s3:GetObject 動作的許可政策。該角色也必須具有允許 iot.amazonaws.com 將角色視為信任實體的信任政策。

許可政策

針對角色許可,您可以使用 AWS 受管政策或建立自訂政策。

  • 使用 AWS 受管政策

    GreengrassOTAUpdateArtifactAccess 受管政策是由 AWS IoT Greengrass 提供。如果您想要允許在目前和未來由 AWS IoT Greengrass 支援的所有 AWS 區域中進行存取,請使用此政策。

  • 建立自訂政策

    如果您想要明確指定核心部署的 AWS 區域,則應建立自訂政策。以下範例政策允許在六個區域中存取 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:CreateSoftwareUpdateJobiot: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 目錄。

您可以手動執行二進位檔以啟動 OTA 更新代理程式,或將其整合為 init 指令碼,如 systemd 服務檔案。二進位檔應做為根執行。啟動時,OTA 更新代理程式 會從 AWS IoT Core 接聽 AWS IoT Greengrass 軟體更新任務,並依序執行。OTA 更新代理程式 會忽略所有其他 AWS IoT 任務類型。

屬於更新目標的核心不得執行兩個 OTA 更新代理程式 的執行個體。這麼做會讓兩個代理程式處理相同的任務,而造成衝突。

與初始化系統整合

在 OTA 更新期間,OTA 更新代理程式 會重新啟動核心上的二進位檔案。如果二進位檔案正在執行,當初始化系統在更新期間監控 AWS IoT Greengrass Core 軟體或代理程式的狀態時,這可能會造成衝突。

為了協助整合 OTA 更新機制與監控策略,您可以撰寫在更新前後執行的 shell 指令碼。例如,您可以撰寫指令碼來備份資料或在裝置關機之前停止處理程序。若要告訴 OTA 更新代理程式 執行這些指令碼,您必須包含在 config.json 檔案裡的 "managedRespawn" : true 標記。此設定會顯示在下列摘錄中:

{ "coreThing": { … }, "runtime": { … }, "managedRespawn": true … }

managedRespawn 設定為 true 時,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

透過 OTA 更新受管的 respawn

如果 managedRespawn 設定為 true,則 OTA 更新代理程式 會在軟體更新前後檢查 /greengrass-root/usr/scripts 目錄中是否有指令碼。如果指令碼不存在,則更新失敗。

  • 針對 AWS IoT Greengrass 核心軟體的 OTA 更新:

    在開始更新之前,代理程式會執行 ggc_pre_update.sh 指令碼。完成更新後,代理程式會執行 ggc_post_update.sh 指令碼。

  • OTA 更新代理程式 軟體的 OTA 更新:

    在開始更新之前,代理程式會執行 ota_pre_update.sh 指令碼。完成更新後,代理程式會執行 ota_post_update.sh 指令碼。

如果 managedRespawn 設定為 true,則適用下列需求:

  • 您必須將下列指令碼新增至/greengrass-root/usr/scripts 目錄:

    • ggc_pre_update.sh

    • ggc_post_update.sh

    • ota_pre_update.sh

    • ota_post_update.sh

  • 指令碼必須傳回成功的傳回碼。

  • 這些指令碼必須由根目錄擁有,而且只能由根目錄執行。

注意

如果 managedRespawn 設定為 false,則 OTA 更新代理程式 不會執行指令碼。

建立 OTA 更新

請依照下列步驟在一或多個核心上執行 AWS IoT Greengrass 軟體的 OTA 更新:

  1. 確定您的核心符合 OTA 更新的要求

    注意

    如果您已設定初始化系統來管理 AWS IoT Greengrass Core 軟體或 OTA 更新代理程式,請在您的核心上確認下列項目:

    • 指定 "managedRespawn" : trueconfig.json 檔案。

    • /greengrass-root/usr/scripts 目錄包含下列指令碼:

      • ggc_pre_update.sh

      • ggc_post_update.sh

      • ota_pre_update.sh

      • ota_post_update.sh

    如需更多詳細資訊,請參閱 與初始化系統整合

  2. 在核心裝置終端機中,啟動 OTA 更新代理程式。

    cd /greengrass-root/ota/ota_agent sudo ./ggc-ota
    注意

    greengrass-root 代表 AWS IoT Greengrass 核心軟體在裝置上安裝所在的路徑。通常,這是 /greengrass 目錄。

    不要在核心上啟動多個 OTA 更新代理程式 的執行個體,因為它可能會導致衝突。

  3. 使用 AWS IoT 主控台 或 AWS IoT Greengrass API 建立軟體更新任務。

     

    使用主控台
    1. 在 AWS IoT 主控台 中,選擇 Manage (管理),然後選擇 Jobs (任務)

    2. 選擇 Create (建立),然後選擇 Create Core update job (建立核心更新任務)

    3. Create a Greengrass update (建立 Greengrass 更新) 頁面上,定義更新任務的屬性,然後選擇 Create (建立)。例如:

      • 針對 Select devices to update (選取要更新的裝置),請選擇要更新的核心。您可以選擇包含核心的單個核心物件和物件群組。

      • 針對 S3 URL Signer Role (S3 URL 簽署者角色),請選擇您的 signer role (簽署者角色)

      • Select what component of the Greengrass Core you want to update (選取您要更新的 Greengrass Core 的元件) 中,選擇更新 AWS IoT Greengrass 核心軟體或 以更新 OTA 更新代理程式 軟體。

    4. Jobs (任務) 頁面上,選擇您的新任務以查看更新狀態。

     

    Use the API (使用 API)
    1. 呼叫 CreateSoftwareUpdateJob API。在此範例程序中,我們使用 AWS CLI 命令。

      下面的命令會建立在一個核心上更新 AWS IoT Greengrass Core 軟體的任務。取代範例值,然後執行命令。

      Linux or macOS terminal
      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
      Windows command prompt
      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

      該命令會傳回下列回應。

      { "IotJobId": "GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "IotJobArn": "arn:aws:iot:region:123456789012:job/GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE", "PlatformSoftwareVersion": "1.10.1" }
    2. 從回應複製 IoTJobId

    3. 在 AWS IoT Core API 中呼叫 DescribeJob 以查看任務狀態。以您的任務 ID 取代範例值,然後執行命令。

      aws iot describe-job --job-id GreengrassUpdateJob_c3bd7f36-ee80-4d42-8321-a1da0EXAMPLE

      此命令會傳回包含任務相關資訊的回應物件,包括 statusjobProcessDetails

      { "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 Core 軟體或 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

核心裝置的架構。

有效值:armv7larmv6lx86_64aarch64

--update-targets

要更新的核心。此清單可包含個別核心的 ARN,以及其成員為核心之物件群組的 ARN。如需物件群組的詳細資訊,請參閱 AWS IoT 開發人員指南 中的靜態物件群組

--update-targets-operating-system

核心裝置的作業系統。

有效值:ubuntuamazon_linuxraspbianopenwrt

--software-to-update

指定應該更新的是核心的軟體或 OTA 更新代理程式軟體。

有效值:coreota_agent

--s3-url-signer-role

用來預先簽署連結至 AWS IoT Greengrass 軟體更新成品之 Amazon S3 URL 的 IAM 角色 ARN。角色的連接許可政策必須允許對目標 AWS 區域中的儲存貯體執行 s3:GetObject 動作。角色也必須允許 iot.amazonaws.com 將角色擔任為信任的實體。如需詳細資訊,請參閱 IAM OTA 更新的許可

--amzn-client-token

(選用) 使用用戶端字符發出等冪請求。提供一組唯一的字符,避免因內部重新嘗試而產生重複更新。

--update-agent-log-level

(選用) OTA 更新代理程式為日誌陳述式產生記錄等級。預設值為 ERROR

有效值:NONETRACEDEBUGVERBOSEINFOWARNERRORFATAL

注意

CreateSoftwareUpdateJob 僅接受下列支援架構和作業系統組合的要求:

  • ubuntu/x86_64

  • ubuntu/aarch64

  • amazon_linux/x86_64

  • raspbian/armv7l

  • raspbian/armv6l

  • openwrt/aarch64

  • openwrt/armv7l