

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

# 何時使用 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
```