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

若我們提供該指南英語版本的翻譯,在有任何牴觸的狀況下請以英文版本的指南為主。其透過機器翻譯提供翻譯。

在 AWS IoT Greengrass 核心執行 Lambda 函數

AWS IoT Greengrass 提供的容器化 Lambda 執行時間環境適用於您在 AWS Lambda 中所編寫的使用者定義程式碼。部署在 AWS IoT Greengrass 核心 的 Lambda 函數會在核心本機 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.7 1.9 or later
Python 2.7 1.0 或更新版本
Java 8 1.1 或更新版本
Node.js 12.x 1.10 or later
Node.js 8.10 * 1.9 or later
Node.js 6.10 * 1.1 或更新版本
C、C++ 1.6 or later

* 您可以在支援的 AWS IoT Greengrass 版本上執行使用這些執行時間的 Lambda 函數,但無法在 AWS Lambda 中建立它們。更多信息,請參閱 運行時支持策略AWS Lambda Developer Guide.

Greengrass Lambda 函數的軟體開發套件

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

AWS IoT Greengrass Core SDK

讓本機 Lambda 函數可與核心互動:

  • 與 交換 MQTT 訊息。AWS IoT Core.

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

  • 與本機陰影服務互動。

  • 叫用其他本機 Lambda 函數。

  • 訪問 祕密資源.

  • 流股經理.

AWS IoT Greengrass 在 GitHub 上提供以下語言及平台適用的 AWS IoT Greengrass Core SDK。

在 Lambda 函數部署套件中包含 AWS IoT Greengrass Core SDK 相依性:

  1. 下載與 Lambda 函數執行時間相符的 AWS IoT Greengrass Core SDK 套件語言或平台。

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

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

 

流管理客戶

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

  • Java 軟體開發套件 (v1.4.0)

  • Python 軟體開發套件 (v1.5.0)

  • Node.js 軟體開發套件 (v1.6.0)

在 適用於 Python 的 AWS IoT Greengrass Core SDK 中對串流管理員的支援需要 Python 3.7。您也必須安裝依賴檔案,以包含在 Python Lambda 函數部署套件中:

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

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

    pip install --target . -r requirements.txt

 

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

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

此支援適用於具有大小限制的核心。我們建議您在可能的情況下,將軟體開發套件包含在 Lambda 函數部署套件中。

 

AWS IoT Greengrass Machine Learning 軟體開發套件

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

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

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

如需下載資訊,請參閱 AWS IoT Greengrass 機器學習軟體開發套件軟體

AWS 軟體開發套件

啓用本地 Lambda 直接致電 AWS 服務,例如 Amazon S3, DynamoDB, AWS IoT、和 AWS IoT Greengrass. 若要在 Greengrass Lambda 函數中使用 AWS 軟體開發套件,您必須將其包含在部署套裝中。當您在同一個套件中使用 AWS 軟體開發套件做為 AWS IoT Greengrass 核心軟體開發套件,請確認 Lambda 函數使用正確的命名空間。當核心離線時,Greengrass Lambda 函數就無法與雲端服務通訊。

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

有關創建部署包的更多信息,請參閱 建立和封裝 Lambda 函數 入門教程或 創建部署包AWS Lambda Developer Guide.

遷移雲端為基礎的 Lambda 函數

AWS IoT Greengrass 核心開發套件遵循 AWS 開發套件程式設計模型,此開發設計模型使該開發套件易於移植雲端開發的 Lambda 函數給在 AWS IoT Greengrass 核心 執行的 Lambda 函數。

例如,以下 Python Lambda 函數會使用適用於 Python 的 AWS 開發套件,將訊息發佈給雲端中的主題 some/topic

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

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

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

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

程式設計模型之間的相似性,也能讓您在雲端開發您的 Lambda 函數並以最輕鬆的方式遷移至 AWS IoT Greengrass。Lambda 可執行檔 不會在雲端執行,因此您無法在部署之前使用 AWS 開發套件對其開發。

依別名或版本參考 Lambda 函數

Greengrass 群組可根據別名 (建議) 或版本來引用 Lambda 函數。使用別名可讓管理程式碼更新更為容易,因為您不必在函式程式碼更新時變更訂閱表或群組定義。反之,您只需要將別名指向新的函式版本即可。 別名在部署期間解析版本編號。當您使用別名會更新解析的版本別名,此別名會指向部署的時間。

AWS IoT Greengrass 不支援 $LATEST 版本的 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 簡訊工作流程中的受管訂閱」。

注意

當核心離線但對 AWS IoT 的訊息排入佇列時,Greengrass Lambda 函數可以與裝置、連接器、其他功能和本機影子交換訊息。如需更多詳細資訊,請參閱「雲端目標的 MQTT 訊息佇列」。

其他通訊流程

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

    注意

    如果您以無容器方式執行 Lambda 函數,則無法使用連接的本機裝置與磁碟區資源,這些資源必須直接存取。

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

  • Lambda 函數可以使用 AWS 開發套件與 AWS 服務通訊。如需詳細資訊,請參閱 AWS 開發套件

  • Lambda 函數可以使用第三方界面與外部雲端服務、類似以雲端為基礎的 Lambda 函數。

注意

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

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

AWS IoT Greengrass 使用訂閱控制 MQTT 訊息的交換,包括在裝置、Lambda 函數、群組中的連接器,以及 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 部分):AWS IoT Greengrass 的 Lambda 函數

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

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

  1. 在 AWS IoT 主控台 中,開啟 Test (測試) 頁面。

  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 運算部落格中的了解重複使用 AWS Lambda 的容器

Lambda 可執行檔

只有 AWS IoT Greengrass Core 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 開發套件 的已編譯可執行檔。

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

Lambda 可執行檔 必須在他們的函數程式碼中實作特定呼叫和程式設計模式。例如,main 方法必須:

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

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

以下程式碼片段是 GitHub 中 simple_handler.c 程式碼範例的 main 方法。

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 開發套件

建立Lambda 可執行檔

在您編譯您的程式碼與開發套件後,請使用 AWS Lambda API 建立 Lambda 函數和上傳您編譯的可執行檔。

注意

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

以下範例使用 create-function CLI 命令建立 Lambda 可執行檔。此命令指定:

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

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

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

注意

對於 role,您可以指定任何 Lambda 執行角色的 ARN。AWS IoT Greengrass 並不使用此角色,但需要參數來建立函數。更多關於 Lambda 執行角色,請參閱 AWS Lambda 權限模型AWS Lambda Developer Guide.

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 群組時,建議您參考其別名。

    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。