

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

# 執行 AWS Lambda 函數
<a name="run-lambda-functions"></a>

**注意**  
AWS IoT Greengrass 目前不支援 Windows 核心裝置上的此功能。

您可以將 AWS Lambda 函數匯入為在 AWS IoT Greengrass 核心裝置上執行的元件。在下列情況中，您可能想要執行此操作：
+ 您在 Lambda 函數中具有應用程式碼，而您要部署到核心裝置。
+ 您有要在 AWS IoT Greengrass V2 核心裝置上執行的 AWS IoT Greengrass V1 應用程式。如需詳細資訊，請參閱[步驟 2：建立和部署 AWS IoT Greengrass V2 元件以遷移 AWS IoT Greengrass V1 應用程式](set-up-v2-test-device.md#run-v1-applications)。

Lambda 函數包含下列元件的相依性。匯入函數時，您不需要將這些元件定義為相依性。當您部署 Lambda 函數元件時，部署會包含這些 Lambda 元件相依性。
+ [Lambda 啟動器元件](lambda-launcher-component.md) (`aws.greengrass.LambdaLauncher`) 會處理程序和環境組態。
+ [Lambda 管理員元件](lambda-manager-component.md) (`aws.greengrass.LambdaManager`) 會處理程序間通訊和擴展。
+ [Lambda 執行期元件](lambda-runtimes-component.md) (`aws.greengrass.LambdaRuntimes`) 為每個支援的 Lambda 執行期提供成品。

**Topics**
+ [要求](#run-lambda-functions-requirements)
+ [設定 Lambda 函數生命週期](#lambda-lifecycle)
+ [設定 Lambda 函數容器化](#lambda-containerization)
+ [將 Lambda 函數匯入為元件 （主控台）](import-lambda-function-console.md)
+ [將 Lambda 函數匯入為元件 (AWS CLI)](import-lambda-function-cli.md)

## 要求
<a name="run-lambda-functions-requirements"></a>

您的核心裝置和 Lambda 函數必須符合下列要求，才能在 AWS IoT Greengrass Core 軟體上執行函數：
+ <a name="core-device-lambda-function-requirements"></a>您的核心裝置必須符合執行 Lambda 函數的要求。如果您想要核心裝置執行容器化 Lambda 函數，裝置必須符合執行此作業的要求。如需詳細資訊，請參閱[Lambda 函數需求](setting-up.md#greengrass-v2-lambda-requirements)。
+ 您必須安裝 Lambda 函數在核心裝置上使用的程式設計語言。
**提示**  
您可以建立安裝程式設計語言的元件，然後將該元件指定為 Lambda 函數元件的相依性。Greengrass 支援所有 Lambda 支援的 Python、Node.js 和 Java 執行時間版本。Greengrass 不會對已取代的 Lambda 執行時間版本套用任何其他限制。您可以在 上執行使用這些已棄用執行時間的 Lambda 函數 AWS IoT Greengrass，但無法在 中建立它們 AWS Lambda。如需 AWS IoT Greengrass 支援 Lambda 執行時間的詳細資訊，請參閱[執行 AWS Lambda 函數](#run-lambda-functions)。

## 設定 Lambda 函數生命週期
<a name="lambda-lifecycle"></a>

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

AWS IoT Greengrass 支援隨需 （預設） 和長期生命週期：
+ 隨**需**函數會在叫用時啟動，並在沒有任務剩餘時停止。除非現有容器可供重複使用，否則函數的每次調用都會建立個別容器，也稱為沙盒，以處理調用。任何容器都可能處理您傳送至 函數的資料。

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

  建立新容器時，不會保留您在函數處理常式外定義的變數和預先處理邏輯。
+ **長期 **（或*固定*) 函數會在 AWS IoT Greengrass Core 軟體在單一容器中啟動和執行時啟動。相同的容器會處理您傳送至 函數的所有資料。

  多個調用會排入佇列，直到 AWS IoT Greengrass 核心軟體提早執行調用。

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

  當您需要在沒有任何初始輸入的情況下開始工作時，請使用長期 Lambda 函數。例如，長期函數可以載入並開始處理機器學習模型，以便在函數接收裝置資料時準備就緒。
**注意**  
長期函數具有與其處理常式的每個調用相關聯的逾時。如果您想要叫用無限期執行的程式碼，您必須在處理常式外部啟動它。請確定處理常式外部沒有封鎖碼，而可能使函數無法初始化。  
除非 AWS IoT Greengrass 核心軟體停止，否則這些函數會執行，例如在部署或重新啟動期間。如果函數遇到未攔截的例外狀況、超過其記憶體限制，或輸入錯誤狀態，例如處理常式逾時，則不會執行這些函數。

如需容器重複使用的詳細資訊，請參閱*AWS 運算部落格*中的[了解 中的容器重複使用 AWS Lambda](https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/)。

## 設定 Lambda 函數容器化
<a name="lambda-containerization"></a>

根據預設，Lambda 函數會在 AWS IoT Greengrass 容器內執行。Greengrass 容器可在函數和主機之間提供隔離。此隔離可提高主機和容器中函數的安全性。

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

在下列情況下，您可以執行 Lambda 函數而不進行容器化：
+ 您想要 AWS IoT Greengrass 在不支援容器模式的裝置上執行 。例如，如果您想要使用特殊的 Linux 發行版本，或是舊版的核心版本已過期。
+ 您想要在另一個容器環境中使用自己的 OverlayFS 執行 Lambda 函數，但當您在 Greengrass 容器中執行 時，會遇到 OverlayFS 衝突。
+ 您需要使用無法在部署時間確定的路徑，或其路徑在部署後可能會變更的路徑來存取本機資源。此資源的範例為可插入裝置。
+ 您有一個先前以程序形式寫入的應用程式，當您在 Greengrass 容器中執行時遇到問題。


**容器化差異**  

| 容器化 | 備註 | 
| --- | --- | 
| Greengrass 容器 |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/greengrass/v2/developerguide/run-lambda-functions.html)  | 
| 沒有容器 |  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/greengrass/v2/developerguide/run-lambda-functions.html)  | 

如果您在部署 Lambda 函數時變更其容器化，該函數可能無法如預期般運作。如果 Lambda 函數使用不再可用於新容器化設定的本機資源，則部署會失敗。
+ 當您將 Lambda 函數從在 Greengrass 容器中執行變更為在沒有容器化的情況下執行時，函數的記憶體限制會遭到捨棄。您必須直接存取檔案系統，而不是使用連接的本機資源。部署 Lambda 函數之前，您必須先移除任何連接的資源。
+ 當您將 Lambda 函數從在沒有容器化的情況下執行變更為在容器中執行時，您的 Lambda 函數會失去檔案系統的直接存取權。您必須為每個函數定義記憶體限制，或接受預設的 16 MB 記憶體限制。您可以在部署時為每個 Lambda 函數設定這些設定。

若要變更 Lambda 函數元件的容器化設定，請在部署元件時，將`containerMode`組態參數的值設定為下列其中一個選項。<a name="lambda-function-component-container-mode-parameter"></a>
+ `NoContainer` – 元件不會在隔離的執行時間環境中執行。
+ `GreengrassContainer` – 元件會在 AWS IoT Greengrass 容器內的隔離執行期環境中執行。

如需如何部署和設定元件的詳細資訊，請參閱 [將 AWS IoT Greengrass 元件部署至裝置](manage-deployments.md)和 [更新元件組態](update-component-configurations.md)。