

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

# 使用 Lambda 擴充功能來增強 Lambda 函數
<a name="lambda-extensions"></a>

您可以使用 Lambda 擴展功能來增強 Lambda 函數。例如，使用 Lambda 擴展將函數與您偏好的監控、可觀度、安全性和治理工具整合。您可以從 [AWS Lambda 合作夥伴](https://aws.amazon.com/lambda/partners/)提供的廣泛工具集中選擇，也可以[建立自己的 Lambda 擴展](runtimes-extensions-api.md)。

Lambda 支援外部和內部擴展。外部延伸項目會在執行環境中作為獨立的處理序執行，並在完全處理函式叫用之後繼續執行。由於延伸項目會以單獨的程序執行，因此您可以使用與函數不同的語言來撰寫。所有 [Lambda 執行期](lambda-runtimes.md) 支援延伸。

內部延伸項目會執行作為執行階段程序的一部分。您的函式透過使用包裝函式指令碼或進行中的機制存取內部延伸項目，例如 `JAVA_TOOL_OPTIONS`。如需詳細資訊，請參閱[修改執行階段環境](runtimes-modify.md)。

您可以使用 Lambda 主控台、 AWS Command Line Interface (AWS CLI) 或基礎設施做為程式碼 (IaC) 服務和工具，例如 AWS Serverless Application Model (AWS SAM) 和 Terraform CloudFormation，將延伸項目新增至函數。

您需要依據延伸項目所耗用的執行時間付費 (以 1 毫秒為單位)。安裝自己的延伸項目不需花費任何費用。如需延伸項目的定價資訊，請參閱[AWS Lambda 定價](https://aws.amazon.com/lambda/pricing/)。如需合作夥伴延伸項目的定價資訊，請參閱合作夥伴的網站。如需官方合作夥伴擴充功能清單，請參閱 [AWS Lambda 延伸合作夥伴](extensions-api-partners.md)。

**Topics**
+ [執行環境](#using-extensions-env)
+ [對效能和資源的影響](#using-extensions-reg)
+ [許可](#using-extensions-permissions)
+ [設定 Lambda 延伸模組](extensions-configuration.md)
+ [AWS Lambda 延伸合作夥伴](extensions-api-partners.md)
+ [使用 Lambda 延伸 API 來建立延伸項目](runtimes-extensions-api.md)
+ [使用遙測 API 即時存取延伸功能的遙測資料](telemetry-api.md)

## 執行環境
<a name="using-extensions-env"></a>

Lambda 會在[執行環境](lambda-runtime-environment.md)中叫用您的函數，該環境可提供安全且隔離的執行時間環境。執行環境會管理執行函數所需的資源，並為函數的執行時間和延伸項目提供生命週期支援。

執行環境的生命週期包含下列階段：
+ `Init`：在此階段中，Lambda 會使用設定的資源建立或解除凍結執行環境，下載函數程式碼和所有層，初始化所有擴展功能，初始化執行時間，然後執行函數的初始化程式碼 (主處理常式之外的程式碼)。此 `Init` 階段發生在第一次調用期間，或者在函數調用之前發生 (如果您已啟用[佈建並行](provisioned-concurrency.md))。

  `Init` 階段分為三個子階段：`Extension init`、`Runtime init` 以及 `Function init`。這些子階段可確保所有擴展功能和執行時間在函數程式碼執行之前完成其設定任務。

  在 [Lambda SnapStart](snapstart.md) 啟動的情況下，發佈函數版本時會發生 `Init` 階段。Lambda 會儲存初始化執行環境的記憶體和磁碟狀態快照、保留加密的快照，並快取以進行低延遲存取。如果您擁有檢查點前的[執行時期勾點](snapstart-runtime-hooks.md)，則程式碼會在 `Init` 階段結束時執行。
+ `Restore` (僅限 SnapStart)：第一次叫用 [SnapStart](snapstart.md) 函數且函數擴展時，Lambda 會從保留的快照繼續新的執行環境，而不是從頭開始初始化函數。如果您設定了還原後[執行時期勾點](snapstart-runtime-hooks.md)，其程式碼會在 `Restore` 階段結束時執行。您需支付還原後執行時期勾點期間的費用。執行時期必須完成載入，且還原後執行時期勾點必須在逾時限制 (10 秒) 內完成。否則，您將收到 SnapStartTimeoutException 訊息。`Restore` 階段完成時，Lambda 會調用函數處理常式 ([調用階段](lambda-runtime-environment.md#runtimes-lifecycle-invoke))。
+ `Invoke`：在此階段中，Lambda 會調用函數處理常式。函數執行完成之後，Lambda 會準備處理另一個函數調用。
+ `Shutdown`：如果 Lambda 函數在一段時間內未收到任何調用，就會觸發此階段。在 `Shutdown` 階段中，Lambda 會關閉執行時間、警示擴展功能以便它們完全停止，然後移除環境。Lambda 會傳送 `Shutdown` 事件到每個擴展功能，這會告訴擴展功能環境即將關閉。

在 `Init` 階段期間，Lambda 會將包含擴展功能的圖層擷取到執行環境中的 `/opt` 目錄。Lambda 在 `/opt/extensions/` 目錄中尋找擴展功能，將每個檔案解譯為啟動擴展的可執行引導程序，並平行啟動所有擴展。

## 對效能和資源的影響
<a name="using-extensions-reg"></a>

函式延伸項目的大小會計入部署套件的大小限制。針對 .zip 封存檔，函數和所有延伸項目解壓縮後的總大小不能超過解壓縮後 250 MB 的部署套件大小限制。

延伸項目可能會影響您的函式效能，因為它們會共用 CPU、記憶體和儲存體等函式資源。例如，如果延伸項目執行運算密集的作業，您可能會看到函數的執行持續時間增加。

在 Lambda 叫用函數之前，每個擴展必須完成其初始化。因此，耗用大量初始化時間的延伸可能會增加函式叫用的延遲。

若要測量延伸項目在函式執行後所花費的額外時間，您可以使用 `PostRuntimeExtensionsDuration` [函式指標](monitoring-metrics.md)。若要測量使用的記憶體的增加情況，您可以使用 `MaxMemoryUsed` 指標。若要了解特定延伸項目的影響，您可以並排執行不同版本的函式。

**注意**  
`MaxMemoryUsed` 指標是 [Lambda Insights 收集的指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Lambda-Insights-metrics.html)之一，並非 Lambda 原生指標。

## 許可
<a name="using-extensions-permissions"></a>

延伸項目可存取與函式相同的資源。因為延伸項目是在與函式相同的環境中執行的，所以許可會在函式和延伸項目之間共用。

對於 .zip 檔案封存，您可以建立 CloudFormation 範本，以簡化將相同延伸組態 - 包括 AWS Identity and Access Management (IAM) 許可 - 連接至多個函數的任務。