在AWS IoT Greengrass核心上執行 Lambda 函數 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 於 2023 年 6 月 30 日進入延長壽命階段。如需詳細資訊,請參閱 AWS IoT Greengrass V1 維護政策 。在此日期之後, AWS IoT Greengrass V1 不會發佈提供功能、增強功能、錯誤修正或安全修補程式的更新。在 上執行的裝置 AWS IoT Greengrass V1 不會中斷,並會繼續運作和連線至雲端。我們強烈建議您遷移至 AWS IoT Greengrass Version 2,這會新增重要的新功能,並支援其他平台

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

在AWS IoT Greengrass核心上執行 Lambda 函數

AWS IoT Greengrass為您撰寫的使用者定義程式碼提供容器化 Lambda 執行階段環境。AWS Lambda部署至核心本機 Lambda 執行階段中AWS IoT Greengrass核心執行階段的 Lambda 函數。本機 Lambda 函數可由本機事件、來自雲端的訊息以及其他來源觸發,這些函數可為用戶端裝置帶來本機運算功能。例如,您可以使用 Greengrass Lambda 函數來篩選裝置資料,然後再將資料傳輸到雲端。

若要將 Lambda 函數部署到核心,您可以將函數新增至 Greengrass 群組 (透過參考現有的 Lambda 函數),為函數設定群組特定的設定,然後部署群組。如果函數存取AWS服務,您也必須將任何必要的權限新增至 Greengrass 群組角色。

您可以設定參數來決定 Lambda 函數的執行方式,包括權限、隔離、記憶體限制等。如需詳細資訊,請參閱 使用群組特定組態來控制 Greengrass Lambda 函數的執行

注意

這些設定也可讓您在 Docker 容器中執行 AWS IoT Greengrass。如需詳細資訊,請參閱 在 Docker 容器中執行 AWS IoT Greengrass

下表列出支援的 AWS Lambda 執行時間,和它們可以執行所在的 AWS IoT Greengrass Core 軟體版本。

語言或平台 GGC 版本
Python 3.8 1.11
Python 3.7 1.9 或更高版本
Python 2.7 * 1.0 或更新版本
Java 8 1.1 或更新版本
Node.js 12.x 1.10 或更新版本
Node.js 8.10 * 1.9 或更高版本
Node.js 6.10 * 1.1 或更新版本
C、C++ 1.6 或更新版本

* 您可以在受支援的版本上執行使用這些執行階段的 Lambda 函數AWS IoT Greengrass,但無法在AWS Lambda. 如果裝置上的執行階段與為該函數指定的 AWS Lambda 執行階段不同,您可以使用 FunctionRuntimeOverride in 來選擇自己的執行階段FunctionDefintionVersion。如需詳細資訊,請參閱CreateFunctionDefinition。如需支援的執行階段的詳細資訊,請參閱AWS Lambda開發人員指南中的執行階段支援政策

適用於 Greengrass Lambda 函數的 SDK

AWS提供三個 SDK,可供核心上執行的 Greengrass Lambda 函式使用。AWS IoT Greengrass這些軟體開發套件包含在不同的套裝服務中,因此函數可以同時使用它們。若要在 Greengrass Lambda 函數中使用 SDK,請將其包含在您上傳至的 Lambda 函數部署套件中。AWS Lambda

AWS IoT Greengrass 核心開發套件

啟用本機 Lambda 函數與核心互動,以便:

  • 與 AWS IoT Core 交換 MQTT 訊息。

  • 與 Greengrass 群組中的連接器、用戶端裝置和其他 Lambda 函數交換 MQTT 訊息。

  • 與本機陰影服務互動。

  • 叫用其他本機 Lambda 函數。

  • 存取私密資源

  • 串流管理員交動。

AWS IoT Greengrass在上提供下列語言和平台的AWS IoT Greengrass核心 SDK GitHub。

若要在 Lambda 函數部署套件中包含AWS IoT Greengrass核心 SDK 相依性:

  1. 下載符合 Lambda 函數執行階段之AWS IoT Greengrass核心 SDK 套件的語言或平台。

  2. 解壓縮下載的封裝,以取得軟體開發套件。SDK 為 greengrasssdk 資料夾。

  3. 包含greengrasssdk在包含函數程式碼的 Lambda 函數部署套件中。這是您在建立 Lambda 函數AWS Lambda時上傳到的封裝。

 

StreamManagerClient

只有以下 AWS IoT Greengrass 核心軟體開發套件可用於串流管理員操作:

  • Java 開發套件 (版本 1.4.0 或更新版本)

  • Python 開發套件(版本 1.5.0 或更高版本)

  • Node.js 軟體開發套件 (版本 1.6.0 或更新版本)

若要使用 Python 的AWS IoT Greengrass核心 SDK 與串流管理員互動,您必須安裝 Python 3.7 或更新版本。您也必須安裝相依性才能包含在 Python Lambda 函數部署套件中:

  1. 前往包含 requirements.txt 檔案的軟體開發套件目錄。這個檔案會列出相依性。

  2. 安裝軟體開發套件相依性。例如,執行下列 pip 命令,將它們安裝在目前的目錄中:

    pip install --target . -r requirements.txt

 

在AWS IoT Greengrass核心設備上安裝適用於 Python 的核心 SDK

如果您正在執行 Python Lambda 函數,您也可以使pip用在AWS IoT Greengrass核心裝置上安裝適用於 Python 的核心開發套件。然後,您可以在 Lambda 函數部署套件中不包含 SDK 的情況下部署您的函數。如需詳細資訊,請參閱 greengrasssdk

此支援適用於具有大小限制的核心。我們建議您盡可能將 SDK 包含在 Lambda 函數部署套件中。

 

AWS IoT GreengrassMachine Learning SDK

可讓本機 Lambda 函數使用部署到 Greengrass 核心做為機器學習資源的機器學習 (ML) 模型。Lambda 函數可以使用 SDK 叫用本機推論服務,並與部署至核心做為連接器的本機推論服務互動。Lambda 函數和 ML 連接器也可以使用 SDK 將資料傳送至 ML 回饋連接器,以便上傳和發佈。如需詳細資訊,包括使用開發套件的程式碼範例,請參閱 ML 影像分類連接器ML 物件偵測連接器ML 回饋連接器

下表列出支援的語言或平台,適用於開發套件版本,以及它們可在其上執行的 AWS IoT Greengrass 核心軟體版本。

SDK 版本 語言或平台 所需的 GGC 版本 Changelog
1.1.0 Python 3.7 或 2.7 1.9.3 或更新版本 新增 Python 3.7 支援和新的 feedback 用戶端。
1.0.0 Python 2.7 1.7 或更新版本 初始版本。

如需下載資訊,請參閱 AWS IoT Greengrass ML 軟體開發套件

AWS SDK

可讓本機 Lambda 函數直接呼叫AWS服務,例如 Amazon S3 AWS IoT、DynamoDB 和. AWS IoT Greengrass 若要在 Greengrass Lambda 函數中使用 AWS SDK,您必須將它包含在您的部署套件中。當您在與AWS IoT Greengrass核心 AWS SDK 相同的套件中使用 SDK 時,請確定您的 Lambda 函數使用正確的命名空間。核心離線時,Greengrass Lambda 函數無法與雲端服務通訊。

從AWS資源中心入門資源中心下載 開發套件。

如需有關建立部署套件的詳細資訊,請參閱《開AWS Lambda發人員指南》建立 Lambda 函數中的〈入門〉自學課程或〈建立部署套件

遷移以雲端為 Lambda 礎的

AWS IoT Greengrass核心 SDK 遵循 AWS SDK 程式設計模型,這可讓您輕鬆將針對雲端開發的 Lambda 函數移植到AWS IoT Greengrass核心上執行的 Lambda 函數。

例如,下列 Python Lambda 函數會使AWS SDK for Python (Boto3)用將訊息發佈至雲端some/topic中的主題:

import boto3 iot_client = boto3.client("iot-data") response = iot_client.publish( topic="some/topic", qos=0, payload="Some payload".encode() )

若要移植AWS IoT Greengrass核心的函數,請在import陳述式和client初始化中,將boto3模組名稱變更為greengrasssdk,如下列範例所示:

import greengrasssdk iot_client = greengrasssdk.client("iot-data") iot_client.publish(topic="some/topic", qos=0, payload="Some payload".encode())
注意

AWS IoT Greengrass 核心開發套件僅使用 QoS = 0 支援傳送的 MQTT 訊息。如需詳細資訊,請參閱 訊息服務品質

程式設計模型之間的相似性也讓您能夠在雲端中開發 Lambda 函數,然後以最少的努力將它們遷移到AWS IoT Greengrass。Lambda 可執行檔不會在雲端中執行,因此您無法在部署之前使用 AWS SDK 在雲端中開發它們。

依別名或版本參考 Lambda 函數

Greengrass 組可以通過別名(推薦)或版本引用 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新,因為當函數程式碼更新時,您不需要變更訂閱資料表或群組定義。相反,您只需將別名指向新函數版本即可。在群組部署期間,別名會解析為版本號碼。當您使用別名會更新解析的版本別名,此別名會指向部署的時間。

AWS IoT Greengrass不支持 $ 最新版本的 Lambda 別名。$LATEST 版本不綁定到不可變的發布函數版本,並且可以隨時更改,這與版本不變性的AWS IoT Greengrass原則相反。

使用程式碼變更來保持 Greengrass Lambda 函數更新的常見做法是使用 Greengrass 群組和訂閱PRODUCTION中指定的別名。當您將 Lambda 函數的新版本升級至生產環境時,請將別名指向最新的穩定版本,然後重新部署群組。您也可以使用此方法轉返至舊版本。

Greengrass Lambda 函數的通訊流程

Greengrass Lambda 函數支援多種與AWS IoT Greengrass群組的其他成員、本機服務和雲端服務 (包括AWS服務) 通訊的方法。

使用 MQTT 訊息進行通訊

Lambda 函數可以使用由訂閱控制的發佈-訂閱模式來傳送和接收 MQTT 訊息。

此通訊流程可讓 Lambda 函數與下列實體交換訊息:

  • 群組中的用戶端裝置。

  • 該群組中的連接器。

  • 群組中的其他 Lambda 函數。

  • AWS IoT.

  • 本機裝置陰影服務。

訂閱會定義將訊息從來源路由到目標時所用的訊息來源、訊息目標和主題 (或主體)。發佈至 Lambda 函數的訊息會傳遞至函數的註冊處理常式。訂閱啟用更多安全性,和提供可預測的互動。如需詳細資訊,請參閱 MQTT 簡訊工作流程中的受管訂閱

注意

核心離線時,Greengrass Lambda 函數可以與用戶端裝置、連接器、其他函數和本機陰影交換訊息,但要AWS IoT排入佇列的訊息。如需詳細資訊,請參閱 雲端目標的 MQTT 訊息佇列

其他通訊流程

  • 為了與核心裝置上的本機裝置和磁碟區資源以及機器學習模型互動,Greengrass Lambda 函數會使用平台特定的作業系統介面。例如,您可以在 Python 函數中的 os 模塊中使用該open方法。若要允許函數存取資源,該函數必須隸屬於資源並授與 read-onlyread-write 許可。如需詳細資訊,包括AWS IoT Greengrass核心版本可用性,請參閱使用 Lambda 函數和連接器存取本機資源從 Lambda 函數程式碼存取機器學習資源

    注意

    如果您在沒有容器化的情況下執行 Lambda 函數,則無法使用連接的本機裝置和磁碟區資源,而且必須直接存取這些資源。

  • Lambda 函數可以使用AWS IoT Greengrass核心 SDK 中的用Lambda戶端叫用 Greengrass 群組中的其他 Lambda 函數。

  • Lambda 函數可以使用 AWS SDK 與AWS服務進行通訊。如需詳細資訊,請參閱 AWSSDK

  • Lambda 函數可以使用第三方介面與外部雲端服務進行通訊,類似於雲端的 Lambda 函數。

注意

核心處於離線狀態時,Greengrass Lambda 函數無法與其他雲端服務通訊AWS或其他雲端服務。

擷取輸入 MQTT 主題 (或主旨)

AWS IoT Greengrass使用訂閱來控制群組中用戶端裝置、Lambda 函數和連接器之間的 MQTT 訊息交換,以及與AWS IoT或本機陰影服務的交換。訂閱會定義訊息來源、訊息目標,以及用於路由訊息的 MQTT 主題。當目標是 Lambda 函數時,會在來源發佈訊息時叫用函數的處理常式。如需詳細資訊,請參閱 使用 MQTT 訊息進行通訊

下列範例顯示 Lambda 函數如何從傳遞至處理常式的context輸入主題取得輸入主題。方式是從內容階層 (context.client_context.custom['subject']) 存取 subject 金鑰。範例也會剖析輸入 JSON 訊息,並發佈剖析的主題和訊息。

注意

在 AWS IoT Greengrass API 中,訂閱的主題由 subject 屬性表示。

import greengrasssdk import logging client = greengrasssdk.client('iot-data') OUTPUT_TOPIC = 'test/topic_results' def get_input_topic(context): try: topic = context.client_context.custom['subject'] except Exception as e: logging.error('Topic could not be parsed. ' + repr(e)) return topic def get_input_message(event): try: message = event['test-key'] except Exception as e: logging.error('Message could not be parsed. ' + repr(e)) return message def function_handler(event, context): try: input_topic = get_input_topic(context) input_message = get_input_message(event) response = 'Invoked on topic "%s" with message "%s"' % (input_topic, input_message) logging.info(response) except Exception as e: logging.error(e) client.publish(topic=OUTPUT_TOPIC, payload=response) return

若要測試函數,請使用預設的組態設定將其新增至群組。接著,新增以下訂閱並部署群組。如需說明,請參閱第三單元 (第 1 部分):Lambda 函數AWS IoT Greengrass

來源 目標 主題篩選條件
IoT Cloud (IoT 雲端) 此函數 test/input_message
此函數 IoT Cloud (IoT 雲端) test/topic_results

部署完成後,呼叫該函數。

  1. 在AWS IoT主控台中,開啟 MQTT 測試用戶端頁面。

  2. 選取訂閱test/topic_results主題標籤以訂閱主題

  3. 選取 [發佈至主test/input_message題] 索引標籤,將訊息發佈至主題。在此範例中,您必須於 JSON 訊息包含 test-key 屬性。

    { "test-key": "Some string value" }

    如果成功,函數會將輸入主題和訊息字串發佈至 test/topic_results 主題。

Greengrass Lambda 函數的生命週期組態

Greengrass Lambda 函數生命週期會決定函數的啟動時間,以及它如何建立和使用容器。生命週期也可決定在函數處理常式外所保留的變數和預先處理邏輯。

AWS IoT Greengrass 支援隨需 (預設) 或長期生命週期:

  • 隨需函數,在沒有需要執行工作時,其被呼叫和停用會讓此隨需函數啟動。叫用函數會建立分離的容器 (或沙盒) 以處理呼叫,除非已有可重複使用的現有容器。傳送到函數的資料可能會透過任何容器拉出。

    隨需 函數的多個呼叫可以平行執行。

    每當建立新容器時,在函數處理常式外定義的變數或預先處理的邏輯將不將予以保留。

  • 當AWS IoT Greengrass核心啟動並在單個容器中運行時,長壽命(或固定)功能會自動啟動。傳送到函數的所有資料可能會透過一樣的容器拉出。

    會佇列多個呼叫,直到先前的呼叫已執行。

    在函數處理常式外定義的變數或預先處理的邏輯,每次呼叫時會保留於函數處理常式。

    當您需要在沒有任何初始輸入的情況下開始工作時,長壽命 Lambda 函數非常有用。例如,當函數開始接收裝置資料時,長期函數可以載入和啟動就緒的機器學習模型。

    注意

    請記住長期函數有與其相關的呼叫處理常式之逾時。如果您想要無限期地執行程式碼,則您必須在處理常式外啟動此程式碼。請確定在處理常式外沒有封鎖程式碼,可以預防完成其初始化的函數。

    除非核心停止 (例如,在群組部署或裝置重新開機期間) 或函數進入錯誤狀態 (例如處理常式逾時、未捕獲的例外狀況或超過記憶體限制),否則這些函數會執行。

如需容器重複使用的詳細資訊,請參閱了解 AWS Compute 部落格AWS Lambda中的容器重複使用

Lambda 可執行檔

此功能適用於AWS IoT Greengrass核心 v1.6 及更高版本。

Lambda 可執行檔是一種 Greengrass Lambda 函數,可用來在核心環境中執行二進位程式碼。它使您可以本地執行特定於設備的功能,並從編譯代碼的較小佔用空間中受益。Lambda 可執行檔可由事件叫用、叫用其他函數,以及存取本機資源。

Lambda 可執行文件僅支持二進制編碼類型(不是 JSON),但否則您可以在 Greengrass 組中管理它們,並像其他 Greengrass Lambda 函數一樣部署它們。不過,建立 Lambda 可執行檔的程序與建立 Python、Java 和 Node.js Lambda 函數不同:

  • 您無法使用AWS Lambda主控台建立 (或管理) Lambda 可執行檔。您只能使用 AWS Lambda API 建立 Lambda 可執行檔。

  • 您可以將函數程式碼上傳AWS Lambda至包含適用於 C 的 AWS IoT Greengrass Core SDK 的已編譯可執行檔。

  • 您可以指定可執行檔的名稱為函數處理常式。

Lambda 可執行檔必須在其函數程式碼中實作某些呼叫和程式設計模式。例如,main 方法必須:

  • 呼叫 gg_global_init 以初始化 Greengrass 內部全域變數。此函數必須在建立任何執行緒被呼叫,及在呼叫任何其他的 AWS IoT Greengrass 核心開發套件函數前。

  • 呼叫gg_runtime_start以向 Greengrass Lambda 執行階段註冊函數處理常式。此函數必須在初始化期間呼叫。呼叫此函數會讓執行時間使用目前的執行緒。此選擇性使用的 GG_RT_OPT_ASYNC 參數通知該函數不要進行封鎖,反而請它為執行時間建立新的執行緒。此函數使用 SIGTERM 處理常式。

下列程式碼片段是上的簡單處理程式碼範例中的main方法。 GitHub

int main() { gg_error err = GGE_SUCCESS; err = gg_global_init(0); if(err) { gg_log(GG_LOG_ERROR, "gg_global_init failed %d", err); goto cleanup; } gg_runtime_start(handler, 0); cleanup: return -1; }

如需需求、條件約束和其他實作詳細資訊的詳細資訊,請參閱適用於 C 的 AWS IoT Greengrass Core SDK

建立 Lambda 可執行檔

在您與 SDK 一起編譯程式碼之後,請使用 AWS Lambda API 建立 Lambda 函數,並上傳已編譯的可執行檔。

注意

必須使用 C89 相容編譯器編譯您的函數。

下列範例會使用建立函數 CLI 命令來建立 L ambda 可執行檔。此命令指定:

  • 處理常式的可執行檔名稱。這必須為您編譯的可執行檔之確切名稱。

  • .zip 檔案路徑含有編譯的可執行檔。

  • 執行階段的 arn:aws:greengrass:::runtime/function/executable。這是所有 Lambda 可執行檔的執行階段。

注意

對於role,您可以指定任何 Lambda 執行角色的 ARN。 AWS IoT Greengrass不使用此角色,但建立函數需要參數。如需 Lambda 執行角色的詳細資訊,請參閱AWS Lambda開發人員指南中的AWS Lambda權限模型

aws lambda create-function \ --region aws-region \ --function-name function-name \ --handler executable-name \ --role role-arn \ --zip-file fileb://file-name.zip \ --runtime arn:aws:greengrass:::runtime/function/executable

接著,請使用 AWS Lambda API 發佈版本並建立別名。

  • 使用 publish-version 發佈函數版本。

    aws lambda publish-version \ --function-name function-name \ --region aws-region
  • 使用 create-alias 來建立別名,以指向您剛發佈的版本。當您將 Lambda 函數新增至 Greengrass 群組時,建議您依別名參考 Lambda 函數。

    aws lambda create-alias \ --function-name function-name \ --name alias-name \ --function-version version-number \ --region aws-region
注意

主AWS Lambda控台不會顯示 Lambda 可執行檔。若要更新函數程式碼,您還必須使用 AWS Lambda API。

然後,將 Lambda 可執行檔新增至 Greengrass 群組,將其設定為在其群組特定設定中接受二進位輸入資料,然後部署該群組。透過 AWS IoT Greengrass 主控台或使用 AWS IoT Greengrass API 皆可執行這項作業。