

# 何时使用 Lambda 仅限操作系统的运行时
<a name="runtimes-provided"></a>

Lambda 为 Java、Python、Node.js、.NET 和 Ruby 提供[托管运行时系统](lambda-runtimes.md)。要使用无法作为托管运行时系统使用的编程语言创建 Lambda 函数，请使用仅限操作系统的运行时系统（`provided` 运行时系统系列）。仅限操作系统的运行时系统有三种主要用例：
+ **本机提前（AOT）编译**：Go、Rust、Swift 和 C\$1\$1 等语言本机编译为可执行的二进制文件，不需要专用语言运行时系统。这些语言只需要一个可以运行编译后二进制文件的操作系统环境。您还可以使用 Lambda 的仅限操作系统的运行时系统来部署使用.NET 本机 AOT 和 Java GraalVM 本机映像编译的二进制文件。

  您必须在二进制文件中包含运行时系统接口客户端。运行时系统接口客户端调用 [将 Lambda 运行时 API 用于自定义运行时](runtimes-api.md) 来检索函数调用，然后调用您的函数处理程序。Lambda 为 [Rust](lambda-rust.md)、[Go](golang-package.md#golang-package-mac-linux)、[.NET 本机 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）相同。
+ **第三方运行时系统**：您可以使用现成的运行时来运行 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 支持以下仅限操作系统的运行时系统：


| 名称 | 标识符 | 操作系统 | 弃用日期 | 阻止函数创建 | 阻止函数更新 | 
| --- | --- | --- | --- | --- | --- | 
|  仅限操作系统的运行时系统  |  `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 日   |   Sep 30, 2026   | 

与 Amazon Linux 2 相比，Amazon Linux 2023 (`provided.al2023`) 运行时系统具有多项优势，包括较小的部署占用空间和 `glibc` 等更新版本的库。

`provided.al2023` 运行时系统使用 `dnf` 而不是 `yum` 作为程序包管理器，后者是 Amazon Linux 2 中的默认程序包管理器。有关 `provided.al2023` 和 `provided.al2` 之间区别的更多信息，请参阅 AWS 计算博客上的 [AWS Lambda 的 Amazon Linux 2023 运行时系统简介](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 日志**  

```
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 SDK 使用此值在服务之间连接追踪数据。
+ **创建上下文对象** – 使用来自 API 响应中的环境变量和标头的上下文信息创建一个对象。
+ **调用函数处理程序** – 将事件和上下文对象传递到处理程序。
+ **处理响应** – 调用[调用响应](runtimes-api.md#runtimes-api-response) API 以发布来自处理程序的响应。
+ **处理错误** – 如果出现错误，请调用[调用错误](runtimes-api.md#runtimes-api-invokeerror) API。
+ **清理** – 释放未使用的资源，将数据发送到其他服务，或在获取下一个事件之前执行其他任务。

### Entrypoint
<a name="runtimes-custom-bootstrap"></a>

自定义运行时的入口点是一个名为 `bootstrap` 的可执行文件。引导文件可以是运行时，也可以调用创建运行时的另一个文件。如果部署包的根目录不包含名为 `bootstrap` 的文件，则 Lambda 将在函数的层中查找该文件。如果 `bootstrap` 文件不存在或不是可执行文件，则函数将在调用后返回 `Runtime.InvalidEntrypoint` 错误。

以下是一个 `bootstrap` 文件示例，该文件使用捆绑版本的 Node.js 在名为 `runtime.js` 的单独文件中运行 JavaScript 运行时系统。

**Example bootstrap**  

```
#!/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` 请求**：多个调用可以同时对[调用响应 API](runtimes-api.md#runtimes-api-response) 进行调用。
+ **实现线程安全的请求处理**：确保通过妥善管理共享资源和状态来确保并发调用不会相互干扰。
+ **使用唯一的请求 ID**：使用 `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 函数。首先，您在函数的部署程序包中包含运行时。然后，您将其迁移到一个您独立于函数管理的层。最后，您通过更新运行时层的基于资源的权限策略来将运行时层与全球共享。

## 先决条件
<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`）。[安装 Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，获取 Ubuntu 和 Bash 与 Windows 集成的版本。本指南中的示例 CLI 命令使用 Linux 格式。如果您使用的是 Windows CLI，则必须重新格式化包含内联 JSON 文档的命令。

您需要一个 IAM 角色来创建 Lambda 函数。该角色需要权限方可将日志发送到 CloudWatch Logs 并访问您的函数使用的 AWS 服务。如果您没有函数开发的角色，请立即创建一个。

**创建执行角色**

1. 在 IAM 控制台中，打开 [Roles（角色）页面](https://console.aws.amazon.com/iam/home#/roles)。

1. 选择**创建角色**。

1. 创建具有以下属性的角色。
   + **Trusted entity**（可信任的实体）– **Lambda**。
   + **Permissions**（权限）– **AWSLambdaBasicExecutionRole**。
   + **Role name**（角色名称）– **lambda-role**。

   **AWSLambdaBasicExecutionRole** 策略具有函数将日志写入 CloudWatch Logs 所需的权限。

## 创建函数
<a name="runtimes-walkthrough-function"></a>

使用自定义运行时创建 Lambda 函数。此示例包含两个文件：一个运行时系统 `bootstrap` 文件和一个函数处理程序。两个文件都在 Bash 中实施。

1. 为项目创建一个目录，然后切换到该目录。

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

1. 创建名为 `bootstrap` 的新文件。这是自定义运行时系统。  
**Example bootstrap**  

   ```
   #!/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
   ```

   如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [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-layer"></a>

要将运行时代码与函数代码分开，请创建一个仅包含运行时的层。层可让您单独开发函数的各个依赖项，而且，通过对多个函数使用相同的层，还可以减少存储使用。有关更多信息，请参阅 [使用层管理 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) 命令创建层。

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

   这将创建第一个版本的层。

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

要在函数中使用运行时系统层，请将函数配置为使用该层，并从函数中删除运行时代码。

1. 更新函数配置以拉入到层。

   ```
   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. 调用函数以确认它适用于运行时系统层。

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

   如果使用 **cli-binary-format** 版本 2，则 AWS CLI 选项是必需的。要将其设为默认设置，请运行 `aws configure set cli-binary-format raw-in-base64-out`。有关更多信息，请参阅*版本 2 的 AWS Command Line Interface 用户指南*中的 [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 bootstrap**  

   ```
   #!/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. 配置函数以使用新版本的层。

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

## 共享层
<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` 层版本 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>

删除每个版本的层。

```
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 中。函数可继续工作，但无法再被配置为使用删除的版本。如果您修改了函数的层的列表，则必须指定新版本或忽略已删除的层。

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

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