

支援終止通知：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 （第 2 部分）：Lambda 函數開啟 AWS IoT Greengrass
<a name="module3-II"></a>

本單元探索在 AWS IoT Greengrass 核心上執行的隨需和長期 Lambda 函數之間的差異。

開始之前，請先執行 [Greengrass 裝置安裝](quick-start.md)指令碼，或確定您已完成[單元 1](module1.md)、[單元 2](module2.md) 和[單元 3 (第 1 部分)](module3-I.md)。

此單元需約 30 分鐘完成。

**Topics**
+ [建立和封裝 Lambda 函數](package.md)
+ [為 設定長期 Lambda 函數 AWS IoT Greengrass](long-lived.md)
+ [測試長期 Lambda 函數](long-testing.md)
+ [測試隨需 Lambda 函數](on-demand.md)

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

在此步驟中，您：
+ 建立包含函數程式碼和相依性的 Lambda 函數部署套件。
+ 使用 Lambda 主控台建立 Lambda 函數並上傳部署套件。
+ 發佈 Lambda 函數的版本，並建立指向該版本的別名。

 

1. 在電腦上，前往您在單元 3-1 [建立和封裝 Lambda 函數](create-lambda.md)中下載並擷取的適用於 Python AWS IoT Greengrass 的核心 SDK。

   此模組中的 Lambda 函數使用：
   + `examples\HelloWorldCounter` 中的 `greengrassHelloWorldCounter.py` 檔案。這是您的 Lambda 函數程式碼。
   + `greengrasssdk` 資料夾。此為軟體開發套件。

1. 建立 Lambda 函數部署套件：

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

   1. 將 `greengrassHelloWorldCounter.py` 和 `greengrasssdk` 資料夾儲存至名為 `hello_world_counter_python_lambda.zip` 的 `zip` 檔案。`py` 檔案和 `greengrasssdk` 資料夾必須為在目錄的根內。  
![\[螢幕擷取畫面顯示 hello_word_counter_python_lambda.zip 的壓縮內容。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-046.png)

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

      ```
      zip -r hello_world_counter_python_lambda.zip greengrasssdk greengrassHelloWorldCounter.py
      ```

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

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

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

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

   選擇 **Create function (建立函數)**。  
![\[「基本資訊」區段，其「函數名稱」欄位設定為「Greengrass_HelloWorld_Counter」，而「執行時間」欄位設定為「Python 3.7」。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-023-3.png)

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_counter_python_lambda.zip`部署套件。然後選擇 **Save (儲存)**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函數的**程式碼**索引標籤的**執行時間設定**下，選擇**編輯**，然後輸入下列值。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於 **Handler (處理常式)**，輸入 **greengrassHelloWorldCounter.function\$1handler**。

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

1. 發佈函數的第一個版本。

   1. 從頁面頂端**的動作**選單中，選擇**發佈新版本**。針對 **Version description (版本描述)**，輸入 **First version**。

   1. 選擇 **Publish** (發布)。

1. 建立函數版本的別名。

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

   1. 對於**名稱**，輸入 **GG\$1HW\$1Counter**。

   1. 對於**版本**，選擇 **1**。

   1. 選擇 **Save** (儲存)。  
![\[建立別名螢幕擷取畫面，並將 Name 欄位設定為 GG_HW_Counter，並將 Version 欄位設定為 1。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-048.png)

   別名會為您的 Lambda 函數建立單一實體，供 Greengrass 裝置訂閱。如此一來，您就不必在每次修改函數時，使用新的 Lambda 函數版本編號更新訂閱。

# 為 設定長期 Lambda 函數 AWS IoT Greengrass
<a name="long-lived"></a>

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

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

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

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

1. 針對 **Lambda 函數**，選擇 **Greengrass\$1HelloWorld\$1Counter**。

1. 針對 **Lambda 函數版本**，選擇您發佈的版本別名。

1. 針對**逾時 （秒）**，輸入 **25**。此 Lambda 函數會在每次調用前休眠 20 秒。

1. 針對**固定**，選擇 **True**。

1. 保留所有其他欄位的預設值，然後選擇**新增 Lambda 函數**。

# 測試長期 Lambda 函數
<a name="long-testing"></a>

當 AWS IoT Greengrass 核心在單一容器 （或沙盒） 中啟動和執行時，*[長期](lambda-functions.md#lambda-lifecycle)* Lambda 函數會自動啟動。在函數處理常式外定義的任何變數或預先處理的邏輯，每次呼叫函數處理常式時都會保留下來。多個函數處理常式的呼叫已排入佇列，直到已執行舊的呼叫。

 在此單元中使用的 `greengrassHelloWorldCounter.py` 程式碼可在函數處理常式外定義 `my_counter` 變數。

**注意**  
您可以在 AWS Lambda 主控台或 GitHub 上[AWS IoT Greengrass 適用於 Python 的 Core SDK](https://github.com/aws/aws-greengrass-core-sdk-python/blob/master/examples/HelloWorldCounter/greengrassHelloWorldCounter.py) 中檢視程式碼。

在此步驟中，您會建立允許 Lambda 函數和 AWS IoT 交換 MQTT 訊息的訂閱。然後，您部署群組和測試函數。

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

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

1. 在**目標類型**下，選擇**服務**，選擇 **IoT 雲端**。

1. 針對 **Topic filter (主題篩選條件)**，輸入 **hello/world/counter**。

1. 選擇 **Create subscription** (建立訂閱)。

   此單一訂閱僅朝一個方向進行：從 `Greengrass_HelloWorld_Counter` Lambda 函數到 AWS IoT。若要從雲端叫用 （或觸發） 此 Lambda 函數，您必須以相反方向建立訂閱。

1. 請依照步驟 1 - 5 新增另一個使用下列值的訂閱。此訂閱允許 Lambda 函數接收來自 的訊息 AWS IoT。當您從叫用 函數的 AWS IoT 主控台傳送訊息時，您會使用此訂閱。
   + 針對來源，選擇**服務**，然後選擇 **IoT 雲端**。
   + 針對目標，選擇 **Lambda 函數**，然後選擇 **Greengrass\$1HelloWorld\$1Counter**。
   + 針對主題篩選條件，輸入 **hello/world/counter/trigger**。

   此主題篩選條件中使用 `/trigger` 延伸部分，因為您已建立兩個訂閱，並且不希望它們互相影響。

1. 請確定 Greengrass 協助程式正在執行，如 中所述[部署雲端組態到核心裝置](configs-core.md)。

1. <a name="console-actions-deploy"></a>在群組組態頁面上，選擇**部署**。

1. <a name="console-test-after-deploy"></a>部署完成後，返回 AWS IoT 主控台首頁，然後選擇**測試**。

1. 設定下列欄位：
   + 針對 **Subscription topic (訂閱主題)**，輸入 **hello/world/counter**。
   + 針對 **Quality of Service (服務品質)**，選擇 **0**。
   + 針對 **MQTT payload display (MQTT 承載顯示)**，選擇 **Display payloads as strings (將承載顯示為字串)**。

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

   與此模組的[第 1 部分](module3-I.md)不同，您應該不會在訂閱 `hello/world/counter` 之後看到任何訊息。這是因為發佈到該 `hello/world/counter` 主題的 `greengrassHelloWorldCounter.py` 程式碼是在函數處理常式中，該處理常式僅會在叫用該函數時執行。

   在此模組中，您設定 `Greengrass_HelloWorld_Counter` Lambda 函數在接收`hello/world/counter/trigger`有關主題的 MQTT 訊息時被叫用。

   **Greengrass\$1HelloWorld\$1Counter** 對 **IoT Cloud (IoT 雲端)** 的訂閱允許函數將訊息傳送至 `hello/world/counter` 主題的 AWS IoT 。**IoT 雲端**至 **Greengrass\$1HelloWorld\$1Counter** 訂閱允許 AWS IoT 傳送訊息至`hello/world/counter/trigger`主題上的 函數。

1. 若要測試長期生命週期，請發佈訊息至 `hello/world/counter/trigger` 主題來叫用 Lambda 函數。您可以使用預設的訊息。  
![\[預設來自 AWS IoT 主控台的 Hello 訊息傳送至 hello/world/counter/trigger，並反白顯示發佈至主題按鈕。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-057.png)
**注意**  
 `Greengrass_HelloWorld_Counter` 函數會忽略接收訊息的內容。它只需在 `function_handler` 中執行程式碼，這會將訊息傳送到 `hello/world/counter` 主題。您可以從 GitHub 上的[AWS IoT Greengrass 適用於 Python 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/blob/master/examples/HelloWorldCounter/greengrassHelloWorldCounter.py) 檢閱此程式碼。

每次將訊息發佈給 `hello/world/counter/trigger` 主題時，`my_counter` 變數會增加。此調用計數會顯示在從 Lambda 函數傳送的訊息中。由於函數處理常式包含 20 秒的休眠週期 (`time.sleep(20)`)，因此重複觸發處理常式會將 AWS IoT Greengrass 核心的回應排入佇列。

![\[螢幕擷取畫面顯示呼叫計數從 1、2 和 3 開始增加。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-058.png)


# 測試隨需 Lambda 函數
<a name="on-demand"></a>

*[隨需](lambda-functions.md#lambda-lifecycle)* Lambda 函數的功能與雲端 AWS Lambda 函數類似。隨需 Lambda 函數的多個調用可以平行執行。如果資源允許，Lambda 函數的調用會建立個別的容器來處理調用或重複使用現有容器。任何在函數處理常式外部定義的變數或預先處理都不會在建立容器時保留。

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

1. 在**我的 Lambda 函數**下，選擇 **Greengrass\$1HelloWorld\$1Counter** Lambda 函數。

1. 在**Greengrass\$1HelloWorld\$1Counter**詳細資訊頁面上，選擇**編輯**。

1. 針對**固定**，選擇 **False**，然後選擇**儲存**。

1. <a name="console-actions-deploy"></a>在群組組態頁面上，選擇**部署**。

1. <a name="console-test-after-deploy"></a>部署完成後，請返回 AWS IoT 主控台首頁，然後選擇**測試**。

1. 設定下列欄位：
   + 針對 **Subscription topic (訂閱主題)**，輸入 **hello/world/counter**。
   + 針對 **Quality of Service (服務品質)**，選擇 **0**。
   + 針對 **MQTT payload display (MQTT 承載顯示)**，選擇 **Display payloads as strings (將承載顯示為字串)**。  
![\[訂閱測試頁面的螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-056.png)

1. 選擇 **Subscribe (訂閱)**。
**注意**  
您應該不會在訂閱之後看到任何訊息。

1. 若要測試隨需生命週期，請透過將訊息發佈到 `hello/world/counter/trigger` 主題來叫用函數。您可以使用預設的訊息。

   1. 選擇快速**發佈**三次，每次按下按鈕後五秒內。  
![\[螢幕擷取畫面顯示 [發佈到主題] 按鈕必須快速連按三下。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-063.png)

      每個發佈都會呼叫函數處理常式，並為每次呼叫建立容器。呼叫計數不會在您觸發函數的三次中遞增，因為每個隨需 Lambda 函數都有自己的容器/沙盒。  
![\[螢幕擷取畫面顯示呼叫計數固定為 1。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-064.png)

   1. 約 30 秒後，選擇 **Publish to topic (發佈到主題)**。呼叫計數應遞增到 2。這表示從之前呼叫中建立的容器目前正在重新使用，並且已存放在函數處理常式之外的預先處理變數。  
![\[螢幕擷取畫面顯示現在的呼叫計數固定為 2。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-065.png)

您現在應該了解可在 AWS IoT Greengrass 核心上執行的兩種 Lambda 函數類型。下一個模組[，模組 4](module4.md)，向您展示本機 IoT 裝置如何在 AWS IoT Greengrass 群組中互動。