

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 AWS FIS aws: lambda: 函数操作
<a name="use-lambda-actions"></a>

你可以使用 **aws: lambda: function 操作在函数**的调用中注入错误。 AWS Lambda 

这些操作使用 AWS FIS 托管扩展来注入错误。要使用 **aws: lambda: function 操作，您需要将扩展作为一个层附加到您的 Lambda 函数**，并配置 Amazon S3 存储桶以在和扩展之间进行通信。 AWS FIS 

当您运行以 **aws: lambda: f** unction 为目标的 AWS FIS 实验时，从您的 Lambda 函数中读取 A AWS FIS mazon S3 配置，并将错误注入信息写入指定的 Amazon S3 位置，如下图所示。

![\[该图显示了 AWS Fault Injection Service Lambda 扩展的配置。\]](http://docs.aws.amazon.com/zh_cn/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>
+ L AWS FIS ambda 扩展不能与使用响应流的函数一起使用。即使没有出现任何故障，L AWS FIS ambda 扩展也会抑制流配置。有关更多信息，请参阅*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 扩展作为图层附加到函数上。有关该图层的更多信息 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 Logs 用户指南中的使用筛选条件从 CloudWatch 日志*[事件创建指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)。

### 使用 CloudWatch 嵌入式指标格式 (EMF)
<a name="lambda-actions-emf-metrics"></a>

您可以通过将变量设置为，将 AWS FIS Lambda 扩展配置为发出 EMF 日志。`AWS_FIS_EXTENSION_METRICS` `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_cn/fis/latest/userguide/images/emf-metrics-graph.png)


## 高级主题
<a name="lambda-actions-advanced-topics"></a>

本节提供了有关如何 AWS FIS 使用 Lambda 扩展和特殊用例的更多信息。

**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_cn/fis/latest/userguide/images/understanding-concurrency.png)


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

 AWS Fault Injection Service Lambda 操作使用 a **ws: 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，请参阅用户指南 SnapStart中的使用 [Lambda 提高启动性能](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 运行时公开 Runtime API 的代理并在`AWS_LAMBDA_RUNTIME_API`变量中公布其位置来实现此目的。

下图显示了使用 Lambda 运行时 API 代理的单个扩展的配置：

![\[默认配置。\]](http://docs.aws.amazon.com/zh_cn/fis/latest/userguide/images/Proxy-1.png)


要使用 AWS Lambda Runtime API 代理模式将 AWS FIS Lambda 扩展与其他扩展一起使用，您需要使用自定义引导脚本将代理链接起来。L AWS FIS ambda 扩展接受以下环境变量：
+ `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 Runtime API 代理按两个不同的顺序将 AWS FIS 扩展与其他扩展程序链接起来。

![\[两个使用 Lambda API 代理的链接扩展。\]](http://docs.aws.amazon.com/zh_cn/fis/latest/userguide/images/lambda-runtime-api-proxy.png)


*有关 AWS Lambda 运行时 API 代理的更多信息，请参阅用户指南中的使用[运行时 API 代理扩展增强 AWS Lambda 运行时安全和治理和](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 Lambda *

### AWS FIS 与容器运行时一起使用
<a name="container-runtimes"></a>

对于使用接受`AWS_LAMBDA_RUNTIME_API`环境变量的容器镜像的 AWS Lambda 函数，您可以按照以下步骤将 AWS FIS Lambda 扩展打包到您的容器镜像中：

1. 确定要从中提取扩展的图层的 ARN。有关如何查找 ARN 的更多信息，请参阅。[配置 Lambda 函数](#configure-lambda-functions)

1. 使用 AWS Command Line Interface (CLI) 请求有关扩展的详细信息`aws lambda get-layer-version-by-arn --arn fis-extension-arn`。响应中将包含一个包含预签名 URL 的`Location`字段，您可以从中将 FIS 扩展名下载为 ZIP 文件。

1. 将扩展的内容解压缩到 Docker 文件系统中`/opt`。以下是基于 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`-必填项。用于配置 Lambd AWS FIS a 扩展的 AWS Lambda [包装脚本](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-modify.html#runtime-wrapper)的位置。应将其设置为扩展中包含的`/opt/aws-fis/bootstrap`脚本。
+ `AWS_FIS_LOG_LEVEL`-可选。Lambd AWS FIS a 扩展程序发出的消息的日志级别。支持的值有`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: 端口。`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`。