

# 修改运行时环境
<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 控制台创建 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
      ```