

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

# 使用 AWS FIS aws：lambda：function 動作
<a name="use-lambda-actions"></a>

您可以使用 **aws：lambda：function** 動作，將錯誤注入 AWS Lambda 函數的叫用中。

這些動作使用 AWS FIS 受管擴充功能來注入錯誤。若要使用 **aws：lambda：function** 動作，您需要將延伸模組做為 layer 連接至 Lambda 函數，並設定 Amazon S3 儲存貯體以在 AWS FIS 和延伸模組之間通訊。

當您執行以 **aws：lambda：function** 為目標的 AWS FIS 實驗時， 會從 Lambda 函數 AWS FIS 讀取 Amazon S3 組態，並將錯誤注入資訊寫入指定的 Amazon S3 位置，如下圖所示。

![\[顯示 AWS Fault Injection Service Lambda 延伸模組組態的圖表。\]](http://docs.aws.amazon.com/zh_tw/fis/latest/userguide/images/Serverless-config-distro-3.png)


## 動作
<a name="supported-lambda-actions"></a>
+ [aws:lambda:invocation-add-delay](fis-actions-reference.md#invocation-add-delay)
+ [aws:lambda:invocation-error](fis-actions-reference.md#invocation-error)
+ [aws:lambda:invocation-http-integration-response](fis-actions-reference.md#invocation-http-integration-response)

## 限制
<a name="lambda-limitations"></a>
+  AWS FIS Lambda 延伸模組無法與使用回應串流的函數搭配使用。即使未套用錯誤， AWS FIS Lambda 延伸模組也會抑制串流組態。如需詳細資訊，請參閱《 *AWS Lambda 使用者指南*》中的 [Lambda 函數的回應串流](https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html)。

## 先決條件
<a name="lambda-prerequisites"></a>

使用 AWS FIS Lambda 動作之前，請確定您已完成下列一次性任務：
+ 在您**計劃從中開始實驗的區域中建立 Amazon S3 儲存貯體** ‐ 您可以使用單一 Amazon S3 儲存貯體進行多個實驗，並在多個 AWS 帳戶之間共用儲存貯體。不過，每個 都必須有個別的儲存貯體 AWS 區域。
+ **建立 IAM 政策，將 Lambda 延伸的讀取存取權授予 Amazon S3 儲存貯**體 - 在下列範本中，將 取代`my-config-distribution-bucket`為您在上方建立的 Amazon S3 儲存貯體名稱，並將 `FisConfigs` 取代為您要使用的 Amazon S3 儲存貯體中的資料夾名稱。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowListingConfigLocation",
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::my-config-distribution-bucket"],
            "Condition": {
                "StringLike": {
                    "s3:prefix": ["FisConfigs/*"]
                }
            }
        },
        {
            "Sid": "AllowReadingObjectFromConfigLocation",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": ["arn:aws:s3:::my-config-distribution-bucket/FisConfigs/*"]
        }
    ]
  }
  ```

------
+ **建立 IAM 政策，將 AWS FIS 實驗的寫入存取權授予 Amazon S3 儲存貯**體 - 在下列範本中，將 取代`my-config-distribution-bucket`為您在上方建立的 Amazon S3 儲存貯體名稱，並將 `FisConfigs` 取代為您要使用的 Amazon S3 儲存貯體中的資料夾名稱。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowFisToWriteAndDeleteFaultConfigurations",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-config-distribution-bucket/FisConfigs/*"
        },
        {
            "Sid": "AllowFisToInspectLambdaFunctions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowFisToDoTagLookups",
            "Effect": "Allow",
            "Action": [
                "tag:GetResources"
            ],
            "Resource": "*"
        }
    ]
  }
  ```

------

## 設定 Lambda 函式
<a name="configure-lambda-functions"></a>

針對您要影響的每個 Lambda 函數，請遵循下列步驟：

1. 將上述建立的 Amazon S3 讀取存取政策連接至 Lambda 函數。

1. 將 AWS FIS 延伸模組做為 layer 連接至 函數。如需層 ARNs的詳細資訊，請參閱 [Lambda 擴充 AWS FIS 功能的可用版本](actions-lambda-extension-arns.md)。

1. 將`AWS_FIS_CONFIGURATION_LOCATION`變數設定為 Amazon S3 組態資料夾的 ARN，例如 `arn:aws:s3:::my-config-distribution-bucket/FisConfigs/`。

1. 將 `AWS_LAMBDA_EXEC_WRAPPER` 變數設定為 `/opt/aws-fis/bootstrap`。

## 設定 AWS FIS 實驗
<a name="configure-fis-experiment-lambda-actions"></a>

在執行實驗之前，請確定您已將您在先決條件中建立的 Amazon S3 寫入存取政策連接到將使用 AWS FIS Lambda 動作的實驗角色。如需如何設定 AWS FIS 實驗的詳細資訊，請參閱 [管理 AWS FIS 實驗範本管理您的 AWS FIS 實驗](experiments.md)。

## 日誌
<a name="lambda-actions-logging"></a>

 AWS FIS Lambda 擴充功能會將日誌寫入主控台和 CloudWatch 日誌。您可以使用 `AWS_FIS_LOG_LEVEL`變數來設定記錄。支援的值為 `INFO`、`WARN` 和 `ERROR`。日誌將以為 Lambda 函數設定的日誌格式撰寫。

以下是文字格式的日誌範例：

```
2024-08-09T18:51:38.599984Z INFO AWS FIS EXTENSION - extension enabled 1.0.1
```

以下是 JSON 格式的日誌範例：

```
{
  "timestamp": "2024-10-08T17:15:36.953905Z",
  "level": "INFO",
  "fields": {
    "message": "AWS FIS EXTENSION - adding 5000 milliseconds of latency to function invocation",
    "requestId":"0608bf70-908f-4a17-bbfe-3782cd783d8b"
  }
}
```

發出的日誌可與 Amazon CloudWatch 指標篩選條件搭配使用，以產生自訂指標。如需指標篩選條件的詳細資訊，請參閱《*Amazon CloudWatch Logs 使用者指南*》中的[使用篩選條件從日誌事件建立指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)。

### 使用 CloudWatch Embedded Metric Format (EMF)
<a name="lambda-actions-emf-metrics"></a>

您可以將 `AWS_FIS_EXTENSION_METRICS`變數設定為 ，以設定 AWS FIS Lambda 延伸來發出 EMF 日誌`all`。根據預設，延伸項目不會發出 EMF 日誌，且`AWS_FIS_EXTENSION_METRICS`預設為 `none`。EMF 日誌會在 CloudWatch 主控台`aws-fis-extension namespace`的 中發佈。

在`aws-fis-extension`命名空間中，您可以選取要在圖形中顯示的特定指標。以下範例顯示 `aws-fis-extension` 命名空間中的一些可用指標。

![\[CloudWatch 儀表板中輸出 EMF 指標的範例圖表。\]](http://docs.aws.amazon.com/zh_tw/fis/latest/userguide/images/emf-metrics-graph.png)


## 進階主題
<a name="lambda-actions-advanced-topics"></a>

本節提供如何使用 Lambda AWS FIS 延伸模組和特殊使用案例的其他資訊。

**Topics**
+ [了解輪詢](#understanding-polling)
+ [了解並行](#understanding-concurrency)
+ [了解調用百分比](#understanding-invocation-percentage)
+ [SnapStart 的特殊考量](#considerations-for-snapshot)
+ [快速不常函數的特殊考量](#considerations-for-fast-infrequent-functions)
+ [使用 Lambda 執行期 API 代理設定多個延伸模組](#configuring-multiple-extensions)
+ [使用 AWS FIS 搭配容器執行時間](#container-runtimes)
+ [AWS FIS Lambda 環境變數](#fis-extension-environment-variables)

### 了解輪詢
<a name="understanding-polling"></a>

您可能會注意到在故障開始影響所有調用之前，緩衝期最多為 60 秒。這是因為 Lambda 延伸模組在等待實驗啟動時不常輪詢組態資訊。您可以設定`AWS_FIS_SLOW_POLL_INTERVAL_SECONDS`環境變數 （預設 60 秒） 來調整輪詢間隔。較低的值將更頻繁輪詢，但對效能和成本的影響更大。在插入錯誤之後，您可能也會注意到延遲時間最多 20 秒。這是因為延伸模組會在實驗執行時更頻繁地輪詢。

### 了解並行
<a name="understanding-concurrency"></a>

您可以同時以具有多個動作的相同 Lambda 函數為目標。如果動作彼此不同，則會套用所有動作。例如，您可以在傳回錯誤之前新增初始延遲。如果將兩個相同或衝突的動作套用至相同的函數，則只會套用最早開始日期的動作。

 下圖顯示兩個衝突的動作：**aws：lambda：invocation-error** 和 **aws：lambda：invocation-http-integration-response**，重疊。一開始，**aws：lambda：invocation-error** 會在 11：38 上升並執行 2 分鐘。然後，**aws：lambda：invocation-http-integration-response** 會嘗試從 11：39 開始，但在第一個動作結束之後的 11：40 才會生效。為了維持實驗時間，**aws：lambda：invocation-http-integration-response** 仍會在最初的預定時間 11：41 完成。

![\[Graphs showing error and response code percentages for x86 and arm during overlapping actions.\]](http://docs.aws.amazon.com/zh_tw/fis/latest/userguide/images/understanding-concurrency.png)


### 了解調用百分比
<a name="understanding-invocation-percentage"></a>

 AWS Fault Injection Service Lambda 動作使用 **aws：lambda：function** 目標，可讓您選取一或多個 AWS Lambda 函數 ARNs。使用這些 ARNs， AWS Fault Injection Service Lambda 動作可以在每次叫用選取的 Lambda 函數時注入錯誤。若要只允許您將故障注入一小部分的調用中，每個動作都允許您指定值為 0 到 100 的`invocationPercentage`參數。使用 `invocationPercentage` 參數，即使調用百分比低於 100%，您也可以確保動作是並行的。

### SnapStart 的特殊考量
<a name="considerations-for-snapshot"></a>

AWS Lambda 啟用 SnapStart 的 函數在取得第一個錯誤組態`AWS_FIS_SLOW_POLL_INTERVAL_SECONDS`之前，有較高的可能性會等待 的完整持續時間，即使實驗已在執行中。這是因為 Lambda SnapStart 使用單一快照做為多個執行環境的初始狀態，並保留暫時儲存。對於 AWS Fault Injection Service Lambda 延伸，它會保留輪詢頻率，並略過初始化執行環境時的初始組態檢查。如需 Lambda SnapStart 的詳細資訊，請參閱《 使用者指南》中的[使用 Lambda SnapStart 改善啟動效能](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html)。 *AWS Lambda *

### 快速不常函數的特殊考量
<a name="considerations-for-fast-infrequent-functions"></a>

如果您的 Lambda 函數執行時間少於平均輪詢持續時間 70 毫秒，則輪詢執行緒可能需要多次調用才能取得錯誤組態。如果函數不常執行，例如每 15 分鐘執行一次，則永遠不會完成輪詢。為了確保輪詢執行緒可以完成，請設定 `AWS_FIS_POLL_MAX_WAIT_MILLISECONDS` 參數。延伸項目會等到您為傳輸中輪詢設定的持續時間結束，再啟動函數。請注意，這將增加計費的函數持續時間，並導致某些調用的額外延遲。

### 使用 Lambda 執行期 API 代理設定多個延伸模組
<a name="configuring-multiple-extensions"></a>

Lambda 延伸模組會使用 AWS Lambda 執行期 API 代理來攔截函數呼叫，然後再到達執行期。其做法是將 AWS Lambda 執行期 API 的代理公開至執行期，並在 `AWS_LAMBDA_RUNTIME_API`變數中公告其位置。

下圖顯示使用 Lambda 執行期 API 代理的單一延伸模組的組態：

![\[預設組態。\]](http://docs.aws.amazon.com/zh_tw/fis/latest/userguide/images/Proxy-1.png)


若要使用 AWS Lambda 執行期 API 代理模式將 AWS FIS Lambda 延伸模組與另一個延伸模組搭配使用，您將需要使用自訂引導指令碼鏈結代理。 AWS FIS Lambda 延伸模組接受下列環境變數：
+ `AWS_FIS_PROXY_RUNTIME_API_ENDPOINT` ‐ 採用`127.0.0.1:9876`代表 AWS Lambda 執行時間 API 的本機 IP 和接聽程式連接埠格式的字串。這可以是 的原始值`AWS_LAMBDA_RUNTIME_API`或其他代理的位置。
+ `AWS_FIS_PROXY_LISTENER_PORT` ‐ 根據預設， 採用 AWS FIS 連接埠號碼，延伸模組應在其上啟動自己的代理`9100`。

透過這些設定，您可以使用 Lambda 執行期 API 代理，以兩個不同的順序將 AWS FIS 延伸項目與另一個延伸項目鏈結。

![\[使用 Lambda API 代理的兩個鏈結延伸模組。\]](http://docs.aws.amazon.com/zh_tw/fis/latest/userguide/images/lambda-runtime-api-proxy.png)


如需 AWS Lambda 執行期 API 代理的詳細資訊，請參閱《 *AWS Lambda 使用者指南*》中的[使用 AWS Lambda 執行期 API 代理延伸來增強執行期安全性和管理](https://aws.amazon.com/blogs/compute/enhancing-runtime-security-and-governance-with-the-aws-lambda-runtime-api-proxy-extension/)，以及[針對自訂執行期使用 Lambda 執行期 API](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html)。

### 使用 AWS FIS 搭配容器執行時間
<a name="container-runtimes"></a>

對於使用接受`AWS_LAMBDA_RUNTIME_API`環境變數的容器映像的 AWS Lambda 函數，您可以依照下列步驟，將 AWS FIS Lambda 延伸模組封裝到容器映像中：

1. 決定要從中擷取延伸模組的 layer ARN。如需如何尋找 ARN 的詳細資訊，請參閱 [設定 Lambda 函式](#configure-lambda-functions)。

1. 使用 AWS Command Line Interface (CLI) 來請求有關延伸模組 的詳細資訊`aws lambda get-layer-version-by-arn --arn fis-extension-arn`。回應將包含一個`Location`欄位，其中包含預先簽章的 URL，您可以從中將 FIS 擴充功能下載為 ZIP 檔案。

1. 將延伸模組的內容解壓縮至 `/opt` Docker 檔案系統。以下是以 NodeJS Lambda 執行時間為基礎的 Dockerfile 範例：

   ```
   # extension installation #
   FROM amazon/aws-lambda-nodejs:12 AS builder
   COPY extension.zip extension.zip
   RUN yum install -y unzip
   RUN mkdir -p /opt
   RUN unzip extension.zip -d /opt
   RUN rm -f extension.zip
   FROM amazon/aws-lambda-nodejs:12
   WORKDIR /opt
   COPY --from=builder /opt .
   # extension installation finished #
   # JS example. Modify as required by your runtime
   WORKDIR ${LAMBDA_TASK_ROOT}
   COPY index.js package.json .
   RUN npm install
   CMD [ "index.handler" ]
   ```

如需容器映像的詳細資訊，請參閱*AWS Lambda 《 使用者指南*》中的[使用容器映像建立 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html)。

### AWS FIS Lambda 環境變數
<a name="fis-extension-environment-variables"></a>

以下是 AWS FIS Lambda 延伸模組的環境變數清單
+ `AWS_FIS_CONFIGURATION_LOCATION` ‐ 必要。 AWS FIS 將寫入作用中錯誤組態且延伸模組將讀取錯誤組態的位置。位置應為 Amazon S3 ARN 格式，包括儲存貯體和路徑。例如 `arn:aws:s3:::my-fis-config-bucket/FisConfigs/`。
+ `AWS_LAMBDA_EXEC_WRAPPER` ‐ 必要。用於設定 AWS FIS Lambda 延伸模組的 AWS Lambda [包裝函式指令碼](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-modify.html#runtime-wrapper)位置。這應該設定為 延伸模組隨附的`/opt/aws-fis/bootstrap`指令碼。
+ `AWS_FIS_LOG_LEVEL` ‐ 選用。 AWS FIS Lambda 延伸所發出訊息的日誌層級。支援的值為 `INFO`、`WARN` 和 `ERROR`。如果未設定， AWS FIS 擴充會預設為 `INFO`。
+ `AWS_FIS_EXTENSION_METRICS` ‐ 選用。可能值為 `all` 和 `none`。如果設定為 擴充`all`功能，則會在 下發出 EMF 指標`aws-fis-extension namespace`。
+ `AWS_FIS_SLOW_POLL_INTERVAL_SECONDS` ‐ 選用。如果設定 將覆寫輪詢間隔 （以秒為單位），而延伸模組未注入錯誤並等待錯誤組態新增至組態位置。預設為 `60`。
+ `AWS_FIS_PROXY_RUNTIME_API_ENDPOINT` ‐ 選用。如果設定 將覆寫 的值`AWS_LAMBDA_RUNTIME_API`，以定義 AWS FIS 延伸模組與 AWS Lambda 執行時間 API 互動的位置，以控制函數叫用。預期 IP：PORT，例如 `127.0.0.1:9000`。如需 的詳細資訊`AWS_LAMBDA_RUNTIME_API`，請參閱《 使用者指南》中的[將 Lambda 執行時間 API 用於自訂執行時間](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html)。 *AWS Lambda *
+ `AWS_FIS_PROXY_LISTENER_PORT` ‐ 選用。定義 AWS FIS Lambda 擴充功能公開 AWS Lambda 執行時間 API 代理的連接埠，可供另一個擴充功能或執行時間使用。預設為 `9100`。
+ `AWS_FIS_POLL_MAX_WAIT_MILLISECONDS` ‐ 選用。如果設定為非零值，此變數會定義延伸模組在評估故障組態並開始調用執行時間之前，等待傳輸中非同步輪詢完成的毫秒數。預設為 `0`。