View a markdown version of this page

使用 AWS FIS aws: lambda: 函数操作 - AWS 故障注入服务

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

使用 AWS FIS aws: lambda: 函数操作

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

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

当您运行以 aws: lambda: function 为目标的 AWS FIS 实验时,从 Lambda 函数 AWS FIS 读取 Amazon S3 配置,并将故障注入信息写入到指定的 Amazon S3 位置,如下图所示。

该图显示了 AWS Fault Injection Service Lambda 扩展的配置。

操作

限制

  • AWS FIS Lambda 扩展不能与使用响应流的函数一起使用。即使没有出现任何错误, AWS FIS Lambda 扩展也会抑制串流配置。有关更多信息,请参阅AWS Lambda 用户指南中的 Lambda 函数响应流。

先决条件

在使用 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 函数

对于您想要影响的每个 Lambda 函数,请按照以下步骤操作:

  1. 将上面创建的 Amazon S3 读取访问策略附加到 Lambda 函数。

  2. 将 AWS FIS 扩展程序作为图层附加到函数中。有关图层 ARN 的更多信息,请参阅的可用版本 AWS FIS Lambda 的扩展

  3. 例如arn:aws:s3:::my-config-distribution-bucket/FisConfigs/,将AWS_FIS_CONFIGURATION_LOCATION变量设置为 Amazon S3 配置文件夹的 ARN。

  4. AWS_LAMBDA_EXEC_WRAPPER 变量设置为 /opt/aws-fis/bootstrap

配置一个 AWS FIS 试验

在运行实验之前,请确保已将您在先决条件中创建的 Amazon S3 写入访问权限策略附加到将使用 AWS FIS Lambda 操作的实验角色。有关如何设置 AWS FIS 实验的更多信息,请参阅管理 AWS FIS 实验模板

日志记录

AWS FIS Lambda 扩展将日志写入控制台和 CloudWatch 日志。可以使用AWS_FIS_LOG_LEVEL变量配置日志记录。支持的值有INFOWARNERROR。日志将以为您的 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 日志事件创建指标

使用 CloudWatch 嵌入式指标格式 (EMF)

您可以通过将变量设置为,将 AWS FIS Lambda 扩展配置为发出 EMF 日志。AWS_FIS_EXTENSION_METRICS all默认情况下,该扩展不发出 EMF 日志,AWS_FIS_EXTENSION_METRICS默认为。noneEMF 日志发布在 CloudWatch 控制台aws-fis-extension namespace上。

aws-fis-extension命名空间中,您可以选择要在图表中显示的某些指标。以下示例显示了aws-fis-extension命名空间中的一些可用指标。

CloudWatch 仪表板中输出 EMF 指标的示例图。

高级主题

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

了解投票

在错误开始影响所有调用之前,您可能会注意到长达 60 秒的升级期。这是因为 Lambda 扩展在等待实验开始时很少轮询配置信息。您可以通过设置AWS_FIS_SLOW_POLL_INTERVAL_SECONDS环境变量(默认为 60 秒)来调整轮询间隔。值越低,轮询频率越高,但会产生更大的性能影响和成本。您可能还会注意到故障注入后长达 20 秒的缓冲期。这是因为在实验运行时,扩展程序的轮询频率更高。

了解并发性

您可以同时使用多个操作将相同的 Lambda 函数作为目标。如果这些操作彼此不同,则将应用所有操作。例如,您可以在返回错误之前添加初始延迟。如果将两个相同或冲突的操作应用于同一个函数,则只会应用起始日期最早的操作。

下图显示了两个相互冲突的操作,即 aws: lambda: invoc ation-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 结束

错误和响应代码图显示了在 x86 和 arm 上从 11:38 到 11:41 的两个操作重叠。

了解调用百分比

AWS Fault Injection Service Lambda 操作使用 aws: lambda: function 目标,允许您选择一个或多个函数 ARN。 AWS Lambda 使用这些 ARN, AWS Fault Injection Service Lambda 操作可以在所选 Lambda 函数的每次调用中注入错误。为了允许您仅将错误注入到一小部分调用中,每个操作都允许您指定一个值介于 0 到 100 之间的invocationPercentage参数。使用该invocationPercentage参数,即使调用百分比低于 100%,也可以确保操作是并发的。

的特殊注意事项 SnapStart

AWS Lambda 即使实验已经在运行, SnapStart 启用了功能也更有可能等待整个时间AWS_FIS_SLOW_POLL_INTERVAL_SECONDS才开始第一个故障配置。这是因为 Lambda SnapStart 使用单个快照作为多个执行环境的初始状态并保留临时存储。对于 AWS Fault Injection Service Lambda 扩展,它将保持轮询频率,并跳过执行环境初始化时的初始配置检查。有关 Lambda 的更多信息 SnapStart,请参阅AWS Lambda 用户指南 SnapStart中的使用 Lambda 提高启动性能。

快速不频繁函数的特殊注意事项

如果您的 Lambda 函数的运行时间少于 70 毫秒的平均轮询持续时间,则轮询线程可能需要多次调用才能获得故障配置。如果该函数不经常运行,例如每 15 分钟运行一次,则投票将永远不会完成。为确保轮询线程可以完成,请设置AWS_FIS_POLL_MAX_WAIT_MILLISECONDS参数。该扩展程序将等待您为进行中投票设置的持续时间结束后再启动该功能。请注意,这将增加计费函数的持续时间,并导致某些调用的额外延迟。

使用 Lambda 运行时 API 代理配置多个扩展

Lambda 扩展使用 AWS Lambda 运行时 API 代理在函数调用到达运行时之前对其进行拦截。它通过向运行时公开 AWS Lambda 运行时 API 的代理并在AWS_LAMBDA_RUNTIME_API变量中公布其位置来实现此目的。

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

默认配置。

要将 AWS FIS Lambda 扩展与使用 AWS Lambda 运行时 API 代理模式的另一个扩展一起使用,您需要使用自定义引导脚本将代理链接起来。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 代理的两个链式扩展。

有关 AWS Lambda 运行时 API 代理的更多信息,请参阅AWS Lambda 用户指南中的使用运行时 API 代理扩展增强 AWS Lambda 运行时安全性和监管以及将 Lambda 运行时 API 用于自定义运行时。

使用 AWS FIS 使用容器运行时

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

  1. 确定要从中提取扩展的图层的 ARN。有关如何查找 ARN 的更多信息,请参阅配置 Lambda 函数

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

  3. 将扩展程序的内容解压缩到/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 函数。

AWS FIS Lambda 环境变量

以下是 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包装脚本的位置。应将其设置为扩展程序中包含的/opt/aws-fis/bootstrap脚本。

  • AWS_FIS_LOG_LEVEL‐可选。 AWS FIS Lambda 扩展发出的消息的日志级别。支持的值有INFOWARNERROR。如果未设置,则 AWS FIS 扩展名将默认为INFO

  • AWS_FIS_EXTENSION_METRICS‐可选。可能的值为 allnone。如果设置为扩展名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,请参阅AWS Lambda 用户指南中的将 Lambda 运行时 API 用于自定义运行时

  • AWS_FIS_PROXY_LISTENER_PORT‐可选。定义 AWS FIS Lambda 扩展在其上公开 AWS Lambda 运行时 API 代理的端口,该代理可供其他扩展或运行时使用。默认值为 9100

  • AWS_FIS_POLL_MAX_WAIT_MILLISECONDS‐可选。如果设置为非零值,则此变量定义扩展在评估故障配置和开始调用运行时之前等待运行中异步轮询完成的毫秒数。默认值为 0。在aws:lambda:invocation-error操作true中使用 preventExecution set to 时,我们建议将此变量设置为至少2000(2 秒),以确保扩展程序具有最新的故障配置,然后再决定是否阻止函数执行。