執行AWS Lambda函數 - AWS IoT Greengrass

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

執行AWS Lambda函數

注意

AWS IoT Greengrass目前在 Windows 核心裝置上不支援此功能。

您可以將AWS Lambda函數匯入為AWS IoT Greengrass核心裝置上執行的元件。在以下情況下,您可能需要執行此操作:

Lambda 函數包括下列元件的相依性。當您匯入函數時,您不需要將這些元件定義為相依性。當您部署 Lambda 函數元件時,部署會包含這些 Lambda 元件相依性。

要求

您的核心裝置和 Lambda 函數必須符合下列需求,才能在AWS IoT Greengrass核心軟體上執行函數:

  • 您的核心裝置必須符合執行 Lambda 函數的需求。如果您希望核心裝置執行容器化 Lambda 函數,裝置必須符合要求才能執行。如需詳細資訊,請參閱 Lambda 函數需求

  • 您必須在核心裝置上安裝 Lambda 函數使用的程式設計語言。

    提示

    您可以建立安裝程式設計語言的元件,然後將該元件指定為 Lambda 函數元件的相依性。Greengrass 支持所 Lambda 支持的 Python,Node.js 和 Java 運行時的版本。Greengrass 不會對已淘汰的 Lambda 執行階段版本套用任何其他限制。您可以在上執行使用這些已取代執行階段的 Lambda 函數AWS IoT Greengrass,但無法在中AWS Lambda建立它們。如需 Lambda 執行階段AWS IoT Greengrass支援的詳細資訊,請參閱執行AWS Lambda函數

設定函 Lambda 生命週期

Greengrass Lambda 函數生命週期會決定函數的啟動時間,以及它如何建立和使用容器。生命週期也決定AWS IoT Greengrass核心軟體如何保留函數處理常式之外的變數和預處理邏輯。

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

  • 隨需函數在調用時啟動,並在沒有任務要運行時停止。每次呼叫函式都會建立個別容器 (也稱為沙箱) 來處理呼叫,除非現有的容器可供重複使用。任何容器都可能會處理您傳送至函數的資料。

    隨需函數的多個調用可以同時運行。

    建立新容器時,不會保留您在函數處理常式外部定義的變數和預處理邏輯。

  • 長壽命 (或固定) 功能會在AWS IoT Greengrass核心軟體啟動並在單一容器中執行時啟動。同一個容器會處理您傳送至函數的所有資料。

    多個調用排隊,直到 AWS IoT Greengrass Core 軟件運行較早的調用。

    每次呼叫處理常式時,都會保留您在函數處理常式外部定義的變數和預處理邏輯。

    當您需要在沒有任何初始輸入的情況下開始工作時,請使用長壽命的 Lambda 函數 例如,長期使用的函數可以載入並開始處理機器學習模型,以便在函數接收裝置資料時準備就緒。

    注意

    長壽命函數具有與其處理程序的每次調用相關聯的超時。如果要叫用無限期執行的程式碼,您必須在處理常式之外啟動它。請確定處理常式之外沒有封鎖程式碼,可能會阻止函式初始化。

    除非AWS IoT Greengrass核心軟體停止 (例如在部署或重新開機期間),否則這些功能會執行。如果函數遇到未捕獲的異常,超過其內存限制或進入錯誤狀態(例如處理程序超時),這些函數將不會運行。

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

設定 Lambda 函數容器化

根據預設,Lambda 函數會在AWS IoT Greengrass容器內部執行。Greengrass 容器在您的函數和主機之間提供隔離。這種隔離可增加主機和容器中功能的安全性。

我們建議您在 Greengrass 容器中執行 Lambda 函數,除非您的使用案例要求它們在沒有容器化的情況下執行。透過在 Greengrass 容器中執行 Lambda 函數,您可以更好地控制限制對資源存取的方式。

在下列情況下,您可以在不使用容器化的情況下執行 Lambda 函數:

  • 您想要AWS IoT Greengrass在不支援容器模式的裝置上執行。一個例子是,如果你想使用一個特殊的 Linux 發行版,或者有一個過期的早期內核版本。

  • 您想要使用自己的 OverlayFS 函式在另一個容器環境中執行 Lambda 函數,但是在 Greengrass 容器中執行時,會遇到覆寫檔案衝突。

  • 您需要存取具有無法在部署時判斷路徑的本機資源,或部署後路徑可能變更的路徑。此資源的一個例子是可插拔的設備。

  • 您有一個較早的應用程序被編寫為進程,並且在 Greengrass 容器中運行它時遇到問題。

容器化差異
容器化 備註

Greengrass 容器

  • 當您在 Greengrass 容器中執行 Lambda 函數時,所AWS IoT Greengrass有功能都可以使用。

  • 在 Greengrass 容器中執行的 Lambda 函數無法存取其他 Lambda 函數的已部署程式碼,即使它們使用相同的系統群組執行也是如此。換句話說,您的 Lambda 函數在彼此之間的隔離增加的情況下運行。

  • 由於AWS IoT Greengrass核心軟體會在與 Lambda 函數相同的容器中執行所有子處理序,因此當 Lambda 函數停止時,子程序就會停止。

沒有容器

  • 下列功能不適用於非容器化 Lambda 函數:

    • Lambda 函數記憶體限制。

    • 本機裝置和磁碟區資源。您必須使用核心裝置上的檔案路徑來存取這些資源,而非 Lambda 函數資源。

  • 如果您的非容器化 Lambda 函數存取機器學習資源,則必須識別資源擁有者並設定資源的存取權限,而不是 Lambda 函數。

  • 非容器化 Lambda 函數對於使用相同系統群組執行的其他 Lambda 函數的已部署程式碼具有唯讀存取權。

如果您在部署 Lambda 函數時變更其容器化,則該函數可能無法如預期般運作。如果 Lambda 函數使用新容器化設定無法再使用的本機資源,部署會失敗。

  • 當您將 Lambda 函數從在 Greengrass 容器中執行變更為在沒有容器化的情況下執行時,會捨棄函數的記憶體限制。您必須直接存取檔案系統,而不是使用連接的本機資源。在部署 Lambda 函數之前,您必須先移除所有連接的資源。

  • 當您將 Lambda 函數從沒有容器化的情況下執行變更為在容器中執行時,Lambda 函數會失去檔案系統的直接存取權。您必須為每個功能定義記憶體限制,或接受預設的 16 MB 記憶體限制。您可以在部署每個 Lambda 函數時為其設定這些設定。

若要變更 Lambda 函數元件的容器化設定,請在部署元件時將containerMode組態參數的值設定為下列其中一個選項。

  • NoContainer— 元件不會在隔離的執行階段環境中執行。

  • GreengrassContainer— 元件在AWS IoT Greengrass容器內的隔離執行階段環境中執行。

如需如何部署和設定元件的詳細資訊,請參閱將AWS IoT Greengrass元件部署到裝置更新零組件組態