

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

# 使用用戶端裝置設定 AWS IoT Greengrass 並進行疑難排解
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices"></a>

*Marouane Sefiani 和 Akalanka De Silva，Amazon Web Services*

## 總結
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-summary"></a>

AWS IoT Greengrass 是一種開放原始碼節點執行期和雲端服務，可在邊緣裝置上建置、部署和管理物聯網 (IoT) 軟體。AWS IoT Greengrass 的使用案例包括：
+ 使用 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)](https://protobuf.dev/) 格式。

此模式說明如何安裝和設定這些必要的元件，並提供疑難排解秘訣和最佳實務。

## 先決條件和限制
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ [AWS 命令列界面 (AWS CLI) 第 2 版](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)
+ 執行 Python 3.7 或更新版本的兩個用戶端裝置
+ 執行 Java 執行期環境 (JRE) 第 8 版或更新版本的單一核心裝置，以及 [Amazon Corretto 11](https://aws.amazon.com/corretto/) 或 [OpenJDK 11](https://openjdk.java.net/)

**限制**
+ 您必須選擇可使用 AWS IoT Core 的 AWS 區域。如需 AWS IoT Core 區域的最新清單，請參閱[依區域的 AWS 服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。
+ 核心裝置必須至少有 172 MB RAM 和 512 MB 的磁碟空間。

## Architecture
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-architecture"></a>

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

![\[使用用戶端裝置設定 AWS IoT Greengrass 的解決方案架構\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/0656c5ae-d979-4cf7-be92-a46fa81cab0d.png)


架構包括：
+ 兩個用戶端裝置。每個裝置都包含私有金鑰、裝置憑證和根憑證授權單位 (CA) 憑證。包含 MQTT 用戶端的 AWS IoT 裝置 SDK 也會安裝在每個用戶端裝置上。
+ 使用下列元件部署 AWS IoT Greengrass 的核心裝置：
  + MQTT 代理程式
  + MQTT 橋接器
  + 用戶端裝置身分驗證
  + IP 偵測器

此架構支援下列案例：
+ 用戶端裝置可以使用其 MQTT 用戶端，透過核心裝置的 MQTT 代理程式彼此通訊。
+ 用戶端裝置也可以透過核心裝置的 MQTT 代理程式和 MQTT 橋接器，與雲端中的 AWS IoT Core 通訊。
+ 雲端中的 AWS IoT Core 可以透過 MQTT 測試用戶端和核心裝置的 MQTT 橋接器和 MQTT 代理程式，將訊息傳送至用戶端裝置。

如需用戶端裝置與核心裝置之間通訊的詳細資訊，請參閱[其他資訊](#set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional)一節。

## 工具
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-tools"></a>

**AWS 服務**
+ [AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html) 是開放原始碼物聯網 (IoT) 邊緣執行期和雲端服務，可協助您在裝置上建置、部署和管理 IoT 應用程式。
+ [AWS IoT Core](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html) 為連線網際網路的裝置提供安全的雙向通訊，以連線至 AWS 雲端。
+ [AWS IoT Device SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) 是一種軟體開發套件，其中包含開放原始碼程式庫、包含範例的開發人員指南，以及移植指南，讓您可以在所選的硬體平台上建置創新的 IoT 產品或解決方案。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。

## 最佳實務
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-best-practices"></a>
+ 來自用戶端裝置的訊息承載應該採用 JSON 或 Protobuf 格式，以便利用 AWS IoT Core 規則引擎的進階功能，例如轉換和條件式動作。
+ 設定 MQTT 橋接器以允許雙向通訊。
+ 在 AWS IoT Greengrass 中設定和部署 IP 偵測器元件，以確保核心裝置的 IP 地址包含在 MQTT 代理程式憑證的主體別名 (SAN) 欄位中。

## 史詩
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-epics"></a>

### 設定核心裝置
<a name="set-up-the-core-device"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在核心裝置上設定 AWS IoT Greengrass。 | 請依照[開發人員指南](https://docs.aws.amazon.com/greengrass/v2/developerguide/install-greengrass-core-v2.html)中的指示安裝 AWS IoT Greengrass Core 軟體。 | AWS IoT Greengrass | 
| 檢查安裝的狀態。 | 使用下列命令來檢查核心裝置上的 AWS IoT Greengrass 服務狀態：<pre>sudo systemctl status greengrass.service</pre>命令的預期輸出為：<pre>Launched Nucleus successfully</pre> | 一般 AWS | 
| 設定 IAM 政策並將其連接到 Greengrass 服務角色。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 一般 AWS | 
| 在 AWS IoT Greengrass 核心裝置中設定和部署必要的元件。 | 設定和部署下列元件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS IoT Greengrass | 
| 確認 MQTT 橋接器允許雙向通訊。 | 若要在用戶端裝置和 AWS IoT Core 之間轉送 MQTT 訊息，請設定和部署 MQTT 橋接器元件，並指定要轉送的主題。範例如下：<pre>{<br />  "mqttTopicMapping": {<br />    "ClientDevicesToCloud": {<br />      "topic": "dt/#",<br />      "source": "LocalMqtt",<br />      "target": "IotCore"<br />    },<br />    "CloudToClientDevices": {<br />      "topic": "cmd/#",<br />      "source": "IotCore",<br />      "target": "LocalMqtt"<br />    }<br />  }<br />}</pre> | AWS IoT Greengrass | 
| 確認身分驗證元件允許用戶端裝置連接和發佈或訂閱主題。 | 下列`aws.greengrass.clientdevices.Auth`組態允許所有用戶端裝置連線、發佈訊息和訂閱所有主題。<pre>{<br />  "deviceGroups": {<br />    "formatVersion": "2021-03-05",<br />    "definitions": {<br />      "MyPermissiveDeviceGroup": {<br />        "selectionRule": "thingName: *",<br />        "policyName": "MyPermissivePolicy"<br />      }<br />    },<br />    "policies": {<br />      "MyPermissivePolicy": {<br />        "AllowAll": {<br />          "statementDescription": "Allow client devices to perform all actions.",<br />          "operations": [<br />            "*"<br />          ],<br />          "resources": [<br />            "*"<br />          ]<br />        }<br />      }<br />    }<br />  }<br />}</pre> | AWS IoT Greengrass | 

### 設定用戶端裝置
<a name="set-up-client-devices"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 AWS IoT 裝置 SDK。 | 在用戶端裝置上安裝 AWS IoT 裝置 SDK。如需支援的語言和相關 SDKs 的完整清單，請參閱 [AWS IoT Core 文件](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)。例如，適用於 Python 的 AWS IoT 裝置 SDK [位於 GitHub](https://github.com/aws/aws-iot-device-sdk-python-v2)。若要安裝此 SDK：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html)或者，您可以從來源儲存庫安裝 SDK：<pre># Create a workspace directory to hold all the SDK files<br />mkdir sdk-workspace<br />cd sdk-workspace<br /># Clone the repository<br />git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git<br /># Install using Pip (use 'python' instead of 'python3' on Windows)<br />python3 -m pip install ./aws-iot-device-sdk-python-v2</pre> | 一般 AWS IoT | 
| 建立物件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS IoT Core | 
| 從 Greengrass 核心裝置下載 CA 憑證。 | 如果您預期 Greengrass 核心裝置可在離線環境中運作，您必須將 Greengrass 核心 CA 憑證提供給用戶端裝置，才能驗證 MQTT 代理程式的憑證 （由 Greengrass 核心 CA 發行）。因此，請務必取得此憑證的副本。使用下列其中一種方法來下載 CA 憑證：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 一般 AWS | 
| 在用戶端裝置中複製登入資料。 | 在用戶端裝置中複製 Greengrass 核心 CA 憑證、裝置憑證和私有金鑰。 | 一般 AWS | 
| 將用戶端裝置與核心裝置建立關聯。 | 將用戶端裝置與核心裝置建立關聯，以便他們可以探索核心裝置。然後，用戶端裝置可以使用 [Greengrass 探索 API](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-discover-api.html) 來擷取其相關聯核心裝置的連線資訊和憑證。如需詳細資訊，請參閱 AWS IoT Greengrass 文件中的[關聯用戶端裝置](https://docs.aws.amazon.com/greengrass/v2/developerguide/associate-client-devices.html)。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html)您相關聯的用戶端裝置現在可以使用 Greengrass 探索 API 來探索此核心裝置。 | AWS IoT Greengrass | 

### 傳送和接收資料
<a name="send-and-receive-data"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將資料從一個用戶端裝置傳送至另一個用戶端裝置。 | 使用裝置中的 MQTT 用戶端來發佈`dt/client1/sensor`主題的訊息。 | 一般 AWS | 
| 將資料從用戶端裝置傳送至 AWS IoT Core。 | 使用裝置中的 MQTT 用戶端來發佈`dt/client1/sensor`主題的訊息。在 MQTT 測試用戶端中，訂閱裝置傳送訊息的主題，或為所有主題訂閱 **\$1** （請參閱[詳細資訊](https://docs.aws.amazon.com/iot/latest/developerguide/view-mqtt-messages.html))。 | 一般 AWS | 
| 從 AWS IoT Core 傳送訊息至用戶端裝置。 | 在 MQTT 測試用戶端頁面上，在**發佈至主題**索引標籤的主題**名稱**欄位中，輸入訊息的主題名稱。在此範例中，針對 主題使用 `cmd/client1` 。 | 一般 AWS | 

## 疑難排解
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| **無法驗證伺服器憑證錯誤** | 當 MQTT 用戶端無法驗證 MQTT 代理程式在 TLS 交握期間提供的憑證時，會發生此錯誤。最常見的原因是 MQTT 用戶端沒有 CA 憑證。請依照下列步驟，確認 CA 憑證已提供給 MQTT 用戶端。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 
| **無法驗證伺服器名稱錯誤** | 當 MQTT 用戶端無法驗證其是否連線至正確的伺服器時，就會發生此錯誤。最常見的原因是 Greengrass 裝置的 IP 地址未列在憑證的 SAN 欄位中。依照先前解決方案中的指示取得 MQTT 代理程式憑證，並確認 SAN 欄位包含 AWS IoT Greengrass 裝置的 IP 地址，如[其他資訊](#set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional)一節所述。如果沒有，請確認 IP 偵測器元件已正確安裝，然後重新啟動核心裝置。 | 
| **只有在從內嵌用戶端裝置連線時，才能驗證伺服器名稱** | Mbed TLS 是內嵌裝置中使用的熱門 TLS 程式庫，目前僅支援憑證的 SAN 欄位中的 DNS 名稱驗證，如 Mbed TLS 程式庫程式碼所示。由於核心裝置沒有自己的網域名稱，且取決於 IP 地址，因此使用 Mbed TLS 的 TLS 用戶端會在 TLS 交握期間失敗伺服器名稱驗證，導致連線失敗。建議您在 [x509\$1crt\$1check\$1san 函數](https://github.com/Mbed-TLS/mbedtls/blob/6a327a5fdc2786cb50b4dbe5e3a75884a1f8435a/library/x509_crt.c#L2548)將 SAN IP 地址驗證新增至 Mbed TLS 程式庫。 | 

## 相關資源
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-resources"></a>
+ [AWS IoT Greengrass 文件](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html)
+ [AWS IoT Core 文件](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html)
+ [MQTT 代理程式元件](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-moquette-component.html)
+ [MQTT 橋接器元件](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-bridge-component.html)
+ [用戶端裝置身分驗證元件](https://docs.aws.amazon.com/greengrass/v2/developerguide/client-device-auth-component.html)
+ [IP 偵測器元件](https://docs.aws.amazon.com/greengrass/v2/developerguide/ip-detector-component.html)
+ [AWS IoT 裝置 SDK](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)
+ [使用 AWS IoT Greengrass 實作本機用戶端裝置](https://aws.amazon.com/blogs/iot/implementing-local-client-devices-with-aws-iot-greengrass/) (AWS 部落格文章）
+ [RFC 5280 – 網路 X.509 公有金鑰基礎設施憑證和憑證撤銷清單 (CRL) 設定檔](https://www.rfc-editor.org/rfc/rfc5280)

## 其他資訊
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional"></a>

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

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

![\[MQTT 代理程式伺服器憑證的範例\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/b2c324a1-60cd-4194-80e7-e5184662146a.png)


憑證範例會顯示下列詳細資訊：
+ 憑證由 AWS IoT Greengrass Core CA 發行，該 CA 是本機且專屬於核心裝置；也就是說，它充當本機 CA。
+ 用戶端身分驗證元件每週會自動輪換此憑證，如下圖所示。您可以在用戶端身分驗證元件組態中設定此間隔。

![\[輪換 MQTT 代理程式的伺服器憑證\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/65bcdc5c-a71c-4f52-adcd-21910fabfc2a.png)

+ 主體替代名稱 (SAN) 在 TLS 用戶端的伺服器名稱驗證中扮演重要角色。它有助於 TLS 用戶端確保連接到正確的伺服器，並有助於避免 man-in-the-middle攻擊。在範例憑證中，SAN 欄位表示此伺服器正在接聽 localhost （本機 Unix 網域通訊端），且網路介面具有 IP 地址 192.168.1.12。

TLS 用戶端使用憑證中的 SAN 欄位來驗證它在伺服器驗證期間是否連線到合法伺服器。相反地，在 HTTP 伺服器和瀏覽器之間的典型 TLS 交握期間，常用名稱 (CN) 欄位或 SAN 欄位中的網域名稱用於交叉檢查瀏覽器在伺服器驗證程序期間實際連接的網域。如果核心裝置沒有網域名稱，SAN 欄位中包含的 IP 地址具有相同的用途。如需詳細資訊，請參閱 *RFC 5280 – 網路 X.509 公有金鑰基礎設施憑證和憑證撤銷清單 (CRL) 設定檔*的[主體別名一節](https://www.rfc-editor.org/rfc/rfc5280#section-4.2.1.6)。

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

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

![\[CA 憑證範例\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/b08b3bcb-9e12-4f5a-9204-cf65ea32902f.png)
