

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

# 修改執行階段環境
<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
      ```