使用用戶端裝置設定 AWS IoT Greengrass 並進行疑難排解 - AWS 方案指引

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

使用用戶端裝置設定 AWS IoT Greengrass 並進行疑難排解

由馬魯安·塞菲亞尼和阿卡蘭卡·德席爾瓦(AWS)創建

環境:PoC 或試點

技術:IoT

AWS 服務:AWS IoT Core;AWS 物聯網核心

Summary

AWS IoT Greengrass 是開放原始碼邊緣執行階段和雲端服務,用於在邊緣裝置上建置、部署和管理物聯網 (IoT) 軟體。AWS 物聯網網路環境的使用案例包括:

  • 使用 AWS IoT Greengrass 閘道作為家庭自動化中樞的智慧家庭

  • AWS IoT Greengrass 可協助從現場擷取和本機處理資料的智慧工廠

AWS IoT Greengrass 可做為其他邊緣裝置 (也稱為用戶端裝置) 的安全、經驗證的 MQTT 連線端點,否則通常會直接連線到 AWS IoT Core。當用戶端裝置無法直接存取 AWS IoT Core 端點的網路時,此功能非常有用。

您可以針對下列使用案例設定 AWS IoT Greengrass 以搭配用戶端裝置使用:

  • 對於用戶端裝置將資料傳送到 AWS IoT Greengrass

  • 讓 AWS IoT Greengrass 路轉寄資料到 AWS IoT Core

  • 利用進階 AWS IoT Core 規則引擎功能

這些功能需要在 AWS IoT Greengrass 裝置上安裝和設定下列元件:

  • MQTT 經紀商

  • MQTT 大橋

  • 用戶端裝置驗證

  • IP 偵測器

此外,來自用戶端裝置的已發佈訊息必須採用 JSON 格式或通訊協定緩衝區 (protobuf) 格式。

此模式說明如何安裝和設定這些必要元件,並提供疑難排解提示和最佳做法。

先決條件和限制

先決條件

限制

  • 您必須選擇可使用 AWS IoT 核心的 AWS 區域。如需目前 AWS IoT Core 的區域清單,請參閱 AWS 服務 (按區域分類)。

  • 核心裝置必須至少有 172 MB 記憶體和 512 MB 的磁碟空間。

架構

下圖顯示此模式的解決方案架構。

使用用戶端裝置設定 AWS IoT Greengrass 的解決方案架構

該架構包括:

  • 兩個用戶端裝置。每個裝置都包含私密金鑰、裝置憑證和根憑證授權單位 (CA) 憑證。包含 MQTT 用戶端的 AWS IoT 裝置開發套件也會安裝在每個用戶端裝置上。

  • 已部署 AWS IoT Greengrass 的核心裝置,其中包含下列元件:

    • MQTT 經紀商

    • MQTT 大橋

    • 用戶端裝置驗證

    • IP 偵測器

此架構支援下列案例:

  • 用戶端裝置可以使用其 MQTT 用戶端,透過核心裝置的 MQTT 代理程式彼此通訊。

  • 用戶端裝置也可以透過核心裝置的 MQTT 代理程式和 MQTT 橋接器與雲端中的 AWS IoT Core 通訊。

  • 雲端中的 AWS IoT Core 可透過 MQTT 測試用戶端以及核心裝置的 MQTT 橋接器和 MQTT 代理程式,將訊息傳送到用戶端裝置。

如需有關用戶端裝置與核心裝置之間通訊的詳細資訊,請參閱其他資訊一節。

工具

AWS 服務

  • AWS IoT Greengrass 是開放原始碼物聯網 (IoT) 邊緣執行階段和雲端服務,可協助您在裝置上建置、部署和管理 IoT 應用程式。

  • AWS IoT Core 為連線到網際網路的裝置提供安全的雙向通訊,以連線到 AWS 雲端。

  • AWS IoT Device SDK 是一套軟體開發套件,其中包含開放原始碼程式庫、含範例的開發人員指南,以及移植指南,讓您可以在自己選擇的硬體平台上建置創新的 IoT 產品或解決方案。

  • AWS Identity and Access Management (IAM) 可透過控制誰經過身份驗證和授權使用 AWS 資源,協助您安全地管理對 AWS 資源的存取。

最佳實務

  • 來自用戶端裝置的訊息承載應採用 JSON 或 Protobuf 格式,才能利用 AWS IoT Core 規則引擎的進階功能,例如轉換和條件式動作。

  • 設定 MQTT 橋接器以允許雙向通訊。

  • 在 AWS IoT Greengrass 中設定和部署 IP 偵測器元件,以確保核心裝置的 IP 位址包含在 MQTT 代理程式憑證的主體替代名稱 (SAN) 欄位中。

史诗

任務描述所需技能

在您的核心裝置上設 AWS IoT Greengrass 境。

遵循開發人員指南中的指示,安裝 AWS IoT Greengrass 核心軟體。

AWS IoT Greengrass

檢查您的安裝狀態。

使用下列命令檢查核心裝置上 AWS IoT Greengrass 服務的狀態:

sudo systemctl status greengrass.service

該命令的預期輸出是:

Launched Nucleus successfully
一般 AWS

設定 IAM 政策並將其附加到 Greengrass 服務角色。

  1. 建立 IAM 政策以允許進出 MQTT 橋接器的通訊。以下是一個示例策略:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" }, { "Sid": "GreengrassActions", "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": "*" } ] }
  2. 將原則附加至 Greengrass 服務角色。若要取得服務角色,請使用下列命令:

    aws greengrassv2 get-service-role-for-account --region <region>

    其中<region>指的是您的 AWS 區域。

一般 AWS

在 AWS IoT Greengrass 核心裝置中設定和部署必要的元件。

設定及部署下列元件:

AWS IoT Greengrass

確認 MQTT 橋接器允許雙向通訊。

若要在用戶端裝置和 AWS IoT Core 之間轉送 MQTT 訊息,請設定和部署 MQTT 橋接器元件,並指定要轉送的主題。範例如下:

{ "mqttTopicMapping": { "ClientDevicesToCloud": { "topic": "dt/#", "source": "LocalMqtt", "target": "IotCore" }, "CloudToClientDevices": { "topic": "cmd/#", "source": "IotCore", "target": "LocalMqtt" } } }
AWS IoT Greengrass

確認 auth 組件允許客戶端設備連接和發布或訂閱主題。

下列aws.greengrass.clientdevices.Auth組態可讓所有用戶端裝置連線、發佈訊息和訂閱所有主題。

{ "deviceGroups": { "formatVersion": "2021-03-05", "definitions": { "MyPermissiveDeviceGroup": { "selectionRule": "thingName: *", "policyName": "MyPermissivePolicy" } }, "policies": { "MyPermissivePolicy": { "AllowAll": { "statementDescription": "Allow client devices to perform all actions.", "operations": [ "*" ], "resources": [ "*" ] } } } } }
AWS IoT Greengrass
任務描述所需技能

安裝 AWS IoT 裝置開發套件。

在用戶端裝置上安裝 AWS IoT 裝置開發套件。如需支援語言和相關開發套件的完整清單,請參閱 AWS IoT Core 文件

例如,適用於 Python 開發套件的 AWS IoT 裝置開發套件位於上 GitHub。若要安裝此 SDK:

  1. 確認已安裝 Python 3.7 或更新版本,按照 GitHub 存放庫的 [必要條件] 頁面上的指示。

  2. 使用 pip 命令來安裝 SDK。

    對於 MacOS 系統和 Linux:

    python3 -m pip install awsiotsdk

    針對 Windows:

    python -m pip install awsiotsdk

或者,您也可以從來源儲存庫安裝 SDK:

# Create a workspace directory to hold all the SDK files mkdir sdk-workspace cd sdk-workspace # Clone the repository git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git # Install using Pip (use 'python' instead of 'python3' on Windows) python3 -m pip install ./aws-iot-device-sdk-python-v2
一般 AWS IoT

創建一個東西。

  1. AWS IoT 主控台中,如果出現 [開始使用] 按鈕,請選擇該按鈕。否則,請在功能窗格中選擇 [安全性]、[則]。

  2. 如果 [您還沒有任何策略] 對話方塊出現,請選擇 [建立策略]。否則,請選擇 Create (建立)。

  3. 輸入 AWS IoT 政策的名稱 (例如,ClientDevicePolicy)。

  4. [新增陳述式] 區段中,以下列 JSON 程式碼取代現有原則。<account>以您<region>的 AWS 區域和 AWS 帳戶號碼取代和。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account:client/*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account:thing/*" } ] }
  5. 選擇建立

  6. AWS IoT 主控台的導覽窗格中,選擇管理物件

  7. 如果顯示 [您尚未擁有任何物件] 對話方塊,請選擇 [註冊物件]。否則,請選擇 Create (建立)。

  8. Creating AWS IoT things (建立 AWS IoT 物件) 頁面上,選擇 Create a single thing (建立單一物件)。

  9. Add your device to the device registry (將裝置新增至裝置登錄檔) 頁面上,輸入您 IoT 物件的名稱 (例如 ClientDevice1),然後選擇 Next (下一步)

    附註:您無法在建立物件之後變更該物件的名稱。若要變更名稱,您必須建立新物件,為其指定新名稱,然後刪除舊物件。

  10. Add a certificate for your thing (新增物件的憑證) 頁面上,選擇 Create certificate (建立憑證)

  11. 選擇 Download (下載) 連結來下載憑證、私有金鑰和根憑證授權機構憑證。

    重要事項:這是您下載憑證和私密金鑰的唯一機會。

  12. 若要啟用憑證,請選擇 Activate (啟用)。憑證必須處於作用中狀態,裝置才能連線到 AWS IoT。

  13. 選擇 Attach a policy (連接政策)

  14. 針對 [新增物件的原則] ClientDevicePolicy,選擇 [註冊物件]。

AWS IoT Core

從核心裝置下載 CA 憑證。

如果您希望 Greengrass 核心裝置可以在離線環境中運作,則必須將 Greengrass 核心 CA 憑證提供給用戶端裝置,以便它可以驗證 MQTT 代理程式的憑證 (由 Greengrass 核心 CA 核心 CA 核心)。因此,取得此憑證的副本非常重要。使用下列其中一種方法來下載 CA 憑證:

  • 如果您可以從電腦存取 AWS IoT Greengrass 裝置,請https://<device IP>:8883在網頁瀏覽器中輸入並檢視 MQTT 代理程式憑證和 CA 憑證。您也可以將 CA 憑證儲存到用戶端裝置。

  • 或者,您也可以使用 OpenSSL 命令列:

    openssl s_client -showcerts -connect <device IP>:8883
一般 AWS

複製用戶端裝置中的認證。

複製 Greengrass 核心 CA 憑證、裝置憑證和用戶端裝置中的私密金鑰。

一般 AWS

建立用戶端裝置與核心裝置的關聯。

將用戶端裝置與核心裝置建立關聯,以便他們可以探索核心裝置。然後,用戶端裝置可以使用 Greengrass 探索 API 擷取其關聯核心裝置的連線資訊和憑證。如需詳細資訊,請參閱 AWS IoT Greengrass 文件中的關聯用戶端裝置

  1. AWS IoT Greengrass 主控台上,選擇核心裝置。

  2. 選擇要管理的核心裝置。

  3. 在核心裝置的詳細資料頁面上,選擇 [用戶端裝置] 索引標籤。

  4. 關聯的用戶端裝置區段中,選擇關聯用戶端裝置

  5. 在「將用戶端裝置與核心裝置建立關聯」模式中,針對要關聯的每個用戶端裝置執行下列動作

    1. 輸入要建立為用戶端裝置關聯的 AWS IoT 物件的名稱。

    2. 選擇新增

  6. 選擇關聯

您關聯的用戶端裝置現在可以使用 Greengrass 探索 API 來探索此核心裝置。

AWS IoT Greengrass
任務描述所需技能

將資料從一個用戶端裝置傳送到另一個用戶端裝置。

使用裝置中的 MQTT 用戶端發佈有關該主題的dt/client1/sensor訊息。

一般 AWS

將資料從用戶端裝置傳送到 AWS IoT Core。

使用裝置中的 MQTT 用戶端發佈有關該主題的dt/client1/sensor訊息。

在 MQTT 測試用戶端中,訂閱裝置傳送訊息的主題,或訂閱 # 以取得所有主題 (請參閱詳細資訊)。

一般 AWS

將訊息從 AWS IoT Core 傳送到用戶端裝置。

在 MQTT 測試用戶端頁面的 [發佈至主題] 索引標籤的 [主題名稱] 欄位中,輸入郵件的主題名稱。在此範例中,請用cmd/client1於主題。

一般 AWS

故障診斷

問題解決方案

無法驗證伺服器憑證錯誤

當 MQTT 用戶端無法在 TLS 交涉期間驗證 MQTT 代理程式提供的憑證時,就會發生這個錯誤。最常見的原因是 MQTT 用戶端沒有 CA 憑證。請依照下列步驟確定已將 CA 憑證提供給 MQTT 用戶端。

  1. 如果您可以從電腦存取 AWS IoT Greengrass 裝置,請https://<device IP>:8883在瀏覽器視窗中輸入以檢視 MQTT 代理程式憑證和 CA 憑證。您也可以將 CA 憑證儲存到用戶端裝置。

    或者,您也可以使用 OpenSSL 命令列:

    openssl s_client -showcerts -connect <device IP>:8883
  2. 將 Moquette CA 和 Greengrass 核心 CA 證書的內容保存到文件中,然後使用以下命令查看解碼的內容:

    openssl x509 -in <Name of CA>.pem -text

    模型 CA 憑證應該會顯示 SAN 欄位,如下列範例所示:

    X509v3 Subject Alternative Name: IP Address:XXX.XXX.XXX.XXX, IP Address:127.0.0.1, DNS:localhost

無法驗證伺服器名稱錯誤

當 MQTT 用戶端無法驗證它是否連線到正確的伺服器時,就會發生這個錯誤。最常見的原因是 Greengrass 裝置的 IP 位址未列在憑證的 SAN 欄位中。

依照上一個解決方案中的指示取得 MQTT 代理程式憑證,並確認 SAN 欄位包含 AWS IoT Greengrass 裝置的 IP 位址,如其他資訊一節所述。如果沒有,請確認 IP 偵測器元件已正確安裝,然後重新啟動核心裝置。

僅在從內嵌式用戶端裝置連線時無法驗證伺服器名稱

Mmbed TLS 是內嵌裝置中常用的 TLS 程式庫,目前僅在憑證的 SAN 欄位中支援 DNS 名稱驗證,如 Mmbed TLS 程式庫程式碼所示。由於核心裝置沒有自己的網域名稱,而且取決於 IP 位址,因此使用 Mmbed TLS 的 TLS 用戶端在 TLS 交涉期間會失敗伺服器名稱驗證,進而導致連線失敗。我們建議您在 x50 9_crt_check_san 功能中,將 SAN IP 位址驗證新增至您的 MBed TLS 程式庫中。

相關資源

其他資訊

本節提供有關用戶端裝置與核心裝置之間通訊的其他資訊。

MQTT 代理程式會接聽核心裝置中的連接埠 8883,以進行 TLS 用戶端連線嘗試。下圖顯示 MQTT 代理程式的伺服器憑證範例。

MQTT 代理程式伺服器憑證範例

範例憑證會顯示下列詳細資料:

  • 此憑證是由 AWS IoT Greengrass 核心 CA 核心 CA 所發行,該 CA 是本機且特定於核心裝置的;也就是說,它充當本機 CA。

  • 此證書每週由客戶端 auth 組件自動輪換,如下圖所示。您可以在客戶端身份驗證組件配置中設置此間隔。

輪換 MQTT 代理程式的伺服器憑證
  • 主體別名 (SAN) 在 TLS 用戶端的伺服器名稱驗證中扮演重要角色。它可協助 TLS 用戶端確保其連線到正確的伺服器,並協助避免 TLS 工作階段設定期間的 man-in-the-middle 攻擊。在示例證書中,SAN 字段表示該服務器正在本地主機上監聽(本地 Unix 域套接字),並且網絡接口具有 IP 地址 192.168.1.12。

TLS 用戶端會使用憑證中的 SAN 欄位來驗證在伺服器驗證期間是否連線到合法伺服器。相反地,在 HTTP 伺服器與瀏覽器之間進行一般 TLS 交換期間,在伺服器驗證程序期間,會使用一般名稱 (CN) 欄位或 SAN 欄位中的網域名稱來交叉檢查瀏覽器實際連線的網域。如果核心裝置沒有網域名稱,SAN 欄位中包含的 IP 位址就會有相同的用途。如需詳細資訊,請參閱 RFC 5280 — 網際網路 X.509 公開金鑰基礎結構憑證和憑證撤銷清單 (CRL) 設定檔的主體替代名稱一節

AWS IoT Greengrass 中的第個 IP 偵測器元件可確保憑證的 SAN 欄位中包含正確的 IP 位址。

範例中的憑證是由做為本機 CA 的 AWS IoT Greengrass 裝置簽署。TLS 用戶端 (MQTT 用戶端) 不知道此 CA,因此我們必須提供如下所示的 CA 憑證。

CA 憑證範例