

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

# Lambda 執行期
<a name="lambda-runtimes"></a>

Lambda 透過使用*執行期*支援多種語言。執行期會提供特定於語言的環境，其可轉傳調用事件、內容資訊以及 Lambda 與函數之間的回應。您可以使用由 Lambda 提供的執行期或是自行建置。

Lambda 與您選擇的執行時期無關。對於簡單的函數，Python 和 Node.js 等解釋型語言可提供最快的效能。對於運算較複雜的函數，像 Java 這樣的編譯語言通常初始化速度較慢，但在 Lambda 處理程序中的執行速度很快。執行時期的選擇也受開發人員偏好和語言熟悉程度的影響。

每個主要的程式設計語言版本都有獨立的執行階段，且具有唯一的*執行階段識別符*，例如 `nodejs24.x` 或 `python3.14`。若要設定函數以使用新的主要語言版本，您需變更執行期識別符。由於 AWS Lambda 無法保證主要版本之間的回溯相容性，因此這是客戶驅動的操作。

 針對 [定義為容器映像的函數](images-create.md)，您可以在建立容器映像時選擇執行期和 Linux 發行版。若要變更執行期，請建立新的容器映像。

若要為部署套件使用 .zip 封存檔，您可以在建立函數時選擇執行期。若要變更執行期，您可以[更新函數的組態](configuration-function-zip.md)。執行期與其中一個 Amazon Linux 發行版配對。基礎執行環境會提供其他程式庫以及[環境變數](configuration-envvars.md)，讓您可以從函數程式碼中存取。

Lambda 在[執行環境](lambda-runtime-environment.md)中調用您的函數。執行環境提供安全且隔離的執行期環境，它會管理執行您的函數所需的資源。Lambda 會從之前的調用 (若有) 中重新使用執行環境，或者它會建立一個新的執行環境。

若要在 Lambda 中使用其他語言，例如 [Go](lambda-golang.md) 或 [Rust](lambda-rust.md)，請使用[僅限作業系統的執行期](runtimes-provided.md)。Lambda 執行環境提供了[執行期介面](runtimes-api.md)，用於取得調用事件及傳送回應。您可以透過實作[自訂執行期](runtimes-custom.md)和您的函數程式碼，或在一個[層](chapter-layers.md)中部署其他語言。

## 支援的執行時期
<a name="runtimes-supported"></a>

下表列出受支援的 Lambda 執行期和預計的棄用日期。在執行期被棄用後，您依然能在限定時間內建立與更新函數。如需詳細資訊，請參閱[棄用後的執行時期使用情況](#runtime-deprecation-levels)。根據我們的 [執行期淘汰政策](#runtime-support-policy)，該表格提供了目前預測的執行時期的棄用日期。這些日期提供用於規劃目的，且可能發生變更。

**重要**  
Amazon Linux 2 的生命週期將於 2026 年 6 月 30 日結束。除了語言執行期修補程式之外，適用於 Java 8 (AL2)、Java 11、Java 17、Python 3.10、Python 3.11 和 provided.al2 的 Lambda 執行期和容器基礎映像將繼續接收[重大和所選重要](https://alas.aws.amazon.com/faqs.html) Amazon Linux 2 安全問題的修補程式，直到下表中顯示的棄用日期為止。  
我們建議客戶盡快升級至以 Amazon Linux 2023 為基礎的執行時間。對於升級至 Java 21 或 Java 25 的客戶，您可以使用[AWS Transform 自訂](https://docs.aws.amazon.com/transform/latest/userguide/custom.html)來協助進行這些升級。對於無法升級其 Java 版本的客戶，我們計劃在 2026 年第 Q2結束前發行 Java 8、Java 11 和 Java 17 的 Amazon Linux 2023 型執行期。


| Name | 識別符 | 作業系統 | 取代日期 | 封鎖函數建立 | 封鎖函數更新 | 
| --- | --- | --- | --- | --- | --- | 
|  Node.js 24  |  `nodejs24.x`  |  Amazon Linux 2023  |   2028 年 4 月 30 日   |   2028 年 6 月 1 日   |   2028 年 7 月 1 日   | 
|  Node.js 22  |  `nodejs22.x`  |  Amazon Linux 2023  |   2027 年 4 月 30 日   |   2027 年 6 月 1 日   |   2027 年 7 月 1 日   | 
|  Node.js 20  |  `nodejs20.x`  |  Amazon Linux 2023  |   2026 年 4 月 30 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  Python 3.14  |  `python3.14`  |  Amazon Linux 2023  |   2029 年 6 月 30 日   |   2029 年 7 月 31 日   |   2029 年 8 月 31 日   | 
|  Python 3.13  |  `python3.13`  |  Amazon Linux 2023  |   2029 年 6 月 30 日   |   2029 年 7 月 31 日   |   2029 年 8 月 31 日   | 
|  Python 3.12  |  `python3.12`  |  Amazon Linux 2023  |   2028 年 10 月 31 日   |   2028 年 11 月 30 日   |   2029 年 1 月 10 日   | 
|  Python 3.11  |  `python3.11`  |  Amazon Linux 2  |   2027 年 6 月 30 日   |   2027 年 7 月 31 日   |   2027 年 8 月 31 日   | 
|  Python 3.10  |  `python3.10`  |  Amazon Linux 2  |   2026 年 10 月 31 日   |   2026 年 11 月 30 日   |   2027 年 1 月 15 日   | 
|  Java 25  |  `java25`  |  Amazon Linux 2023  |   2029 年 6 月 30 日   |   2029 年 7 月 31 日   |   2029 年 8 月 31 日   | 
|  Java 21  |  `java21`  |  Amazon Linux 2023  |   2029 年 6 月 30 日   |   2029 年 7 月 31 日   |   2029 年 8 月 31 日   | 
|  Java 17  |  `java17`  |  Amazon Linux 2  |   2027 年 6 月 30 日   |   2027 年 7 月 31 日   |   2027 年 8 月 31 日   | 
|  Java 11  |  `java11`  |  Amazon Linux 2  |   2027 年 6 月 30 日   |   2027 年 7 月 31 日   |   2027 年 8 月 31 日   | 
|  Java 8  |  `java8.al2`  |  Amazon Linux 2  |   2027 年 6 月 30 日   |   2027 年 7 月 31 日   |   2027 年 8 月 31 日   | 
|  .NET 10  |  `dotnet10`  |  Amazon Linux 2023  |   2028 年 11 月 14 日   |   2028 年 12 月 14 日   |   2029 年 1 月 15 日   | 
|  .NET 9 （僅限容器）  |  `dotnet9`  |  Amazon Linux 2023  |   2026 年 11 月 10 日   |   未排程   |   未排程   | 
|  .NET 8  |  `dotnet8`  |  Amazon Linux 2023  |   2026 年 11 月 10 日   |   2026 年 12 月 10 日   |   2027 年 1 月 11 日   | 
|  Ruby 3.4  |  `ruby3.4`  |  Amazon Linux 2023  |   2028 年 3 月 31 日   |   2028 年 4 月 30 日   |   2028 年 5 月 31 日   | 
|  Ruby 3.3  |  `ruby3.3`  |  Amazon Linux 2023  |   2027 年 3 月 31 日   |   2027 年 4 月 30 日   |   2027 年 5 月 31 日   | 
|  Ruby 3.2  |  `ruby3.2`  |  Amazon Linux 2  |   2026 年 3 月 31 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  僅限作業系統的執行期  |  `provided.al2023`  |  Amazon Linux 2023  |   2029 年 6 月 30 日   |   2029 年 7 月 31 日   |   2029 年 8 月 31 日   | 
|  僅限作業系統的執行期  |  `provided.al2`  |  Amazon Linux 2  |   2026 年 7 月 31 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 

**注意**  
對於新區域，Lambda 將不支援設定為在未來 6 個月內棄用的執行階段。

Lambda 透過修補程式和次要版本發布的支援，讓受管執行期和其對應的容器基礎映像檔保持在最新狀態。如需詳細資訊，請參閱 [Lambda 執行期更新](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html)。

若要以程式設計方式與 Lambda 函數中的其他 AWS 服務 和資源互動，您可以使用其中一個 AWS SDKs。Node.js、Python 和 Ruby 執行時間包含 AWS SDK 的版本。不過，若要維持對相依項的完全控制權，並在執行時期自動更新期間最大化[回溯相容性](runtimes-update.md#runtime-update-compatibility)，建議一律將程式碼使用的 SDK 模組 (以及任何相依項) 納入函式的部署套件或 [Lambda 層](chapter-layers.md)。

建議僅在部署中無法納入額外套件時，才使用執行時期內含的 SDK 版本。例如，當您使用 Lambda 主控台程式碼編輯器或在 CloudFormation 範本中使用內嵌函數程式碼建立函數時。

Lambda 會定期更新 Node.js、Python 和 Ruby 執行時間中包含的 AWS SDKs 版本。若要判斷目前所用執行時期內含的 AWS SDK 版本，請參閱下列章節：
+ [執行時期內含 SDK 版本 (Node.js)](lambda-nodejs.md#nodejs-sdk-included)
+ [執行時期內含 SDK 版本 (Python)](lambda-python.md#python-sdk-included)
+ [執行時期內含 SDK 版本 (Ruby)](lambda-ruby.md#ruby-sdk-included)

棄用 Go 1.x 執行期後，Lambda 將繼續支援 Go 程式設計語言。如需詳細資訊，請參閱*AWS 運算部落格*上的[將 AWS Lambda 函數從 Go1.x 執行時間遷移至 Amazon Linux 2 上的自訂執行時間。](https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-from-the-go1-x-runtime-to-the-custom-runtime-on-amazon-linux-2/)

所有支援的 Lambda 執行時期都支援 x86\$164 和 arm64 架構。

## 新執行期版本
<a name="runtimes-future"></a>

Lambda 僅在發行版本到達語言發布週期的長期支援 (LTS) 階段時提供新語言版本的受管理執行期。例如，對於 [Node.js 發布週期](https://nodejs.org/en/about/previous-releases)，即當發行版本達到 Active LTS 階段時。

在發行版本達到長期支援階段以前，它將停留於開發中，並且仍可能有重大變更。Lambda 依預設會自動套用執行期更新，因此對執行期版本的重大變更可能使您的函數無法如預期執行。

Lambda 不會為未排定 LTS 發行版本的語言版本提供受管理執行期。

下列清單顯示即將到來的 Lambda 執行期目標啟動月份。這些日期僅為象徵性，並可能有所變更。
+ **Ruby 3.5** - 2026 年 3 月
+ **AL2023 上的 Java 8、11 和 17** - 2026 年第 2 Q2 
+ **Node.js 26** - 2026 年 11 月
+ **Python 3.15** - 2026 年 11 月

## 執行期淘汰政策
<a name="runtime-support-policy"></a>

用於 .zip 壓縮檔的 Lambda 執行時期，均須以接受維護與安全性更新的作業系統、程式設計語言及軟體程式庫的組合為基礎建置。Lambda 的標準淘汰政策是在執行時期的任何主要元件到達社群長期支援 (LTS) 結束，且不再提供安全性更新時，淘汰執行時期。大多數情況下，這是語言執行期，雖然在某些情況下，執行期可以被棄用，因為操作系統 (OS) 到達 LTS 的結束。

取代執行時間之後， AWS 可能不再將安全修補程式或更新套用至該執行時間，使用該執行時間的函數將不再符合技術支援的資格。這類已棄用的執行時期會依現狀提供，無需任何保證，且可能包含問題、錯誤、瑕疵或其他漏洞。

若要進一步了解如何管理執行期升級和棄用，請參閱運算*AWS 部落格*上的下列章節和管理[AWS Lambda 執行期升級](https://aws.amazon.com/blogs/compute/managing-aws-lambda-runtime-upgrades/)。

**重要**  
Lambda 偶爾會在執行期支援的語言版本的支援日期結束後，在有限期間內延遲棄用 Lambda 執行期。在此期間，Lambda 僅將安全性修補程式套用至執行期作業系統。Lambda 不會在到達支援結束日期之後，將安全性修補程式套用到程式設計語言執行期。

## 共同責任模型
<a name="runtimes-shared-responsibility"></a>

 Lambda 負責為所有受支援的受管執行時期與容器映像策劃和發布安全性更新。預設情況下，Lambda 會將這些更新自動套用至使用受管執行時期的函數。若預設自動執行時期更新設定已變更，請參閱[執行時期管理控制共同責任模型](runtime-management-shared.md)。對於使用容器映像部署的函數，您需負責從最新的基礎映像重建函數的容器映像，並重新部署容器映像。

 當執行時期已棄用時，Lambda 更新受管執行時期和容器基礎映像的責任會停止。您有責任升級函數以使用支援的執行時期或基礎映像。

 在所有情況下，您都必須負責將更新套用至函數程式碼，包括其相依項。您在共同責任模型下的責任摘要如下表所示。


| 執行時期生命週期階段 | Lambda 的責任 | 您的責任 | 
| --- | --- | --- | 
| 支援的受管執行時期 |  使用安全修補程式和其他更新來提供定期執行時期更新。 根據預設自動套用執行時期更新 (請參閱 [執行時期更新模式](runtimes-update.md#runtime-management-controls)，了解非預設行為)。  | 更新您的函數程式碼，包括相依項，以解決任何安全漏洞。 | 
| 支援的容器映像 | 使用安全修補程式和其他更新，為容器基礎映像提供定期更新。 |  更新您的函數程式碼，包括相依項，以解決任何安全漏洞。 使用最新的基礎映像，定期重建和重新部署容器映像。  | 
| 即將棄用的受管執行時期 |  透過文件、 Health 儀板表電子郵件和 在執行時間棄用之前通知客戶 Trusted Advisor。 執行時期更新的責任會在棄用時結束。  |  監控 Lambda 文件 Health 儀板表、電子郵件或 Trusted Advisor 以取得執行時間棄用資訊。 在棄用先前的執行時期之前，將函數升級至受支援的執行時期。  | 
| 即將棄用的容器映像 |  棄用通知不適用於使用容器映像的函數。 容器基礎映像更新的責任會在棄用時結束。  | 在棄用上一個映像之前，請注意棄用排程，並將函數升級至受支援的基礎映像。 | 

## 棄用後的執行時期使用情況
<a name="runtime-deprecation-levels"></a>

取代執行時間之後， AWS 可能不再將安全修補程式或更新套用至該執行時間，使用該執行時間的函數將不再符合技術支援的資格。雖然您可以無限期地繼續叫用函數，但 AWS 強烈建議您遷移到支援的執行時間。已取代的執行時期「依現狀」提供，無任何保證，且可能包含問題、錯誤、瑕疵或其他漏洞。使用已棄用執行時期的函數也可能會遇到效能降低或其他問題，例如憑證過期，這可能會導致它們停止正常運作。

執行時期被取代後，您隨時可以將函式更新為使用較新版本的受支援執行時期。建議先使用新的執行時期測試函式，再在生產環境中套用變更。函式更新被封鎖後，將無法還原至已取代的執行時期。建議使用函數[版本](configuration-versions.md)與[別名](configuration-aliases.md)功能，以啟用具有復原功能的安全部署。

下列時間軸說明了執行時期被取代後會發生的情況：


| 執行時期生命週期階段 | 當 | 內容 | 
| --- | --- | --- | 
|  棄用通知期間  |  棄用前至少 180 天  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/lambda-runtimes.html)  | 
|  棄用  |  取代日期  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/lambda-runtimes.html)  | 
|  封鎖函數建立  |  棄用後至少 30 天  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/lambda-runtimes.html)  | 
|  封鎖函數更新  |  棄用後至少 60 天  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/lambda-runtimes.html)  | 

**注意**  
對於某些執行時間， AWS 會將 block-function-create 和 block-function-update 日期延遲到棄用後 30 和 60 天。 AWS 已進行此變更以回應客戶意見回饋，讓您有更多時間升級函數。請參閱 [支援的執行時期](#runtimes-supported) 和 [已取代的執行階段](#runtimes-deprecated) 中的資料表，並查看執行時期的日期。此表格所列日期前，Lambda 不會開始阻擋建立或更新函式。

## 接收執行期棄用通知
<a name="runtime-deprecation-notify"></a>

當執行時間接近其棄用日期時，如果您 AWS 帳戶 使用該執行時間中的任何函數，Lambda 會傳送電子郵件提醒給您。通知也會顯示在 Health 儀板表 和 中 AWS Trusted Advisor。
+ 接收電子郵件通知：

  執行期被棄用前至少 **180 天**，Lambda 會向您傳送電子郵件提醒。此電子郵件將列出所有使用執行期之函數的 \$1LATEST 版本。若要查看受影響函數版本的完整清單，請使用 Trusted Advisor 或參閱 [擷取使用已棄用執行時期之 Lambda 函數的資料](runtimes-list-deprecated.md)。

  Lambda AWS 帳戶會傳送電子郵件通知給您的主要帳戶聯絡人。如需有關檢視或更新帳戶中電子郵件地址的資訊，請參閱《AWS 一般參考》**中的[更新聯絡資訊](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact.html)。
+ 透過 接收通知 Health 儀板表：

  會在執行時間棄用前至少 **180 天** Health 儀板表 顯示通知。通知顯示在[其他通知](https://health.aws.amazon.com/health/home#/account/dashboard/other-notifications)下方的**您的帳戶運作狀態**頁面上。通知的**受影響資源**索引標籤會列出所有使用執行期之函數的 \$1LATEST 版本。
**注意**  
若要查看受影響函數版本的完整和up-to-date清單，請使用 Trusted Advisor 或參閱 [擷取使用已棄用執行時期之 Lambda 函數的資料](runtimes-list-deprecated.md)。

  Health 儀板表 通知會在受影響的執行時間棄用後 90 天過期。
+ 使用 AWS Trusted Advisor

  Trusted Advisor 會在執行時間棄用前至少 **180 天**顯示通知。通知顯示在[安全性](https://console.aws.amazon.com/trustedadvisor/home#/category/security)頁面上。受影響函數的清單會顯示在**使用已棄用執行期的AWS Lambda 函數**的下方。此函數清單同時顯示 \$1LATEST 和已發佈版本，並且會自動更新以反映您的函數的最新狀態。

  您可以在 Trusted Advisor 主控台的[偏好設定](https://console.aws.amazon.com/trustedadvisor/home?#/preferences)頁面 Trusted Advisor 中，從 開啟每週電子郵件通知。

## 已取代的執行階段
<a name="runtimes-deprecated"></a>

下列執行階段已達到終止支援：


| Name | 識別符 | 作業系統 | 取代日期 | 封鎖函數建立 | 封鎖函數更新 | 
| --- | --- | --- | --- | --- | --- | 
|  Python 3.9  |  python3.9  |  Amazon Linux 2  |   2025 年 12 月 15 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  Node.js 18  |  nodejs18.x  |  Amazon Linux 2  |   2025 年 9 月 1 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  .NET 6  |  dotnet6  |  Amazon Linux 2  |   2024 年 12 月 20 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  Python 3.8  |  python3.8  |  Amazon Linux 2  |   2024 年 10 月 14 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  Node.js 16  |  nodejs16.x  |  Amazon Linux 2  |   2024 年 6 月 12 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 
|  .NET 7 (僅限容器)  |  dotnet7  |  Amazon Linux 2  |   2024 年 5 月 14 日   |   N/A   |   N/A   | 
|  Java 8  |  java8  |  Amazon Linux  |   2024 年 1 月 8 日   |   2024 年 2 月 8 日   |   2026 年 9 月 30 日   | 
|  Go 1.x  |  go1.x  |  Amazon Linux  |   2024 年 1 月 8 日   |   2024 年 2 月 8 日   |   2026 年 9 月 30 日   | 
|  僅限作業系統的執行期  |  provided  |  Amazon Linux  |   2024 年 1 月 8 日   |   2024 年 2 月 8 日   |   2026 年 9 月 30 日   | 
|  Ruby 2.7  |  ruby2.7  |  Amazon Linux 2  |   2023 年 12 月 7 日   |   2024 年 1 月 9 日   |   2026 年 9 月 30 日   | 
|  Node.js 14  |  nodejs14.x  |  Amazon Linux 2  |   2023 年 12 月 4 日   |   2024 年 1 月 9 日   |   2026 年 9 月 30 日   | 
|  Python 3.7  |  python3.7  |  Amazon Linux  |   2023 年 12 月 4 日   |   2024 年 1 月 9 日   |   2026 年 9 月 30 日   | 
|  .NET Core 3.1  |  dotnetcore3.1  |  Amazon Linux 2  |   2023 年 4 月 3 日   |   2023 年 4 月 3 日   |   2023 年 5 月 3 日   | 
|  Node.js 12  |  nodejs12.x  |  Amazon Linux 2  |   2023 年 3 月 31 日   |   2023 年 3 月 31 日   |   2023 年 4 月 30 日   | 
|  Python 3.6  |  python3.6  |  Amazon Linux  |   2022 年 7 月 18 日   |   2022 年 7 月 18 日   |   2022 年 8 月 29 日   | 
|  .NET 5 (僅限容器)  |  dotnet5.0  |  Amazon Linux 2  |   2022 年 5 月 10 日   |   N/A   |   N/A   | 
|  .NET Core 2.1  |  dotnetcore2.1  |  Amazon Linux  |   2022 年 1 月 5 日   |   2022 年 1 月 5 日   |   2022 年 4 月 13 日   | 
|  Node.js 10  |  nodejs10.x  |  Amazon Linux 2  |   2021 年 7 月 30 日   |   2021 年 7 月 30 日   |   2022 年 2 月 14 日   | 
|  Ruby 2.5  |  ruby2.5  |  Amazon Linux  |   2021 年 7 月 30 日   |   2021 年 7 月 30 日   |   2022 年 3 月 31 日   | 
|  Python 2.7  |  python2.7  |  Amazon Linux  |   2021 年 7 月 15 日   |   2021 年 7 月 15 日   |   2022 年 5 月 30 日   | 
|  Node.js 8.10  |  nodejs8.10  |  Amazon Linux  |   2020 年 3 月 6 日   |   2020 年 2 月 4 日   |   2020 年 3 月 6 日   | 
|  Node.js 4.3  |  nodejs4.3  |  Amazon Linux  |   2020 年 3 月 5 日   |   2020 年 2 月 3 日   |   2020 年 3 月 5 日   | 
|  Node.js 4.3 邊緣  |  nodejs4.3-edge  |  Amazon Linux  |   2020 年 3 月 5 日   |   2019 年 3 月 31 日   |   2019 年 4 月 30 日   | 
|  Node.js 6.10  |  nodejs6.10  |  Amazon Linux  |   2019 年 8 月 12 日   |   2019 年 7 月 12 日   |   2019 年 8 月 12 日   | 
|  .NET Core 1.0  |  dotnetcore1.0  |  Amazon Linux  |   2019 年 6 月 27 日   |   2019 年 6 月 30 日   |   2019 年 7 月 30 日   | 
|  .NET Core 2.0  |  dotnetcore2.0  |  Amazon Linux  |   2019 年 5 月 30 日   |   2019 年 4 月 30 日   |   2019 年 5 月 30 日   | 
|  Node.js 0.10  |  nodejs  |  Amazon Linux  |   2016 年 8 月 30 日   |   2016 年 9 月 30 日   |   2016 年 10 月 31 日   | 

在幾乎大多數情況下，都會預先知道語言版本或作業系統的生命週期結束日期。以下連結提供 Lambda 以受管執行期形式支援的每種語言之生命週期結束排程。

**語言和框架支援政策**
+ **Node.js** – [github.com](https://github.com/nodejs/Release#release-schedule)
+ **Python** – [devguide.python.org](https://devguide.python.org/versions/#versions)
+ **Ruby** – [www.ruby-lang.org](https://www.ruby-lang.org/en/downloads/branches/)
+ **Java** – [www.oracle.com](https://www.oracle.com/java/technologies/java-se-support-roadmap.html) 和 [Corretto 常見問答集](https://aws.amazon.com/corretto/faqs/)
+ **Go** – [golang.org](https://golang.org/doc/devel/release.html)
+ **.NET** – [dotnet.microsoft.com](https://dotnet.microsoft.com/platform/support/policy/dotnet-core)

# 了解 Lambda 如何管理執行時期版本更新
<a name="runtimes-update"></a>

Lambda 提供安全性更新、錯誤修正、新功能、效能增強功能，以及次要版本支援，讓每個受管理執行階段都保持最新狀態。這些執行階段更新會發佈為*執行階段版本*。Lambda 會將函數從舊的執行階段版本遷移至新的執行階段版本，藉此將執行階段更新套用至函數。

預設情況下，對於使用受管執行階段的函數，Lambda 會自動套用執行階段更新。若使用自動執行階段更新，Lambda 需承受修補執行階段版本的運作負擔。對大多數客戶而言，自動更新是正確的選擇。您可以透過[設定執行時期管理設定](runtime-management-configure-settings.md)來變更此預設行為。

Lambda 也會將每個新的執行階段版本發佈為容器映像。若要更新容器型函數的執行階段版本，您必須從更新的基礎映像[建立新的容器映像](images-create.md)，然後重新部署函數。

每個執行階段版本都與一個版本編號和一個 ARN (Amazon Resource Name) 相關聯。執行階段版本編號使用 Lambda 定義的編號結構描述，與程式設計語言使用的版本編號無關。執行時期版本編號並非總是連續的。例如，版本 42 之後可能會是版本 45。執行階段版本 ARN 是每個執行階段版本的唯一識別符。您可以在 Lambda 主控台或[函數日誌的 `INIT_START` 行](runtime-management-identify.md)中，檢視函數目前執行時期版本的 ARN。

執行階段版本不應與執行階段識別符混淆。每個執行階段都有唯一的**執行階段識別符**，例如 `python3.14` 或 `nodejs24.x`。這些會對應到每個主要的程式設計語言版本。執行階段版本會描述個別執行階段的修補程式版本。

**注意**  
相同執行時間版本編號的 ARN 可能因 AWS 區域 和 CPU 架構而異。

**Topics**
+ [

## 回溯相容性
](#runtime-update-compatibility)
+ [

## 執行時期更新模式
](#runtime-management-controls)
+ [

## 兩階段執行階段版本推展
](#runtime-management-two-phase)
+ [

# 設定 Lambda 執行時期管理設定
](runtime-management-configure-settings.md)
+ [

# 復原 Lambda 執行時期版本
](runtime-management-rollback.md)
+ [

# 識別 Lambda 執行時期版本變更
](runtime-management-identify.md)
+ [

# 了解 Lambda 執行時期管理的共同責任模式
](runtime-management-shared.md)
+ [

# 控制高合規應用程式的 Lambda 執行時期更新許可
](runtime-management-hc-applications.md)

## 回溯相容性
<a name="runtime-update-compatibility"></a>

Lambda 致力於提供與現有函數回溯相容的執行階段更新。但是與軟體修補一樣，在極少數情況下，執行階段更新可能會對現有函數產生負面影響。例如，安全性修補程式可能會暴露現有函數的潛在問題，取決於先前的不安全行為。

在建置與部署函式時，務必掌握相依項的管理方法，避免執行時期未來更新時發生相容性問題。舉例而言，若函式相依於套件 A，而套件 A 又相依於套件 B，這兩個套件已內建於 Lambda 執行時期 (例如，二者可能是 SDK 或其相依項的一部分，或是執行時期系統程式庫的一部分)。

請考量下列情況：


| 部署 | 修補相容性 | Reason | 
| --- | --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/runtimes-update.html)  | 是 | 未來對套件 A 與 B 進行的執行時期更新將保持回溯相容性。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/runtimes-update.html)  | 是 | 您的部署具有優先性，因此未來對套件 A 與 B 進行的執行時期更新不會產生影響。 | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/runtimes-update.html)  | 是\$1 |  未來對套件 B 進行的執行時期更新將保持回溯相容性。 \$1如果 A 與 B 緊密耦合，可能引發相容性問題。例如，適用於 Python 的 AWS SDK 中的 `boto3`和 `botocore`套件應該一起部署。  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/runtimes-update.html)  | 否 | 未來對套件 A 進行的執行時期更新，可能需要相應更新套件 B 的版本。然而，已部署的套件 B 版本具有優先性，且可能與套件 A 的更新版本不具備向前相容性。 | 

若要與未來執行時期更新保持相容性，請遵循下列最佳實務：
+ **盡可能封裝所有相依性：**在您的部署套件中包含所有必要的程式庫，包括 AWS SDK 及其相依性。此舉能確保元件組合的穩定性與相容性。
+ **謹慎使用執行時間提供的 SDKs：**只有在您無法包含其他套件時 （例如，使用 Lambda 主控台程式碼編輯器或在 AWS CloudFormation 範本中使用內嵌程式碼時），才依賴執行時間提供的 SDK。
+ **避免覆寫系統程式庫：**請勿部署可能與未來執行時期更新衝突的自訂作業系統程式庫。

## 執行時期更新模式
<a name="runtime-management-controls"></a>

Lambda 致力於提供與現有函數回溯相容的執行階段更新。但是與軟體修補一樣，在極少數情況下，執行階段更新可能會對現有函數產生負面影響。例如，安全性修補程式可能會暴露現有函數的潛在問題，取決於先前的不安全行為。在罕見的執行階段版本不相容情況下，Lambda 執行階段管理控制有助於降低對工作負載造成影響的風險。針對每個[函數版本](configuration-versions.md) (`$LATEST` 或已發佈版本)，您可以選擇下列其中一種執行階段更新模式：
+ **Auto (default)** (自動 (預設)) - 使用 [兩階段執行階段版本推展](#runtime-management-two-phase) 自動更新為最新且安全的執行階段版本。我們建議大多數客戶使用此模式，便能隨時受益於執行階段更新。
+ **函數更新**：當您更新函數時，更新為最新且安全的執行階段版本。當您更新函數時，Lambda 會將函數的執行階段更新為最新且安全的執行階段版本。此做法可同步執行階段更新與函數部署，讓您控制 Lambda 何時套用執行階段更新。使用此模式，您可以及早偵測並減輕罕見的執行階段更新不相容情況。使用此模式時，您必須定期更新函數，讓執行階段保持最新狀態。
+ **手動**：手動更新您的執行階段版本。您可以在函數組態中指定執行階段版本。該函數將無限期使用此執行階段版本。在罕見情況下，新的執行階段版本會與現有函數不相容，您可以使用此模式，讓函數復原至較舊的執行階段版本。建議您不要使用 **Manual** (手動) 模式來嘗試達到跨部署的執行階段一致性。如需詳細資訊，請參閱[復原 Lambda 執行時期版本](runtime-management-rollback.md)。

將執行階段更新套用至函數的責任分配，會根據您選擇的執行階段更新模式而有所不同。如需詳細資訊，請參閱[了解 Lambda 執行時期管理的共同責任模式](runtime-management-shared.md)。

## 兩階段執行階段版本推展
<a name="runtime-management-two-phase"></a>

Lambda 會依照以下順序引入新的執行階段版本：

1. 在第一階段，每當您建立或更新函數，Lambda 都會套用新的執行階段版本。當您呼叫 [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html) 或 [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) API 操作，函數便會更新。

1. 在第二階段，Lambda 會更新任何使用 **Auto** (自動) 執行階段更新模式且尚未更新為新執行階段版本的函數。

推展程序的整體持續時間會因許多因素而有所不同，包括執行階段更新中所包含任何安全性修補程式的嚴重性。

如果您正在開發和部署函數，很可能會在第一階段選擇新的執行階段版本。這會將執行階段更新與函數更新同步。在極少數情況下，最新的執行階段版本會對您的應用程式造成負面影響，而此做法可讓您立即採取更正動作。非開發中的函數仍然會在第二階段獲得自動執行階段更新的運作效益。

此方法不會影響設為 **Function update** (函數更新) 或 **Manual** (手動) 模式的函數。使用 **Function update** (函數更新) 模式的函數，只會在您建立或更新函數時收到最新的執行階段更新。使用 **Manual** (手動) 模式的函數不會收到執行階段更新。

Lambda 以漸進、滾動方式於 AWS 區域發佈新的執行階段版本。如果您的函數設為 **Auto** (自動) 或 **Function update** (函數更新) 模式，那麼同時部署至不同區域或同一地區在不同時間部署的函數，可能會採用不同的執行階段版本。需要在不同環境中保證執行期版本一致性的客戶，應 [使用容器映像來部署 Lambda 函數](images-create.md)。**手動** 模式設計為暫時緩解措施，可在發生執行階段版本不相容函數的罕見情況下啟用執行階段版本復原。

# 設定 Lambda 執行時期管理設定
<a name="runtime-management-configure-settings"></a>

您可以使用 Lambda 主控台或 AWS Command Line Interface (AWS CLI) 來配置執行階段管理設定。

**注意**  
您可以針對每個[函數版本](configuration-versions.md)分別配置執行階段管理設定。

**設定 Lambda 如何更新執行階段版本 (主控台)**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 在 **Code** (程式碼) 索引標籤的 **Runtime settings** (執行階段設定) 底下，選擇 **Edit runtime management configuration** (編輯執行階段組態)。

1. 在 **Runtime management configuration** (執行階段管理組態) 底下，選擇下列其中一項：
   + 若要讓函數自動更新為最新的執行階段版本，請選擇 **Auto** (自動)。
   + 若要在變更函數時將函數更新為最新的執行階段版本，請選擇 **Function update** (函數更新)。
   + 若要讓您的函數只在變更執行階段版本 ARN 時才更新為最新的執行階段版本，請選擇 **Manual** (手動)。您可以在 **Runtime management configuration** (執行階段管理組態) 下找到執行階段版本 ARN。您也可以在函數日誌的 `INIT_START` 行中找到 ARN。

   如需關於這些選項的詳細資訊，請參閱[執行時期更新模式](runtimes-update.md#runtime-management-controls)。

1. 選擇**儲存**。

**設定 Lambda 如何更新執行階段版本 (AWS CLI)**

若要設定函數的執行時期管理，請執行 [put-runtime-management-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/put-runtime-management-config.html) AWS CLI 命令。使用 `Manual` 模式時，您還必須提供執行階段版本 ARN。

```
aws lambda put-runtime-management-config \
  --function-name my-function \
  --update-runtime-on Manual \
  --runtime-version-arn arn:aws:lambda:us-east-2::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1
```

您應該會看到類似下列的輸出：

```
{
  "UpdateRuntimeOn": "Manual",
  "FunctionArn": "arn:aws:lambda:us-east-2:111122223333:function:my-function",
  "RuntimeVersionArn": "arn:aws:lambda:us-east-2::runtime:8eeff65f6809a3ce81507fe733fe09b835899b99481ba22fd75b5a7338290ec1"
}
```

# 復原 Lambda 執行時期版本
<a name="runtime-management-rollback"></a>

在罕見情況下，新的執行階段版本會與現有函數不相容，您可以將執行階段版本復原為較舊的版本。這可讓您的應用程式保持正常運作並將中斷時間縮到最短，這樣便有時間在改回最新執行階段版本之前修正不相容情況。

Lambda 不會對您可以使用任何特定執行階段版本的時間長度施加時間限制。不過，我們強烈建議您盡快更新至最新的執行階段版本，以便享有最新的安全性修補程式、效能改善項目和功能。Lambda 提供復原為較舊執行階段版本的選項，只能在發生執行階段更新相容性問題的罕見情況中當成暫時緩解的手段。長時間使用舊版執行階段版本的函數，最終可能會遇到效能降低或發生問題 (例如憑證到期)，這可能會導致它們無法正常運作。

您可以透過下列方式復原執行階段版本：
+ [使用手動執行時期更新模式](#runtime-management-rollback-manual)
+ [使用已發佈的函數版本](#runtime-management-rollback-published)

如需詳細資訊，請參閱AWS Compute 部落格上的 [AWS Lambda 執行階段管理控制介紹](https://aws.amazon.com/blogs/compute/introducing-aws-lambda-runtime-management-controls/)。

## 使用 Manual (手動) 執行階段更新模式復原執行階段版本
<a name="runtime-management-rollback-manual"></a>

如果您使用的是 **Auto** (自動) 執行階段版本更新模式，或是使用 `$LATEST` 執行階段版本，您可以使用 **Manual** (手動) 模式復原執行階段版本。針對您要復原的[函數版本](configuration-versions.md)，將執行階段版本更新模式變更為 **Manual** (手動)，並指定上一個執行階段版本的 ARN。如需查找舊版執行階段 ARN 的詳細資訊，請參閱：[識別 Lambda 執行時期版本變更](runtime-management-identify.md)。

**注意**  
如果您的函數版本 `$LATEST` 設定為使用 **Manual** (手動) 模式，則無法變更函數使用的 CPU 架構或執行階段版本。若要進行這些變更，您必須變更為 **Auto** (自動) 或 **Function update** (函數更新) 模式。

## 使用已發布的函數版本復原執行階段版本
<a name="runtime-management-rollback-published"></a>

已發佈的[函數版本](configuration-versions.md)是您建立 `$LATEST` 函數程式碼和組態時的不可變快照。在 **Auto** (自動) 模式中，Lambda 會在執行階段版本推展的第二階段期間，自動更新已發佈函數版本的執行階段版本。在 **Function update** (函數更新) 模式中，Lambda 不會更新已發佈函數版本的執行階段版本。

因此，使用 **Function update** (函數更新) 模式發佈的函數版本，會建立函數程式碼、組態和執行階段版本的靜態快照。透過將 **Function update** (函數更新) 模式與函數版本搭配使用，您可以將執行階段更新與部署同步。您也可以將流量重新導向至先前發佈的函數版本，協調程式碼、組態和執行階段版本的復原。您可以將此做法整合到持續整合和持續交付 (CI/CD) 中，以便在發生執行階段更新不相容的罕見情況下進行全自動復原。使用此做法時，您必須定期更新函數，並發佈新的函數版本以取得最新的執行階段更新。如需更多詳細資訊，請參閱 [了解 Lambda 執行時期管理的共同責任模式](runtime-management-shared.md)。

# 識別 Lambda 執行時期版本變更
<a name="runtime-management-identify"></a>

[執行時期版本編號](runtimes-update.md)和 ARN 會記錄在 `INIT_START` 日誌行中，而 Lambda 每次建立新的[執行環境](concepts-basics.md#gettingstarted-concepts-runtime)時都會向 CloudWatch Logs 發送該日誌行。由於執行環境對所有函數調用都是使用相同的執行期版本，因此 Lambda 只會在執行初始化階段時發送 `INIT_START` 日誌行。Lambda 不會為每個函數調用發出此日誌行。Lambda 會將此日誌行發送到 CloudWatch Logs，但不會顯示在主控台中。

**注意**  
執行時期版本編號並非總是連續的。例如，版本 42 之後可能會是版本 45。

**Example INIT\$1START 日誌行**  

```
INIT_START Runtime Version: python:3.13.v14    Runtime Version ARN: arn:aws:lambda:eu-south-1::runtime:7b620fc2e66107a1046b140b9d320295811af3ad5d4c6a011fad1fa65127e9e6I
```

您可以使用 [Amazon CloudWatch Contributor Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContributorInsights-CreateRule.html) 來識別執行階段版本之間的轉換情形，而不是直接使用日誌。下列規則會計算每個 `INIT_START` 日誌行中不同的執行階段版本。若要使用此規則，請將範例日誌群組名稱 `/aws/lambda/*` 取代為函數或函數群組的適當前置詞。

```
{
  "Schema": {
    "Name": "CloudWatchLogRule",
    "Version": 1
  },
  "AggregateOn": "Count",
  "Contribution": {
    "Filters": [
      {
        "Match": "eventType",
        "In": [
          "INIT_START"
        ]
      }
    ],
    "Keys": [
      "runtimeVersion",
      "runtimeVersionArn"
    ]
  },
  "LogFormat": "CLF",
  "LogGroupNames": [
    "/aws/lambda/*"
  ],
  "Fields": {
    "1": "eventType",
    "4": "runtimeVersion",
    "8": "runtimeVersionArn"
  }
}
```

下列 CloudWatch Contributor Insights 報告顯示上述規則擷取的執行階段版本轉換範例。橘線顯示舊執行階段版本 (**python:3.13.v12**) 的執行環境初始化，藍線顯示新執行階段版本 (**python:3.13.v14**) 的執行環境初始化。

![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/runtime_version_graph.png)


# 了解 Lambda 執行時期管理的共同責任模式
<a name="runtime-management-shared"></a>

Lambda 負責為所有受支援的受管執行階段與容器映像策劃和發佈安全性更新。更新現有函數以使用最新執行階段版本的責任分配，視您使用的執行階段更新模式而有所不同。

Lambda 負責將執行階段更新套用至設定為使用 **Auto** (自動) 執行階段更新模式的所有函數。

對於使用 **Function update** (函數更新) 執行階段更新模式設定的函數，您必須負責定期更新函數。當您進行這些更新，Lambda 會負責套用執行階段更新。如果您沒有更新函數，Lambda 就不會更新執行階段。如果您沒有定期更新函數，強烈建議您設定為自動執行階段更新，以便繼續收到安全性更新。

對於設定為使用 **Manual** (手動) 執行階段更新模式的函數，您必須負責將函數更新為使用最新的執行階段版本。強烈建議您使用此模式的目的，只是在發生執行階段更新不相容的罕見情況下，將執行階段版本復原當成暫時緩和措施。我們也建議您盡快變更為 **Auto** (自動) 模式，以縮短函數處於未修補狀態的時間。

如果您[使用容器映像來部署函數](images-create.md)，則 Lambda 負責發佈更新的基礎映像。在這種情況下，您需負責從最新的基礎映像重建函數的容器映像，並重新部署容器映像。

以下表進行總結：


****  

| 部署模式 | Lambda 的責任 | 客户的責任 | 
| --- | --- | --- | 
| 受管執行階段，Auto (自動) 模式 |  發佈包含最新修補程式的新執行階段版本。 將執行階段修補程式套用到現有函數  | 在發生執行階段更新相容性問題的罕見情況下，還原至先前的執行階段版本。請遵循[回溯相容性](runtimes-update.md#runtime-update-compatibility)的最佳實務。 | 
| 受管執行階段，Function update (函數更新) 模式 | 發佈包含最新修補程式的新執行階段版本。 |  定期更新函數以取得最新的執行階段版本。 若您沒有定期更新函數，請將函數切換至**Auto** (自動) 模式。 在發生執行階段更新相容性問題的罕見情況下，還原至先前的執行階段版本。請遵循[回溯相容性](runtimes-update.md#runtime-update-compatibility)的最佳實務。  | 
| 受管執行階段，Manual (手動) 模式 | 發佈包含最新修補程式的新執行階段版本。 |  此模式僅適用於發生執行階段更新相容性問題的罕見情況時，暫時復原執行階段。 請盡快將函數切換至 **Auto** (自動) 或 **Function update** (函數更新) 模式及最新的執行階段版本。  | 
| 容器映像 | 發佈包含最新修補程式的新容器映像。 | 使用最新的容器基礎映像定期重新部署函數，以取得最新的修補程式。 | 

如需與 AWS 的共同責任的詳細資訊，請參閱[共同責任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。

# 控制高合規應用程式的 Lambda 執行時期更新許可
<a name="runtime-management-hc-applications"></a>

為了滿足修補需求，Lambda 客戶通常仰賴自動執行階段更新。如果您的應用程式對修補更新狀態有嚴格要求，您可能需要限制使用舊版執行階段。您可以使用 AWS Identity and Access Management (IAM) 來限制 Lambda 的執行階段管理控制，以拒絕 AWS 帳戶中的使用者存取 [PutRuntimeManagementConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutRuntimeManagementConfig.html) API 操作。此操作用於選擇函數的執行階段更新模式。拒絕存取此操作會導致所有函數均預設為 **Auto** (自動) 模式。您可以使用[服務控制政策 (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 在對整個組織套用此限制。如果必須將函數復原至較舊的執行時期版本，您可以依個別情況授予政策例外狀況。

# 擷取使用已棄用執行時期之 Lambda 函數的資料
<a name="runtimes-list-deprecated"></a>

當 Lambda 執行時間即將棄用時，Lambda 會透過電子郵件提醒您，並在 Health 儀板表 和 中提供通知 Trusted Advisor。這些電子郵件和通知會列出使用執行時期的 \$1LATEST 函數版本。若要列出使用特定執行時間的所有函數版本，您可以使用 AWS Command Line Interface (AWS CLI) 或其中一個 AWS SDKs。

如果您有大量函數使用由於已棄用而產生的執行時間，您也可以使用 AWS CLI AWS SDKs 來協助您排定最常調用函數的更新優先順序。

請參閱下列各節，了解如何使用 AWS CLI 和 AWS SDKs來收集使用特定執行時間之函數的資料。

## 列出使用特定執行時期的函數版本
<a name="runtimes-list-deprecated-versions"></a>

若要使用 AWS CLI 列出所有使用特定執行時間的函數版本，請執行下列命令。`RUNTIME_IDENTIFIER` 將 取代為已棄用之執行時間的名稱，然後選擇您自己的執行時間 AWS 區域。如僅需列出 \$1LATEST 函數版本，請省略命令中的 `--function-version ALL`。

```
aws lambda list-functions --function-version ALL --region us-east-1 --output text --query "Functions[?Runtime=='RUNTIME_IDENTIFIER'].FunctionArn" 
```

**提示**  
範例命令會列出特定 `us-east-1` 區域中的函數 AWS 帳戶 。您將需要針對帳戶具有函數的每個區域和您的每個區域重複此命令 AWS 帳戶。

您也可以使用其中一個 AWS SDKs 列出使用特定執行期的函數。下列範例程式碼使用 V3 適用於 JavaScript 的 AWS SDK 和 適用於 Python (Boto3) 的 AWS SDK 來傳回使用特定執行時期之函數的函數 ARN 清單。範例程式碼也會傳回每個所列函數的 CloudWatch 日誌群組。您可以使用此日誌群組來尋找函數的上次調用日期。如需詳細資訊，請參閱下一節[識別最常調用和最近調用的函數](#runtimes-list-deprecated-statistics)。

------
#### [ Node.js ]

**Example 列出使用特定執行時期之函數的 JavaScript 程式碼**  

```
import { LambdaClient, ListFunctionsCommand } from "@aws-sdk/client-lambda";
const lambdaClient = new LambdaClient();

const command = new ListFunctionsCommand({
    FunctionVersion: "ALL",
    MaxItems: 50
});
const response = await lambdaClient.send(command);

for (const f of response.Functions){
    if (f.Runtime == '<your_runtime>'){ // Use the runtime id, e.g. 'nodejs24.x' or 'python3.14'
        console.log(f.FunctionArn);
        // get the CloudWatch log group of the function to
        // use later for finding the last invocation date
        console.log(f.LoggingConfig.LogGroup);
    }   
}
// If your account has more functions than the specified
// MaxItems, use the returned pagination token in the 
// next request with the 'Marker' parameter
if ('NextMarker' in response){
    let paginationToken = response.NextMarker;
  }
```

------
#### [ Python ]

**Example 列出使用特定執行時期之函數的 Python 程式碼**  

```
import boto3
from botocore.exceptions import ClientError

def list_lambda_functions(target_runtime):

    lambda_client = boto3.client('lambda')
    
    response = lambda_client.list_functions(
        FunctionVersion='ALL',
        MaxItems=50
    )
    if not response['Functions']:
            print("No Lambda functions found")
    else: 
        for function in response['Functions']:   
            if function['PackageType']=='Zip' and function['Runtime'] == target_runtime: 
                print(function['FunctionArn'])
                # Print the CloudWatch log group of the function
                # to use later for finding last invocation date
                print(function['LoggingConfig']['LogGroup'])

    if 'NextMarker' in response:
       pagination_token = response['NextMarker']

if __name__ == "__main__":
    # Replace python3.12 with the appropriate runtime ID for your Lambda functions
    list_lambda_functions('python3.12')
```

------

若要進一步了解如何使用 AWS SDK 來列出使用 [ListFunctions](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctions.html) 動作的函數，請參閱您偏好程式設計語言的 [SDK 文件](https://aws.amazon.com/developer/tools/)。

您也可以使用 AWS Config 進階查詢功能，列出所有使用受影響執行時間的函數。此查詢只會傳回函數 \$1LATEST 版本，但您可以使用 AWS 帳戶 單一命令彙總查詢以列出所有區域和多個區域的函數。若要進一步了解，請參閱《 *AWS Config 開發人員指南*》中的[查詢 AWS Auto Scaling 資源的目前組態狀態](https://docs.aws.amazon.com/config/latest/developerguide/querying-AWS-resources.html)。

## 識別最常調用和最近調用的函數
<a name="runtimes-list-deprecated-statistics"></a>

如果您的 AWS 帳戶 包含使用由於已棄用之執行時間的函數，建議您優先更新經常調用的函數或最近調用的函數。

如果您只有幾個函數，您可以使用 CloudWatch Logs 主控台查看函數的日誌串流以收集此資訊。如需詳細資訊，請參閱[檢視傳送至 CloudWatch Logs 的日誌資料](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData)。

若要查看最近的函數調用次數，您也可以使用 Lambda 主控台中顯示的 CloudWatch 指標資訊。若要檢視此資訊，請執行下列步驟：

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選取您要查看調用統計資料的函數。

1. 選擇 **Monitor** (監控) 索引標籤。

1. 使用日期範圍選擇器設定您希望檢視統計資料的期間。最近調用會顯示在**調用**窗格中。

對於具有較多函數的帳戶，使用 [DescribeLogStreams](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeLogStreams.html) 和 [GetMetricStatistics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricStatistics.html) API 動作，以程式設計方式使用 AWS CLI 或其中一個 AWS SDKs 收集此資料會更有效率。

下列範例提供使用 V3 適用於 JavaScript 的 AWS SDK 和 的程式碼片段 適用於 Python (Boto3) 的 AWS SDK ，以識別特定函數的上次調用日期，並判斷過去 14 天內特定函數的調用次數。

------
#### [ Node.js ]

**Example 用於尋找函數上次調用時間的 JavaScript 程式碼**  

```
import { CloudWatchLogsClient, DescribeLogStreamsCommand } from "@aws-sdk/client-cloudwatch-logs";
const cloudWatchLogsClient = new CloudWatchLogsClient();
const command = new DescribeLogStreamsCommand({
    logGroupName: '<your_log_group_name>',
    orderBy: 'LastEventTime',
    descending: true,
    limit: 1
});
try {
    const response = await cloudWatchLogsClient.send(command);
    const lastEventTimestamp = response.logStreams.length > 0 ? 
        response.logStreams[0].lastEventTimestamp : null;
    // Convert the UNIX timestamp to a human-readable format for display
    const date = new Date(lastEventTimestamp).toLocaleDateString();
    const time = new Date(lastEventTimestamp).toLocaleTimeString();
    console.log(`${date} ${time}`);
    
} catch (e){
    console.error('Log group not found.')
}
```

------
#### [ Python ]

**Example 用於尋找函數上次調用時間的 Python 程式碼**  

```
import boto3
from datetime import datetime

cloudwatch_logs_client  = boto3.client('logs')

response = cloudwatch_logs_client.describe_log_streams(
    logGroupName='<your_log_group_name>',
    orderBy='LastEventTime',
    descending=True,
    limit=1
)

try:
    if len(response['logStreams']) > 0:
        last_event_timestamp = response['logStreams'][0]['lastEventTimestamp']
        print(datetime.fromtimestamp(last_event_timestamp/1000)) # Convert timestamp from ms to seconds
    else:
        last_event_timestamp = None
except:
    print('Log group not found')
```

------

**提示**  
您可以使用 [ListFunctions](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctions.html) API 作業來尋找函數的日誌群組名稱。如需如何執行此作業的範例，請參閱[列出使用特定執行時期的函數版本](#runtimes-list-deprecated-versions)。

------
#### [ Node.js ]

**Example 用於尋找過去 14 天內調用次數的 JavaScript 程式碼**  

```
import { CloudWatchClient, GetMetricStatisticsCommand } from "@aws-sdk/client-cloudwatch";
const cloudWatchClient = new CloudWatchClient();
const command = new GetMetricStatisticsCommand({
    Namespace: 'AWS/Lambda',
    MetricName: 'Invocations',
    StartTime: new Date(Date.now()-86400*1000*14), // 14 days ago
    EndTime: new Date(Date.now()),
    Period: 86400 * 14, // 14 days.
    Statistics: ['Sum'],
    Dimensions: [{
        Name: 'FunctionName',
        Value: '<your_function_name>'
    }]
});
const response = await cloudWatchClient.send(command);
const invokesInLast14Days = response.Datapoints.length > 0 ? 
    response.Datapoints[0].Sum : 0;

console.log('Number of invocations: ' + invokesInLast14Days);
```

------
#### [ Python ]

**Example 用於尋找過去 14 天內調用次數的 Python 程式碼**  

```
import boto3
from datetime import datetime, timedelta

cloudwatch_client = boto3.client('cloudwatch')

response = cloudwatch_client.get_metric_statistics(
    Namespace='AWS/Lambda',
    MetricName='Invocations',
    Dimensions=[
        {
            'Name': 'FunctionName',
            'Value': '<your_function_name>'
        },
    ],
    StartTime=datetime.now() - timedelta(days=14),
    EndTime=datetime.now(),
    Period=86400 * 14, # 14 days
    Statistics=[
        'Sum'
    ]
)

if len(response['Datapoints']) > 0:
    invokes_in_last_14_days = int(response['Datapoints'][0]['Sum'])
else:
    invokes_in_last_14_days = 0

print(f'Number of invocations: {invokes_in_last_14_days}')
```

------

# 修改執行階段環境
<a name="runtimes-modify"></a>

您可以使用[內部延伸項目](lambda-extensions.md)來修改執行階段程序。內部延伸項目不是單獨程序，它們會作為執行時程序的一部分執行。

Lambda 提供特定語言[環境變數](configuration-envvars.md)，您可以進行設定，以便將選項和工具新增至執行時間。Lambda 還提供[包裝函數指令碼](#runtime-wrapper)，它允許 Lambda 將執行時間啟動委派給您的指令碼。您可以建立包裝程式指令碼來自訂執行階段啟動行為。

## 特定語言的環境變數
<a name="runtimes-envvars"></a>

Lambda 支援僅限組態的方式，可透過下列特定語言的環境變數，在函數初始化期間預先載入程式碼：
+ `JAVA_TOOL_OPTIONS` - 在 Java 中，Lambda 支援此環境變數，以在 Lambda 中設定其他命令列變數。此環境變數可讓您指定工具的初始化，特別是在您使用 `agentlib` 或 `javaagent` 選項啟動原生或 Java 程式設計語言代理程式時。如需詳細資訊，請參閱 [`JAVA_TOOL_OPTIONS` 環境變數](https://docs.aws.amazon.com/lambda/latest/dg/java-customization.html#java-tool-options)。
+ `NODE_OPTIONS` - 可在 [Node.js 執行期](lambda-nodejs.md)中使用。
+ `DOTNET_STARTUP_HOOKS` - 在 .NET Core 3.1 及更高版本中，此環境變數指定了 Lambda 可以使用的組件 (dll) 的路徑。

使用特定語言的環境變數是設定啟動屬性的慣用方式。

## 包裝函式指令碼
<a name="runtime-wrapper"></a>

您可以建立*包裝函數指令碼*來自訂 Lambda 函數的執行時間啟動行為。包裝函式指令碼可讓您設定無法透過特定語言環境變數來設定的組態參數。

**注意**  
如果包裝函式指令碼未成功啟動執行階段程序，調用可能會失敗。

所有原生 [Lambda 執行期](lambda-runtimes.md)均支援包裝程式指令碼。[僅限作業系統的執行期](runtimes-provided.md) (`provided` 執行期系列) 不支援包裝程式指令碼。

當您為函數使用包裝函數指令碼時，Lambda 會使用您的指令碼啟動執行時間。Lambda 會向您的指令碼傳送解譯器的路徑，以及標準執行時間啟動的所有原始引數。您的指令碼可以延伸或轉換程式的啟動行為。例如，指令碼可以插入和更改引數、設定環境變數，或擷取指標、錯誤和其他診斷資訊。

您可以透過將 `AWS_LAMBDA_EXEC_WRAPPER` 環境變數的值設定為可執行二進位檔案或指令碼的檔案系統路徑來指定指令碼。

### 範例：建立包裝函數指令碼並用作 Lambda 層
<a name="runtime-wrapper-example"></a>

在下面的例子中，您建立一個包裝函式指令碼來啟動與 `-X importtime` 選項的 Python 解譯器。當您執行函數時，Lambda 會產生日誌項目，以顯示每個匯入的匯入持續時間。

**若要建立包裝函數指令碼並用作層**

1. 建立層的目錄：

   ```
   mkdir -p python-wrapper-layer/bin
   cd python-wrapper-layer/bin
   ```

1. 在 `bin` 目錄中，將下列程式碼貼到名為 `importtime_wrapper` 的新檔案中。這是包裝函數指令碼。

   ```
   #!/bin/bash
   
   # the path to the interpreter and all of the originally intended arguments
   args=("$@")
   
   # the extra options to pass to the interpreter
   extra_args=("-X" "importtime")
   
   # insert the extra options
   args=("${args[@]:0:$#-1}" "${extra_args[@]}" "${args[@]: -1}")
   
   # start the runtime with the extra options
   exec "${args[@]}"
   ```

1. 給予指令碼可執行的許可：

   ```
   chmod +x importtime_wrapper
   ```

1. 為層建立 .zip 檔案：

   ```
   cd ..
   zip -r ../python-wrapper-layer.zip .
   ```

1. 確認 .zip 檔案具有下列目錄結構：

   ```
   python-wrapper-layer.zip
   └ bin
       └ importtime_wrapper
   ```

1. 使用 .zip 套件[建立層](creating-deleting-layers.md#layers-create)。

1. 使用 Lambda 主控台建立函數。

   1. 開啟 [Lambda 主控台](https://console.aws.amazon.com/lambda)。

   1. 選擇 **Create function (建立函數)**。

   1. 在 **函數名稱** 中輸入文字。

   1. 針對**執行時期**，選擇**最新支援**的 Python 執行時期。

   1. 選擇 **Create function (建立函數)**。

1. 將圖層新增到您的函式中。

   1. 選擇您的函數，然後選擇**程式碼**索引標籤 (如果尚未選取)。

   1. 向下捲動至**層**區段，然後選擇**新增層**。

   1. 針對**層來源**，選取**自訂層**，然後從**自訂層**下拉式清單中選擇您的層。

   1.  對於**版本**，選擇 **1**。

   1. 選擇**新增**。

1. 新增包裝函數環境變數。

   1. 選擇**組態**索引標籤，然後選擇**環境變數**。

   1. 在 **Environment variables** (環境變數) 下，選擇 **Edit** (編輯)。

   1. 選擇 **Add environment variable** (新增環境變數)。

   1. 在 **Key** (索引鍵) 欄位，輸入 `AWS_LAMBDA_EXEC_WRAPPER`。

   1. 針對**值**，輸入 `/opt/bin/importtime_wrapper` (`/opt/` \$1 .zip 層的資料夾結構)。

   1. 選擇**儲存**。

1. 測試包裝函數指令碼。

   1. 選擇 **測試** 標籤。

   1. 在**測試事件**下，選擇**測試**。您不需要建立測試事件 - 預設事件會正常運作。

   1. 向下捲動至**日誌輸出**。因為您的包裝函式指令碼使用 `-X importtime` 選項啟動 Python 解譯器，所以日誌會顯示每次導入所需的時間。例如：

      ```
      532 |           collections
      import time:        63 |         63 |           _functools
      import time:      1053 |       3646 |         functools
      import time:      2163 |       7499 |       enum
      import time:       100 |        100 |         _sre
      import time:       446 |        446 |           re._constants
      import time:       691 |       1136 |         re._parser
      import time:       378 |        378 |         re._casefix
      import time:       670 |       2283 |       re._compiler
      import time:       416 |        416 |       copyreg
      ```

# 針對自訂執行時期使用 Lambda 執行時期 API
<a name="runtimes-api"></a>

AWS Lambda 為[自訂執行時間](runtimes-custom.md)提供 HTTP API，以從 Lambda 接收呼叫事件，並在 Lambda [執行環境中](lambda-runtimes.md)傳送回應資料。本節包含 Lambda 執行時期 API 的 API 參考。

**Lambda 受管執行個體支援並行請求**  
Lambda 受管執行個體使用與 Lambda （預設） 函數相同的執行時間 API。關鍵差異在於受管執行個體可以接受並行請求`/next`，並且`/response`請求達到設定的`AWS_LAMBDA_MAX_CONCURRENCY`限制。這可讓在單一執行環境中同時處理多個調用。如需受管執行個體的詳細資訊，請參閱 [了解 Lambda 受管執行個體執行環境](lambda-managed-instances-execution-environment.md)。

![\[執行環境的架構圖表。\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/telemetry-api-concept-diagram.png)


執行時間 API 版本 **2018-06-01** 的 OpenAPI 規格可從 [runtime-api.zip](samples/runtime-api.zip) 中獲得

若要建立 API 請求 URL，執行時間會從 `AWS_LAMBDA_RUNTIME_API` 環境變數中取得 API 端點，新增 API 版本，以及新增所需的資源路徑。

**Example 請求**  

```
curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next"
```

**Topics**
+ [

## 下次調用
](#runtimes-api-next)
+ [

## 調用回應
](#runtimes-api-response)
+ [

## 初始化錯誤
](#runtimes-api-initerror)
+ [

## 調用錯誤
](#runtimes-api-invokeerror)

## 下次調用
<a name="runtimes-api-next"></a>

**路徑** – `/runtime/invocation/next`

**方法** – **GET**

執行時間會傳送此訊息至 Lambda 來請求調用事件。回應內文包含該次調用的承載，此 JSON 文件含有取自函式觸發條件的事件資料。回應標頭包含有關該次調用的額外資料。

**回應標頭**
+ `Lambda-Runtime-Aws-Request-Id` - 請求 ID，它將識別觸發函數調用的請求。

  例如 `8476a536-e9f4-11e8-9739-2dfe598c3fcd`。
+ `Lambda-Runtime-Deadline-Ms` - 函數逾時的日期，以 Unix 時間毫秒為單位。

  例如 `1542409706888`。
+ `Lambda-Runtime-Invoked-Function-Arn` - 在調用中指定的 Lambda 函數、版本或別名的 ARN。

  例如 `arn:aws:lambda:us-east-2:123456789012:function:custom-runtime`。
+ `Lambda-Runtime-Trace-Id` - [AWS X-Ray 追蹤標頭](https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader)。

  例如 `Root=1-5bef4de7-ad49b0e87f6ef6c87fc2e700;Parent=9a9197af755a6419;Sampled=1`。
+ `Lambda-Runtime-Client-Context` – 對於來自 AWS Mobile SDK 的調用，則為用戶端應用程式和裝置的資料。
+ `Lambda-Runtime-Cognito-Identity` – 對於來自 AWS Mobile SDK 的調用，是有關 Amazon Cognito 身分提供者的資料。

請勿在 `GET` 請求上設定逾時，因為回應可能會延遲。在 Lambda 引導執行時間與執行時間有可傳回的事件之間，執行時間處理可能會凍結幾秒鐘。

請求 ID 將追蹤 Lambda 內的調用。您可以在傳送回應時使用此值指定調用。

追蹤標頭包含追蹤 ID、父系 ID 和抽樣決策。如果對請求進行抽樣，請求將由 Lambda 或上游服務進行抽樣。執行時間應設定 `_X_AMZN_TRACE_ID` 為標頭的值。X-Ray 開發套件將讀取此項以取得 ID 並決定是否要追蹤請求。

## 調用回應
<a name="runtimes-api-response"></a>

**路徑** – `/runtime/invocation/AwsRequestId/response`

**方法** – **POST**

在函數執行到完成之後，執行時間會傳送調用回應至 Lambda。若為同步調用，Lambda 會將回應傳送給用戶端。

**Example 成功請求**  

```
REQUEST_ID=156cb537-e2d4-11e8-9b34-d36013741fb9
curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "SUCCESS"
```

## 初始化錯誤
<a name="runtimes-api-initerror"></a>

如果函數傳回錯誤或執行時間在初始化期間遇到錯誤，執行時間會使用此方法將錯誤報告給 Lambda。

**路徑** – `/runtime/init/error`

**方法** – **POST**

**標頭**

`Lambda-Runtime-Function-Error-Type` - 執行時間遇到的錯誤類型。必要：否。

此標頭包含一個字串值。Lambda 可接受任何字串，但我們建議使用格式 <category.reason>。例如：
+ Runtime.NoSuchHandler
+ Runtime.APIKeyNotFound
+ Runtime.ConfigInvalid
+ Runtime.UnknownReason

**主體參數**

`ErrorRequest` - 關於錯誤的資訊。必要：否。

此欄位是具有下列結構的 JSON 物件：

```
{
      errorMessage: string (text description of the error),
      errorType: string,
      stackTrace: array of strings
}
```

請注意，Lambda 接受 `errorType` 的任何值。

下列範例顯示 Lambda 函數錯誤訊息，其中函數無法剖析調用中提供的事件資料。

**Example 函數錯誤**  

```
{
      "errorMessage" : "Error parsing event data.",
      "errorType" : "InvalidEventDataException",
      "stackTrace": [ ]
}
```

**回應內文參數**
+ `StatusResponse` – 字串. 狀態信息，隨 202 回應代碼一起傳送。
+ `ErrorResponse` - 其他錯誤資訊，與錯誤回應代碼一起傳送。ErrorResponse 包含錯誤類型和錯誤訊息。

**回應代碼**
+ 202 - 已接受
+ 403 - 禁止
+ 500 - 容器錯誤。不可復原的狀態。執行時間應立即退出。

**Example 初始化錯誤請求**  

```
ERROR="{\"errorMessage\" : \"Failed to load function.\", \"errorType\" : \"InvalidFunctionException\"}"
curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/init/error" -d "$ERROR" --header "Lambda-Runtime-Function-Error-Type: Unhandled"
```

## 調用錯誤
<a name="runtimes-api-invokeerror"></a>

如果函數傳回錯誤或執行時間遇到錯誤，執行時間會使用此方法將錯誤報告給 Lambda。

**路徑** – `/runtime/invocation/AwsRequestId/error`

**方法** – **POST**

**標頭**

`Lambda-Runtime-Function-Error-Type` - 執行時間遇到的錯誤類型。必要：否。

此標頭包含一個字串值。Lambda 可接受任何字串，但我們建議使用格式 <category.reason>。例如：
+ Runtime.NoSuchHandler
+ Runtime.APIKeyNotFound
+ Runtime.ConfigInvalid
+ Runtime.UnknownReason

**主體參數**

`ErrorRequest` - 關於錯誤的資訊。必要：否。

此欄位是具有下列結構的 JSON 物件：

```
{
      errorMessage: string (text description of the error),
      errorType: string,
      stackTrace: array of strings
}
```

請注意，Lambda 接受 `errorType` 的任何值。

下列範例顯示 Lambda 函數錯誤訊息，其中函數無法剖析調用中提供的事件資料。

**Example 函數錯誤**  

```
{
      "errorMessage" : "Error parsing event data.",
      "errorType" : "InvalidEventDataException",
      "stackTrace": [ ]
}
```

**回應內文參數**
+ `StatusResponse` – 字串. 狀態信息，隨 202 回應代碼一起傳送。
+ `ErrorResponse` - 其他錯誤資訊，與錯誤回應代碼一起傳送。ErrorResponse 包含錯誤類型和錯誤訊息。

**回應代碼**
+ 202 - 已接受
+ 400 - 錯誤請求
+ 403 - 禁止
+ 500 - 容器錯誤。不可復原的狀態。執行時間應立即退出。

**Example 錯誤請求**  

```
REQUEST_ID=156cb537-e2d4-11e8-9b34-d36013741fb9
ERROR="{\"errorMessage\" : \"Error parsing event data.\", \"errorType\" : \"InvalidEventDataException\"}"
curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/error" -d "$ERROR" --header "Lambda-Runtime-Function-Error-Type: Unhandled"
```

# 何時使用 Lambda 的僅限作業系統執行時期
<a name="runtimes-provided"></a>

Lambda 為 Java、Python、Node.js、.NET 和 Ruby 提供[受管理執行期](lambda-runtimes.md)。若要使用未提供受管理執行期的程式設計語言建立 Lambda 函數，請使用僅限作業系統的執行期 (`provided` 執行期系列)。僅限作業系統的執行期有三種主要的使用案例：
+ **原生ahead-of-time (AOT) 編譯**：Go、Rust、Swift 和 C\$1\$1 等語言會以原生方式編譯至可執行的二進位檔，不需要專用語言執行時間。這些語言僅需要可在其中執行編譯二進位檔的作業系統環境。您也可以使用僅限 Lambda 作業系統的執行時間來部署以 .NET Native AOT 和 Java GraalVM Native Image 編譯的二進位檔。

  您必須在二進位中包含執行期介面用戶端。執行期介面用戶端會呼叫 [針對自訂執行時期使用 Lambda 執行時期 API](runtimes-api.md) 來擷取函數調用，然後呼叫您的函數處理常式。Lambda 為 [Rust](lambda-rust.md)、[Go](golang-package.md#golang-package-mac-linux)、[.NET Native AOT](dotnet-native-aot.md)、[Swift](https://github.com/awslabs/swift-aws-lambda-runtime) （實驗性） 和 [C\$1\$1](https://github.com/awslabs/aws-lambda-cpp) （實驗性） 提供執行期介面用戶端。

  您必須將二進位檔編譯為適用於 Linux 環境，以及您計劃用於函數的同一指令集架構 (x86\$164 或 arm64)。
+ **第三方執行時間**：您可以使用off-the-shelf執行時間執行 Lambda 函數，例如適用於 PHP 的 [Bref](https://bref.sh/docs/news/01-bref-1.0.html#amazon-linux-2)。
+ **自訂執行期**：您可以為 Lambda 不提供受管理執行期的語言或語言版本建置自己的執行期，例如 Node.js 19。如需詳細資訊，請參閱[建置 的自訂執行時間 AWS Lambda](runtimes-custom.md)。這是僅限作業系統的執行期最不常見的使用案例。

Lambda 支援以下僅限作業系統的執行期：


| Name | 識別符 | 作業系統 | 取代日期 | 封鎖函數建立 | 封鎖函數更新 | 
| --- | --- | --- | --- | --- | --- | 
|  僅限作業系統的執行期  |  `provided.al2023`  |  Amazon Linux 2023  |   2029 年 6 月 30 日   |   2029 年 7 月 31 日   |   2029 年 8 月 31 日   | 
|  僅限作業系統的執行期  |  `provided.al2`  |  Amazon Linux 2  |   2026 年 7 月 31 日   |   2026 年 8 月 31 日   |   2026 年 9 月 30 日   | 

與 Amazon Linux 2 相比，Amazon Linux 2023 (`provided.al2023`) 執行期具有多項優點，包括更小的部署足跡和更新版本的程式庫，如 `glibc`。

`provided.al2023` 執行期使用 `dnf` 而非 `yum` 做為套件管理工具，後者是 Amazon Linux 2 中的預設套件管理工具。如需 `provided.al2023`和 之間差異的詳細資訊`provided.al2`，請參閱 AWS 運算部落格上的 [的 Amazon Linux 2023 執行時間簡介 AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)。

# 建置 的自訂執行時間 AWS Lambda
<a name="runtimes-custom"></a>

您可以使用任何程式設計語言實作 AWS Lambda 執行時間。執行時間是一款程式，它會在調用 Lambda 函數時執行該函數的處理常式方法。您可將執行期納入函數的部署套件或是在[層](chapter-layers.md)中分發。建立 Lambda 函數時，選擇[僅限作業系統的執行期](runtimes-provided.md) (`provided` 執行期系列)。

**注意**  
建立自訂執行期是一種進階使用案例。如果您想要了解有關編譯成本機二進位檔或使用第三方現成執行期的資訊，請參閱 [何時使用 Lambda 的僅限作業系統執行時期](runtimes-provided.md)。

如需了解自訂執行期部署過程的演練，請參閱 [教學課程：建置自訂執行期](runtimes-walkthrough.md)。

**Topics**
+ [

## 要求
](#runtimes-custom-build)
+ [

## 在自訂執行階段中實作回應串流
](#runtimes-custom-response-streaming)
+ [

## 為 Lambda 受管執行個體建置自訂執行期
](#runtimes-custom-managed-instances)

## 要求
<a name="runtimes-custom-build"></a>

自訂執行期時必須完成特定初始化和處理任務。執行期會執行函數的設定程式碼、從環境變數中讀取處理常式名稱，並從 Lambda 執行期 API 中讀取叫用事件。執行時間會將事件資料傳遞至函數處理常式，並將處理常式的回應發佈回 Lambda。

### 初始化任務
<a name="runtimes-custom-initialization"></a>

初始化任務是按照[函式的每一執行個體](lambda-runtime-environment.md)各執行一次，以備妥用於處理調用的環境。
+ **擷取設定** - 讀取環境變數以取得關於函數和環境的詳細資訊。
  + `_HANDLER` - 處理常式所在位置，取自函數的組態。標準格式為 `file.method`，其中 `file` 是不含副檔名的檔案名稱，而 `method` 則是定義於該檔案內的方法或函式的名稱。
  + `LAMBDA_TASK_ROOT` - 包含函數程式碼的目錄。
  + `AWS_LAMBDA_RUNTIME_API` - 執行時間 API 的主機和連接埠。

  如需可用變數的完整清單，請參閱 [定義執行時間環境變數](configuration-envvars.md#configuration-envvars-runtime)。
+ **初始化函數** - 載入處理常式檔案並執行其所包含的任何全域或靜態程式碼。函式應只建立一次靜態資源 (如開發套件用戶端和資料庫連線)，以供多次調用時重複使用。
+ **處理錯誤** - 如果發生錯誤，則呼叫[初始化錯誤](runtimes-api.md#runtimes-api-initerror) API 並立即退出。

初始化會計入計費執行時間和逾時。當執行觸發新函數執行個體的初始化時，您可以在記錄和 [AWS X-Ray 追蹤](services-xray.md)中查看初始化時間。

**Example log**  

```
REPORT RequestId: f8ac1208... Init Duration: 48.26 ms   Duration: 237.17 ms   Billed Duration: 300 ms   Memory Size: 128 MB   Max Memory Used: 26 MB
```

### 處理任務
<a name="runtimes-custom-processing"></a>

經執行後，執行時間會使用 [Lambda 執行時間介面](runtimes-api.md)來管理傳入的事件並報告錯誤。初始化任務完成後，執行時間將以迴圈處理傳入的事件。在您的執行時間程式碼中，依序執行下列步驟。
+ **取得事件** - 呼叫[下次調用](runtimes-api.md#runtimes-api-next) API 以取得下一個事件。回應內文包含事件資料。回應標頭包含請求 ID 及其他資訊。
+ **傳播追蹤標頭** - 從 API 回應中的 `Lambda-Runtime-Trace-Id` 標頭取得 X-Ray 追蹤標頭。使用相同的值在本機設定 `_X_AMZN_TRACE_ID` 環境變數。X-Ray 開發套件使用這個值來連接服務之間的追蹤資料。
+ **建立內容物件** - 建立含有內容資訊的物件，其資訊取自 API 回應中的環境變數和各標頭。
+ **調用函數處理常式** - 將事件與內容物件傳遞至處理常式。
+ **處理回應** - 呼叫[調用回應](runtimes-api.md#runtimes-api-response) API 以發佈處理常式的回應。
+ **處理錯誤** - 如果發生錯誤，則呼叫[調用錯誤](runtimes-api.md#runtimes-api-invokeerror) API。
+ **清理** - 釋放未使用的資源、傳送資料至其他服務，或是執行額外的任務後再取得下一個事件。

### 進入點
<a name="runtimes-custom-bootstrap"></a>

自訂執行時間的進入點是名為 `bootstrap` 的可執行檔。引導檔案可做為執行時間，也可以調用另一個建立執行時間的檔案。如果部署套件的根目錄不包含名為 `bootstrap` 的檔案，Lambda 會在函數的層中尋找該檔案。若 `bootstrap` 檔案不存在或不是可執行檔，函數會在調用時傳回 `Runtime.InvalidEntrypoint` 錯誤。

以下範例 `bootstrap` 檔案使用隨附的 Node.js 版本，在單獨的檔案 `runtime.js` 中執行 JavaScript 執行期。

**Example 引導**  

```
#!/bin/sh
    cd $LAMBDA_TASK_ROOT
    ./node-v11.1.0-linux-x64/bin/node runtime.js
```

## 在自訂執行階段中實作回應串流
<a name="runtimes-custom-response-streaming"></a>

針對[回應串流函數](configuration-response-streaming.md)，`response` 和 `error` 端點稍微修改了行為，允許執行期將部分回應串流至用戶端，並以區塊形式傳回承載。如需特定行為的詳細資訊，請參閱以下內容：
+ `/runtime/invocation/AwsRequestId/response` - 傳播執行期的 `Content-Type` 標頭以傳送至用戶端。Lambda 透過 HTTP/1.1 區塊傳輸編碼，以區塊為單位傳回回應承載。若要將回應串流至 Lambda，執行期必須：
  + 將`Lambda-Runtime-Function-Response-Mode` HTTP 標頭設為 `streaming`。
  + 將`Transfer-Encoding` 標頭設為 `chunked`。
  + 編寫符合 HTTP/1.1 區塊傳輸編碼規範的回應。
  + 成功編寫回應後會關閉基礎連線。
+ `/runtime/invocation/AwsRequestId/error` - 執行期可以使用此端點向 Lambda 報告函數或執行期錯誤，Lambda 也接受 `Transfer-Encoding` 標頭。只能在執行階段開始傳送叫用回應之前呼叫此端點。
+ 在 `/runtime/invocation/AwsRequestId/response` 中使用錯誤尾端報告串流中間錯誤 - 若要報告在執行期開始編寫叫用回應後出現的錯誤，執行期可選擇連接名為 `Lambda-Runtime-Function-Error-Type` 和 `Lambda-Runtime-Function-Error-Body` 的 HTTP 尾端標頭。Lambda 會將此視為成功回應，並將執行期提供的錯誤中繼資料轉送給用戶端。
**注意**  
若要附加尾端標頭，執行階段必須在 HTTP 要求的開頭設定標頭值 `Trailer`。這是 HTTP/1.1 區塊傳輸編碼規範的要求。
  + `Lambda-Runtime-Function-Error-Type` - 執行期遇到的錯誤類型。此標頭包含一個字串值。Lambda 可接受任何字串，但我們建議使用格式 *<category.reason>*。例如 `Runtime.APIKeyNotFound`。
  + `Lambda-Runtime-Function-Error-Body` - 有關錯誤的 Base64 編碼資訊。

## 為 Lambda 受管執行個體建置自訂執行期
<a name="runtimes-custom-managed-instances"></a>

Lambda 受管執行個體使用與 Lambda （預設） 函數相同的執行時間 API。不過，實作自訂執行時間以支援受管執行個體並行執行模型的方式有重大差異。

### 並行請求處理
<a name="runtimes-custom-managed-instances-concurrency"></a>

為受管執行個體建立自訂執行期的主要差異是支援並行調用。與執行時間一次處理一個調用的 Lambda （預設） 函數不同，受管執行個體可以在單一執行環境中同時處理多個調用。

您的自訂執行時間必須：
+ **支援並行`/next`請求** – 執行時間可以對[下一個調用](runtimes-api.md#runtimes-api-next) API 進行多個同時呼叫，直到`AWS_LAMBDA_MAX_CONCURRENCY`環境變數指定的限制為止。
+ **處理並行`/response`請求** – 多個調用可以同時呼叫[調用回應](runtimes-api.md#runtimes-api-response) API。
+ **實作執行緒安全請求處理** – 透過正確管理共用資源和狀態，確保並行調用不會互相干擾。
+ **使用唯一的請求 IDs** – 使用 `Lambda-Runtime-Aws-Request-Id`標頭分別追蹤每個叫用，以比對回應與其對應的請求。

### 實作模式
<a name="runtimes-custom-managed-instances-implementation"></a>

受管執行個體執行時間的典型實作模式包括建立工作者執行緒或程序來處理並行調用：

1. **讀取並行限制** – 在初始化時，讀取`AWS_LAMBDA_MAX_CONCURRENCY`環境變數以判斷要支援的並行調用數量。

1. **建立工作者集**區 – 初始化等於並行限制的工作者集區 （執行緒、程序或非同步任務）。

1. **工作者處理迴圈** – 每個工作者獨立：
   + 呼叫 `/runtime/invocation/next` 以取得呼叫事件
   + 使用事件資料調用函數處理常式
   + 將回應發佈至 `/runtime/invocation/AwsRequestId/response`
   + 重複迴圈

### 其他考量
<a name="runtimes-custom-managed-instances-considerations"></a>
+ **記錄格式** – 受管執行個體僅支援 JSON 日誌格式。確保您的執行時間遵守`AWS_LAMBDA_LOG_FORMAT`環境變數，且僅使用 JSON 格式。如需詳細資訊，請參閱[設定 JSON 和純文字日誌格式](monitoring-cloudwatchlogs-logformat.md)。
+ **共用資源** – 使用具有並行調用的 `/tmp`目錄等共用資源時請小心。實作適當的鎖定機制，以防止競爭條件。

如需 Lambda 受管執行個體執行環境的詳細資訊，請參閱 [了解 Lambda 受管執行個體執行環境](lambda-managed-instances-execution-environment.md)。

# 教學課程：建置自訂執行期
<a name="runtimes-walkthrough"></a>

在本教學課程中，您將建立具有自訂執行時間的 Lambda 函數。首先，您要將執行時間納入函式的部署套件中。接著再將其遷移到與函式分開而單獨管理的 Layer。最後，您要透過更新該執行時間 Layer 以資源為基礎的許可政策，將其與世界各地的人共享。

## 必要條件
<a name="runtimes-walkthrough-prereqs"></a>

此教學課程假設您具備基本的 Lambda 操作知識並了解 Lambda 主控台。若您尚未了解，請遵循 [使用主控台建立一個 Lambda 函數](getting-started.md#getting-started-create-function) 中的指示，建立您的第一個 Lambda 函數。

若要完成下列步驟，您需要 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。命令和預期的輸出會列在不同的區塊中：

```
aws --version
```

您應該會看到下列輸出：

```
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
```

對於長命令，逸出字元 (`\`) 用於將命令分割為多行。

在 Linux 和 macOS 上，使用您偏好的 shell 和套件軟體管理工具。

**注意**  
在 Windows 中，作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 `zip`)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本，請[安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)。本指南中的 CLI 命令範例使用 Linux 格式。如果您使用的是 Windows CLI，必須重新格式化包含內嵌 JSON 文件的命令。

您需要 IAM 角色來建立 Lambda 函數。該角色需要許可，才能將日誌傳送至 CloudWatch Logs，並存取您的函數使用的 AWS 服務。如果您還沒有函數開發角色，請立即建立一個。

**若要建立執行角色**

1. 在 IAM 主控台中開啟[角色頁面](https://console.aws.amazon.com/iam/home#/roles)。

1. 選擇建**立角色**。

1. 建立具備下列屬性的角色。
   + **信任實體** - **Lambda**。
   + **許可** - **AWSLambdaBasicExecutionRole**。
   + **角色名稱** - **lambda-role**。

   **AWSLambdaBasicExecutionRole** 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。

## 建立函數
<a name="runtimes-walkthrough-function"></a>

建立具有自訂執行時間的 Lambda 函數。本範例包括兩個檔案：執行期 `bootstrap` 檔案以及函數處理常式。兩個檔案都是以 Bash 實作。

1. 建立專案的目錄，然後切換至該目錄。

   ```
   mkdir runtime-tutorial
   cd runtime-tutorial
   ```

1. 建立稱為 `bootstrap` 的新檔案。這是自訂執行期。  
**Example 引導**  

   ```
   #!/bin/sh
   
   set -euo pipefail
   
   # Initialization - load function handler
   source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
   
   # Processing
   while true
   do
     HEADERS="$(mktemp)"
     # Get an event. The HTTP request will block until one is received
     EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
   
     # Extract request ID by scraping response headers received above
     REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
   
     # Run the handler function from the script
     RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")
   
     # Send the response
     curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "$RESPONSE"
   done
   ```

   執行時間將從部署套件載入函式指令碼。其使用了兩個變數以找出指令碼。`LAMBDA_TASK_ROOT` 將告知套件解壓縮的位置，而 `_HANDLER` 則包含指令碼的名稱。

   在執行期載入函數指令碼之後，它將使用執行期 API 從 Lambda 中擷取調用事件、傳遞事件至處理常式，並將回應發布回 Lambda。為了取得請求 ID，執行時間將 API 回應中的各標頭儲存至暫時檔案，然後從該檔案讀取 `Lambda-Runtime-Aws-Request-Id` 標頭。
**注意**  
執行時間另還負責其他任務，包括錯誤處理以及向處理常式提供內容資訊。如需詳細資訊，請參閱 [要求](runtimes-custom.md#runtimes-custom-build)。

1. 為函數建立指令碼。以下範例指令碼定義了一個接受事件資料的處理常式函數，會將該資料記錄到 `stderr` 並予以傳回。  
**Example function.sh**  

   ```
   function handler () {
     EVENT_DATA=$1
     echo "$EVENT_DATA" 1>&2;
     RESPONSE="Echoing request: '$EVENT_DATA'"
   
     echo $RESPONSE
   }
   ```

   `runtime-tutorial` 目錄現在應該看起來像這樣：

   ```
   runtime-tutorial
   ├ bootstrap
   └ function.sh
   ```

1. 將檔案轉成可執行檔並加入至 .zip 封存檔。這是部署套件。

   ```
   chmod 755 function.sh bootstrap
   zip function.zip function.sh bootstrap
   ```

1. 建立名為的函數 `bash-runtime`。對於 `--role`，輸入 Lambda [執行角色](lambda-intro-execution-role.md)的 ARN。

   ```
   aws lambda create-function --function-name bash-runtime \
   --zip-file fileb://function.zip --handler function.handler --runtime provided.al2023 \
   --role arn:aws:iam::123456789012:role/lambda-role
   ```

1. 調用函數。

   ```
   aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
   ```

   如果您使用 AWS CLI 第 2 版，則需要 **cli-binary-format** 選項。若要讓此成為預設的設定，請執行 `aws configure set cli-binary-format raw-in-base64-out`。若要取得更多資訊，請參閱*《AWS Command Line Interface 使用者指南第 2 版》*中 [AWS CLI 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

   您應該看到如下回應：

   ```
   {
       "StatusCode": 200,
       "ExecutedVersion": "$LATEST"
   }
   ```

1. 確認回應。

   ```
   cat response.txt
   ```

   您應該看到如下回應：

   ```
   Echoing request: '{"text":"Hello"}'
   ```

## 建立 Layer
<a name="runtimes-walkthrough-layer"></a>

為了將執行時間程式碼與函式程式碼分開，您要建立一個僅包含執行時間的 Layer。Layer 讓您能夠單獨開發函式的依存項目，且若搭配多個函式使用同一 Layer 還可減少儲存空間用量。如需更多詳細資訊，請參閱 [使用層管理 Lambda 相依項](chapter-layers.md)。

1. 建立包含 `bootstrap` 檔案的 .zip 檔案。

   ```
   zip runtime.zip bootstrap
   ```

1. 使用 [publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html?highlight=nodejs16%20x) 命令來建立 layer。

   ```
   aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
   ```

   如此即建立了 Layer 的第一個版本。

## 更新函數
<a name="runtimes-walkthrough-update"></a>

若要搭配函式使用執行期 Layer，請將函式設定成使用 Layer，並且移除函式中的執行期程式碼。

1. 更新函式組態以提取 Layer。

   ```
   aws lambda update-function-configuration --function-name bash-runtime \
   --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:1
   ```

   這會將執行時間新增至 `/opt` 目錄中的函數。若要確保 Lambda 使用層中的執行期，您必須將 `boostrap` 從函數的部署套件中移除，如接下來兩個步驟所示。

1. 建立包含函數程式碼的 .zip 檔案。

   ```
   zip function-only.zip function.sh
   ```

1. 更新函式程式碼，使之僅包含處理常式指令碼。

   ```
   aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
   ```

1. 調用函數以確認其是否可搭配執行期 layer 運作。

   ```
   aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
   ```

   如果您使用 AWS CLI 第 2 版，則需要 **cli-binary-format** 選項。若要讓此成為預設的設定，請執行 `aws configure set cli-binary-format raw-in-base64-out`。若要取得更多資訊，請參閱*《AWS Command Line Interface 使用者指南第 2 版》*中 [AWS CLI 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

   您應該看到如下回應：

   ```
   {
       "StatusCode": 200,
       "ExecutedVersion": "$LATEST"
   }
   ```

1. 確認回應。

   ```
   cat response.txt
   ```

   您應該看到如下回應：

   ```
   Echoing request: '{"text":"Hello"}'
   ```

## 更新執行時間
<a name="runtimes-walkthrough-runtime"></a>

1. 若要記錄執行環境的相關資訊，請更新執行時間指令碼使其輸出環境變數。  
**Example 引導**  

   ```
   #!/bin/sh
   
   set -euo pipefail
   
   # Configure runtime to output environment variables
   echo "##  Environment variables:"
   env
   
   # Load function handler
   source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
   
   # Processing
   while true
   do
     HEADERS="$(mktemp)"
     # Get an event. The HTTP request will block until one is received
     EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
   
     # Extract request ID by scraping response headers received above
     REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
   
     # Run the handler function from the script
     RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")
   
     # Send the response
     curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "$RESPONSE"
   done
   ```

1. 建立包含新版本 `bootstrap` 檔案的 .zip 檔案。

   ```
   zip runtime.zip bootstrap
   ```

1. 建立 `bash-runtime` 層的新版本。

   ```
   aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
   ```

1. 設定函式以使用新版本的 Layer。

   ```
   aws lambda update-function-configuration --function-name bash-runtime \
   --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2
   ```

## 共享 Layer
<a name="runtimes-walkthrough-share"></a>

若要與其他 AWS 帳戶共用層，請將跨帳戶許可陳述式新增至層的[資源型政策](access-control-resource-based.md)。執行 [add-layer-version-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-layer-version-permission.html) 命令，並將帳戶 ID 指定為 `principal`。在各陳述式中，您可將許可授予單一帳戶、所有帳戶或 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 中的某個組織。

以下列範例會授予帳戶 111122223333 存取 `bash-runtime` layer 第 2 版的許可。

```
aws lambda add-layer-version-permission \
  --layer-name bash-runtime \
  --version-number 2 \  
  --statement-id xaccount \
  --action lambda:GetLayerVersion \
  --principal 111122223333 \
  --output text
```

您應該會看到類似下列的輸出：

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
```

許可僅適用於單一層版本。每次建立新的層版本時均需重複此程序。

## 清除
<a name="runtimes-walkthrough-cleanup"></a>

刪除各個版本的 Layer。

```
aws lambda delete-layer-version --layer-name bash-runtime --version-number 1
aws lambda delete-layer-version --layer-name bash-runtime --version-number 2
```

由於函數持有對該層的第 2 版的參考，所以它仍存在於 Lambda 中。本函式將繼續運作，但無法再設定各函式使用已刪除的版本。若您修改了函數的 layer 清單，則必須指定新的版本或略去已刪除的 layer。

使用 [delete-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-function.html) 命令刪除函數。

```
aws lambda delete-function --function-name bash-runtime
```

# 開放原始碼儲存庫
<a name="runtimes-open-source"></a>

AWS Lambda 提供各種開放原始碼工具、程式庫和元件，協助您建置、自訂和最佳化無伺服器應用程式。這些資源包括執行時間界面用戶端、事件程式庫、容器基礎映像、開發工具和範例專案，這些專案由 GitHub 維護 AWS 和提供。透過利用這些開放原始碼儲存庫，您可以擴展 Lambda 的功能、建立自訂執行時間、處理來自各種 AWS 服務的事件，以及深入了解函數的效能。本頁概要介紹支援 Lambda 開發的關鍵開放原始碼專案。

## 執行時期介面用戶端
<a name="open-source-ric"></a>

Lambda 執行時期介面用戶端 (RIC) 是開放原始碼程式庫，可實作[執行時期 API](runtimes-api.md) 並管理函式程式碼與 Lambda 服務之間的互動。這些用戶端負責接收調用事件、傳遞內容資訊以及報告錯誤。

Lambda 受管執行時期和容器基礎映像所使用的執行時期介面用戶端，會以開放原始碼形式發布。在建置自訂執行時期或擴展現有的執行時期時，可使用這些開放原始碼程式庫來簡化實作。下列開放原始碼 GitHub 儲存庫包含 Lambda RIC 的原始程式碼：
+ [Node.js Runtime Interface Client](https://github.com/aws/aws-lambda-nodejs-runtime-interface-client)
+ [Python Runtime Interface Client](https://github.com/aws/aws-lambda-python-runtime-interface-client)
+ [Java Runtime Interface Client](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-runtime-interface-client)
+ [Ruby Runtime Interface Client](https://github.com/aws/aws-lambda-ruby-runtime-interface-client)
+ [.NET Runtime Interface Client](https://github.com/aws/aws-lambda-dotnet)
+ [Rust 執行期界面用戶端](https://github.com/aws/aws-lambda-rust-runtime)
+ [Go Runtime Interface Client](https://github.com/aws/aws-lambda-go)
+ [Swift 執行期界面用戶端](https://github.com/awslabs/swift-aws-lambda-runtime) （實驗性）
+ [C\$1\$1 執行期界面用戶端](https://github.com/awslabs/aws-lambda-cpp) （實驗性）
+ [Lambda Base Images](https://github.com/aws/aws-lambda-base-images)

如需有關使用這些用戶端建置自訂執行時期的詳細資訊，請參閱[建置 的自訂執行時間 AWS Lambda](runtimes-custom.md)。

## 事件程式庫
<a name="open-source-event-libraries"></a>

Lambda 事件程式庫提供類型定義和協助程式公用程式，用於處理來自各種 AWS 服務的事件。這些程式庫能協助您以類型安全的方式剖析與處理事件資料，讓您更輕鬆地處理來自 Amazon S3、Amazon DynamoDB 及 Amazon API Gateway 等服務的事件。

對於編譯的語言， AWS 提供下列事件程式庫：
+ [Java Event Library](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)
+ [.NET Event Libraries](https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src)
+ [Go Event Library](https://github.com/aws/aws-lambda-go/tree/main/events)
+ [Rust Event Library](https://github.com/awslabs/aws-lambda-rust-runtime)

對於 Node.js、Python 和 Ruby 等直譯式語言，事件可以直接剖析為 JSON 物件，無需額外的獨立程式庫。不過，使用 Node.js 和 Python 的開發人員可以利用 的 powertools AWS Lambda，為提供類型提示、資料驗證和功能 AWS 的事件提供內建結構描述，類似於編譯語言程式庫提供的功能。
+ [Powertools for TypeScript](https://docs.powertools.aws.dev/lambda/typescript/latest/features/parser/#built-in-schemas)
+ [Powertools for Python](https://docs.powertools.aws.dev/lambda/python/latest/utilities/parser/#built-in-models)

## 容器基礎映像
<a name="open-source-container-base-images"></a>

AWS 提供開放原始碼容器基礎映像，您可以用來做為建置 Lambda 函數容器映像的起點。這些基礎映像包括執行時期介面用戶端，以及在 Lambda 執行環境中執行函式所需的其他元件。

如需有關可用基礎映像及其使用方式的詳細資訊，請參閱 [AWS Lambda Base Images](https://github.com/aws/aws-lambda-base-images) 儲存庫和[使用容器映像建立 Lambda 函數](images-create.md)。

## 開發工具
<a name="open-source-development-tools"></a>

AWS 提供額外的開放原始碼開發工具，協助您建置和最佳化 Lambda 函數：

### 的 Powertools AWS Lambda
<a name="open-source-powertools"></a>

的 Powertools AWS Lambda 使用基本公用程式簡化無伺服器開發，以防止重複處理，以及多記錄處理和 Kafka 消費者程式庫的批次處理。這些功能可協助您將程式碼複雜度與營運負擔降至最低。

您也可以利用內建事件結構描述驗證、結構化記錄和追蹤，以及參數存放區整合，這些整合旨在加速建立生產就緒的 Lambda 函數，同時遵循架構 AWS 良好的最佳實務。

GitHub 儲存庫：
+ [Python](https://github.com/aws-powertools/powertools-lambda-python)
+ [TypeScript](https://github.com/aws-powertools/powertools-lambda-typescript)
+ [Java](https://github.com/aws-powertools/powertools-lambda-java)
+ [.NET](https://github.com/aws-powertools/powertools-lambda-dotnet)

### Java 開發工具
<a name="open-source-java-tools"></a>
+ [Java Profiler (實驗階段)](https://github.com/aws/aws-lambda-java-libs/tree/main/experimental/aws-lambda-java-profiler)：用於分析 Java Lambda 函式的工具。
+ [Java 程式庫](https://github.com/aws/aws-lambda-java-libs)：此儲存庫彙整了用於 Lambda 開發的完整 Java 程式庫與工具集合，包含 JUnit 測試實用工具、效能分析工具等核心專案。
+ [無伺服器 Java 容器](https://github.com/aws/serverless-java-container)：此程式庫能讓您在 Lambda 上執行現有的 Java 應用程式，所需修改極少。

### .NET 開發工具
<a name="open-source-dotnet-tools"></a>

[AWS Lambda .NET ](https://github.com/aws/aws-lambda-dotnet)儲存庫提供 Lambda 開發的 .NET 程式庫和工具，包括 等關鍵專案，適用於 .NET CLI 和 .NET Core 伺服器用於託管 .NET Core 應用程式 AWS Lambda 的工具。

## 專案範例
<a name="open-source-sample-projects"></a>

在 [Serverless Land 儲存庫](https://serverlessland.com/repos)中探索 Lambda 範例專案和應用程式的完整集合。這些範例示範了各種 Lambda 使用案例、整合模式與最佳實務，能協助您開始使用無伺服器應用程式。