

支援終止通知：2026 年 10 月 7 日 AWS 將停止 的支援 AWS IoT Greengrass Version 1。2026 年 10 月 7 日之後，您將無法再存取 AWS IoT Greengrass V1 資源。如需詳細資訊，請造訪[從 遷移 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# 單元 3 （第 1 部分）： 上的 Lambda 函數 AWS IoT Greengrass
<a name="module3-I"></a>

本單元說明如何建立和部署從 AWS IoT Greengrass 核心裝置傳送 MQTT 訊息的 Lambda 函數。模組說明 Lambda 函數組態、用於允許 MQTT 訊息傳送的訂閱，以及核心裝置的部署。

[模組 3 （第 2 部分）](module3-II.md) 涵蓋 AWS IoT Greengrass 核心上執行的隨需和長期 Lambda 函數之間的差異。

開始之前，請確定您已完成[單元 1](module1.md) 和[單元 2](module2.md)，並擁有執行中 AWS IoT Greengrass 的核心裝置。

**提示**  
或者，若要使用指令碼為您設定核心裝置，請參閱[快速入門：Greengrass 裝置安裝](quick-start.md)。指令碼也可以建立和部署此模組中使用的 Lambda 函數。

此單元需約 30 分鐘完成。

**Topics**
+ [建立和封裝 Lambda 函數](create-lambda.md)
+ [設定 的 Lambda 函數 AWS IoT Greengrass](config-lambda.md)
+ [部署雲端組態到 Greengrass 核心裝置](configs-core.md)
+ [驗證 Lambda 函數是否在核心裝置上執行](lambda-check.md)

# 建立和封裝 Lambda 函數
<a name="create-lambda"></a>

本模組中的範例 Python Lambda 函數使用適用於 Python [AWS IoT Greengrass 的核心 SDK](lambda-functions.md#lambda-sdks-core) 來發佈 MQTT 訊息。

在此步驟中，您：
+ 將適用於 Python AWS IoT Greengrass 的核心 SDK 下載到您的電腦 （而非 AWS IoT Greengrass 核心裝置）。
+ 建立包含函數程式碼和相依性的 Lambda 函數部署套件。
+ 使用 Lambda 主控台建立 Lambda 函數並上傳部署套件。
+ 發佈 Lambda 函數的版本，並建立指向該版本的別名。

您必須將 Python 3.7 安裝在核心裝置上，才能完成此單元。

 <a name="create-lambda-procedure"></a>

1. <a name="download-ggc-sdk"></a> 從[AWS IoT Greengrass 核心開發套件](what-is-gg.md#gg-core-sdk-download)下載頁面，將適用於 Python 的 AWS IoT Greengrass 核心開發套件下載至您的電腦。

1. 解壓縮下載的套件，以取得 Lambda 函數程式碼和 SDK。

   此模組中的 Lambda 函數使用：
   + `examples\HelloWorld` 中的 `greengrassHelloWorld.py` 檔案。這是您的 Lambda 函數程式碼。每隔五秒鐘，函數便會從可能發佈的訊息中二選一發佈給 `hello/world` 主題。
   + `greengrasssdk` 資料夾。此為軟體開發套件。

1. 將 `greengrasssdk` 資料夾複製到包含 `greengrassHelloWorld.py` 的 `HelloWorld` 資料夾中。

1. 若要建立 Lambda 函數部署套件，請將 `greengrassHelloWorld.py`和 `greengrasssdk` 資料夾儲存至名為 的壓縮`zip`檔案`hello_world_python_lambda.zip`。`py` 檔案和 `greengrasssdk` 資料夾必須為在目錄的根內。  
![\[螢幕擷取畫面顯示 hello_word_python_lambda.zip 的壓縮內容。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-017.png)

   在 UNIX 式系統 (包括 Mac 終端機) 上，可使用以下命令來封裝檔案和資料夾：

   ```
   zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py
   ```
**注意**  
取決於您的發行版本，您可能需要先安裝 `zip` (例如透過執行 `sudo apt-get install zip`)。適用於您發行版本的安裝命令可能會有所不同。

   現在您已準備好建立 Lambda 函數並上傳部署套件。

1. 開啟 Lambda 主控台，然後選擇**建立函數**。

1. 選擇**從頭開始撰寫**。

1. 將您的函數命名為 **Greengrass\$1HelloWorld**，並將其餘的欄位設定如下：
   + 針對**執行期**，選擇 **Python 3.7**。
   + 對於**許可**，請保留預設設定。這會建立授予基本 Lambda 許可的執行角色。不會使用此角色 AWS IoT Greengrass。

   選擇 **Create function (建立函數)**。

1. 上傳您的 Lambda 函數部署套件：

   1. <a name="lambda-console-upload"></a>在**程式碼**索引標籤的**程式碼來源**下，選擇**從中上傳**。從下拉式清單中選擇 **.zip 檔案**。  
![\[從下拉式清單上傳，並反白顯示 .zip 檔案。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. 選擇**上傳**，然後選擇您的`hello_world_python_lambda.zip`部署套件。然後選擇 **Save (儲存)**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函數的**程式碼**索引標籤的**執行時間設定**下，選擇**編輯**，然後輸入下列值。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於 **Handler (處理常式)**，輸入 **greengrassHelloWorld.function\$1handler**。  
![\[「執行時間設定」區段，其中「執行時間」欄位設定為「Python 3.7」，而「Handler」欄位設定為「greengrassHelloWorld.function_handler".\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-023-2.png)

   1. <a name="lambda-console-save-config"></a>選擇 **Save** (儲存)。
**注意**  
 AWS Lambda 主控台上的**測試**按鈕不適用於此函數。 AWS IoT Greengrass 核心 SDK 不包含在 AWS Lambda 主控台中獨立執行 Greengrass Lambda 函數所需的模組。這些模組 （例如 `greengrass_common`) 會在部署到您的 Greengrass 核心之後提供給函數。

1. <a name="publish-function-version"></a>發佈 Lambda 函數：

   1. 從頁面頂端**的動作**選單中，選擇**發佈新版本**。  
![\[[操作] 功能表的螢幕擷取畫面反白顯示 [發行新版本]。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-026.png)

   1. 針對 **Version description (版本描述)**，輸入 **First version**，然後選擇 **Publish (發佈)**。  
![\[螢幕擷取畫面的 [版本描述] 欄位設反白顯示 [第一個版本]和 [發佈] 按鈕。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-027.png)

1. <a name="create-version-alias"></a>建立 Lambda 函數[版本的](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)[別名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)：
**注意**  
Greengrass 群組可以依別名 （建議） 或版本參考 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新，因為您不必在更新函數程式碼時變更訂閱資料表或群組定義。反之，您只需將別名指向新的函數版本。

   1. 從頁面頂端**的動作**選單中，選擇**建立別名**。  
![\[[操作] 功能表的螢幕擷取畫面設為 [建立別名]\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-028.png)

   1. 命名別名 **GG\$1HelloWorld**，將版本設定為 **1**（對應至您剛發佈的版本），然後選擇**儲存**。
**注意**  
AWS IoT Greengrass 不支援 **\$1LATEST** 版本的 Lambda 別名。

         
![\[建立名稱欄位設定為 GG_HelloWorld 且版本欄位設定為 1 的新別名的螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-029.png)

# 設定 的 Lambda 函數 AWS IoT Greengrass
<a name="config-lambda"></a>

您現在已準備好設定 Lambda 函數 AWS IoT Greengrass。

在此步驟中，您：
+ 使用 AWS IoT 主控台將 Lambda 函數新增至 Greengrass 群組。
+ 設定 Lambda 函數的群組特定設定。
+ 將訂閱新增至允許 Lambda 函數發佈 MQTT 訊息的群組 AWS IoT。
+ 設定群組的本機日誌設定。

 

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. 在 **Greengrass 群組**下，選擇您在[單元 2 ](module2.md)中建立的群組。

1. 在群組組態頁面上，選擇 **Lambda 函數**索引標籤，然後向下捲動至**我的 Lambda 函數**區段，然後選擇**新增 Lambda 函數**。

1. 選取您在上一個步驟中建立的 Lambda 函數名稱 (**Greengrass\$1HelloWorld**，而非別名名稱）。

1. 針對版本，選擇**別名：GG\$1HelloWorld**。

1. 在 **Lambda 函數組態**區段中，進行下列變更：
   + 將**系統使用者和群組**設定為**使用群組預設值**。
   + 將 **Lambda 函數容器化**設定為**使用群組預設值**。
   + 將 **Timeout (逾時)** 設為 25 秒。此 Lambda 函數會在每次調用前休眠 5 秒。
   + 針對**固定**，選擇 **True**。

    
**注意**  
<a name="long-lived-lambda"></a>*長期 *（或*固定*) Lambda 函數會在啟動後自動 AWS IoT Greengrass 啟動，並在自己的容器中繼續執行。這與*隨需* Lambda 函數相反，該函數會在叫用時啟動，並在沒有任務剩餘執行時停止。如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。

1. 選擇**新增 Lambda 函數**以儲存變更。如需 Lambda 函數屬性的詳細資訊，請參閱 [使用群組特定的組態控制 Greengrass Lambda 函數的執行](lambda-group-config.md)。

   接著，建立允許 Lambda 函數傳送 [MQTT](http://mqtt.org/) 訊息的訂閱 AWS IoT Core。

   Greengrass Lambda 函數可以與下列項目交換 MQTT 訊息：
   + Greengrass 群組中的[裝置](what-is-gg.md#greengrass-devices)。
   + 該群組中的[連接器](connectors.md)。
   + 群組中的其他 Lambda 函數。
   + AWS IoT Core.
   + 本機陰影服務。如需詳細資訊，請參閱[第五單元：與裝置陰影互動](module5.md)。

   群組使用訂閱控制這些實體互相通訊的方式。訂閱會提供可預測的互動以及多一層安全性。

   訂閱包含來源、目標和主題。來源是訊息的起源。目標是訊息的目的地。主題可讓您篩選從來源傳送到目標的資料。來源或目標可以是 Greengrass 裝置、Lambda 函數、連接器、裝置影子或 AWS IoT Core。
**注意**  
訂閱是指訊息以特定方向流動：從來源至目標。若要允許雙向通訊，您必須設定兩個訂閱。
**注意**  
 目前，訂閱主題篩選條件不允許在主題中使用多個`+`字元。主題篩選條件僅允許在主題結尾使用單一`#`字元。

   `Greengrass_HelloWorld` Lambda 函數只會傳送訊息至 中的`hello/world`主題 AWS IoT Core，因此您只需要從 Lambda 函數建立一個訂閱 AWS IoT Core。您將在下一個步驟中建立此項目。

1. 在群組組態頁面上，選擇**訂閱**索引標籤，然後選擇**新增訂閱**。

   如需示範如何使用 建立訂閱的範例 AWS CLI，請參閱《 *AWS CLI 命令參考*》中的 [create-subscription-definition](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/greengrass/create-subscription-definition.html)。

1. 在**來源類型**中，選擇 **Lambda 函數**，然後在**來源**中選擇 **Greengrass\$1HelloWorld**。

1. 針對**目標類型**，選擇**服務**，並針對**目標**選取 **IoT 雲端**。

1. 針對**主題篩選條件**，輸入 **hello/world**，然後選擇**建立訂閱**。

1. 設定群組的記錄設定。在本教學課程中，您會設定 AWS IoT Greengrass 系統元件和使用者定義的 Lambda 函數，將日誌寫入核心裝置的檔案系統。

   1. 在群組組態頁面上，選擇**日誌**索引標籤。

   1. 在**本機日誌組態**區段中，選擇**編輯**。

   1. 在**編輯本機日誌組態**對話方塊中，保留日誌層級和儲存體大小的預設值，然後選擇**儲存**。

   您可以使用日誌來針對您在執行本教學時遇到的任何問題進行故障診斷。問題故障診斷時，您可以暫時將記錄層級變更為 **Debug (偵錯)**。如需詳細資訊，請參閱[存取檔案系統日誌](greengrass-logs-overview.md#gg-logs-local)。

1. <a name="disable-stream-manager-no-java"></a>如果您的核心裝置上未安裝 Java 8 執行時間，您必須進行安裝或停用串流管理員。
**注意**  
本教學課程不會使用串流管理員，但是會使用預設啟用串流管理員的 **Default Group creation (預設群組建立)** 工作流程。如果啟用串流管理員，但未安裝 Java 8，則群組部署會失敗。如需詳細資訊，請參閱[串流管理員需求](stream-manager.md#stream-manager-requirements)。

   若要停用串流管理員：

   1. 在群組設定頁面上，選擇 **Lambda 函數**索引標籤。

   1. 在 **System Lambda 函數**區段下，選取**串流管理員**，然後選擇**編輯**。

   1. 選擇 **Disable (停用)**，然後選擇 **Save (儲存)**。

# 部署雲端組態到 Greengrass 核心裝置
<a name="configs-core"></a>

1. 確認您的 Greengrass 核心裝置已連線到網際網路。例如，嘗試成功導覽至網頁。

1. 確認 Greengrass 協助程式正在您的核心裝置上執行。在核心裝置終端機中，執行下列命令來檢查協助程式是否正在執行，並視需要啟動它。

   1. 檢查精靈是否有在運作：

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      若輸出的 `root` 含有 `/greengrass/ggc/packages/1.11.6/bin/daemon` 項目，則精靈有在運作。

   1. 若要啟動協助程式：

      ```
      cd /greengrass/ggc/core/
      sudo ./greengrassd start
      ```

   現在您已準備好將 Lambda 函數和訂閱組態部署到您的 Greengrass 核心裝置。

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. 在 **Greengrass 群組**下，選擇您在[單元 2 ](module2.md)中建立的群組。

1. 在群組組態頁面上，選擇**部署**。

1. 在 **Lambda 函數**索引標籤的系統 **Lambda 函數**區段中，選擇 **IP 偵測器**。

1. 選擇**編輯**，然後選取**自動偵測和覆寫 MQTT 代理程式端點**。這可讓裝置自動取得核心的連接資訊，例如 IP 位址、DNS、連接埠編號。建議使用自動偵測，但是 AWS IoT Greengrass 也支援手動指定端點。只會在第一次部署群組時收到復原方法的提示。

初次部署需要花幾分鐘。部署完成時，您應該會在**部署**頁面上**的狀態**欄中看到**成功完成**：

**注意**  
部署狀態也會顯示在頁面標頭的群組名稱底下。

如需故障診斷協助，請參閱[故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

# 驗證 Lambda 函數是否在核心裝置上執行
<a name="lambda-check"></a>

1. 在[AWS IoT 主控台](https://console.aws.amazon.com/iot/)的導覽窗格中，於**測試**下，選擇 **MQTT 測試用戶端**。

1. 選擇**訂閱主題**索引標籤。

1. 在**主題篩選條件****hello/world**中輸入 ，然後展開**其他組態**。

1. 輸入下列每個欄位中列出的資訊：
   + 針對 **Quality of Service (服務品質)**，選擇 **0**。
   + 針對 **MQTT payload display (MQTT 承載顯示)**，選擇 **Display payloads as strings (將承載顯示為字串)**。

    

1. 選擇 **Subscribe (訂閱)**。

假設 Lambda 函數正在您的裝置上執行，它會發佈類似下列`hello/world`主題的訊息：

![\[傳送給 hello/world 主題的訊息之螢幕擷取畫面反白顯示訊息。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-045.png)


雖然 Lambda AWS IoT Greengrass 函數會持續將 MQTT 訊息傳送至`hello/world`主題，但請勿停止協助程式。剩餘的模組會在假設其仍在執行中的情況下寫入。

您可以從群組刪除函數和訂閱：
+ 在群組組態頁面的 **Lambda 函數**索引標籤下，選取您要移除的 Lambda 函數，然後選擇**移除**。
+ 在群組組態頁面的**訂閱**索引標籤下，選擇訂閱，然後選擇**刪除**。

函數和訂閱會在接下來的部署群組期間從核心中移除。