#aws-lambda #lambda #aws #amazon-sqs #env-var #api

程序+库 lambda-debugger

AWS Lambda 运行时模拟器,用于本地和远程调试

1 个不稳定版本

0.2.1 2024 年 8 月 5 日

HTTP 服务器 中排名第 421

Download history 115/week @ 2024-08-05

每月下载量 115

Apache-2.0 许可

46KB
560 行(不包括注释)

AWS Lambda 运行时模拟器,用于本地和远程调试

本模拟器允许您在本地运行 Lambda 函数,无论是从文件中获取本地有效负载还是从 AWS 获取远程有效负载,就像本地 Lambda 在那里运行一样。

安装和用法

cargo install lambda-debugger

使用本地有效负载进行调试

对于只需要单个静态有效负载的简单用例,请使用此方法。

  1. 将您的有效负载保存到文件中,例如,将 {"command": "echo"} 保存到 test-payload.json 文件
  2. 使用有效负载文件名作为其唯一参数启动模拟器,例如 cargo lambda-debugger test-payload.json
  3. 添加模拟器打印的 env 变量,并在另一个终端中使用 cargo run 启动您的 lambda

lambda 将连接到模拟器并接收有效负载。您可以根据需要多次重新运行 lambda 使用相同的有效负载。

使用远程有效负载进行调试

使用此方法从其他 AWS 服务获取动态有效负载或需要在处理涉及 API Gateway 的网站上的用户操作时发送动态响应,例如以下图中所示

function needed debugging

远程调试配置

本项目提供必要的工具,将 AWS 有效负载实时带到您的本地计算机,运行 lambda 并将响应发送回 AWS,就像本地 lambda 在 AWS 上运行一样。

  • proxy-lambda 在 AWS 和您的开发机器之间实时转发 Lambda 请求和响应
  • lambda-debugger 提供 Lambda API 以在本地运行 lambda 函数并与 AWS 交换有效负载

function debugged locally

限制

此 Lambda 模拟器不提供 AWS 完全的运行时功能

  • 没有环境约束,例如内存或执行时间
  • panic 不会报告回 AWS
  • 不支持并发请求处理
  • 不支持 X-Trace 或扩展 API
  • 不支持流响应
  • 更小的最大有效载荷大小

开始使用远程调试

  • 使用IAM权限在SQS中创建请求响应队列
  • proxy-lambda部署到需要调试的函数位置
  • 作为二进制文件或使用以下命令在本地运行模拟器:cargo run
  • 使用以下命令在本地运行您的lambda:cargo run

SQS配置

创建两个配置相同的SQS队列

  • proxy_lambda_req 供AWS发送到调试中的本地lambda的请求。 必需
  • proxy_lambda_resp 如果您希望本地lambda的响应返回给调用者。 可选

有关如何自定义队列名称和其他设置的更多信息,请参阅高级设置部分。

推荐的队列设置

  • 队列类型:标准
  • 最大消息大小:256 KB
  • 默认可见性超时:10 秒
  • 消息保留期:1 小时
  • 接收消息等待时间:20 秒

此IAM策略授予proxy-lambda访问队列的权限。它假定您已经拥有从本地机器访问Lambda和SQS的足够权限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::512295225992:role/lambda_basic"
      },
      "Action": [
        "sqs:DeleteMessage",
        "sqs:GetQueueAttributes",
        "sqs:ReceiveMessage",
        "sqs:SendMessage"
      ],
      "Resource": "arn:aws:sqs:us-east-1:512295225992:proxy_lambda_req"
    }
  ]
}

修改策略以包含您的ID

在将上述策略添加到队列之前,您需要将主体资源 ID替换为您自己的值

  • 主体 - 是lambda使用的IAM角色(在AWS控制台中检查Lambda的权限配置选项卡以找到值)
  • 资源 - 策略附加到的队列的ARN(在AWS控制台中的队列详细信息页面上找到值)

请求响应队列使用不同的资源

  • arn:aws:sqs:[your_region]:[your_aws_account]:[proxy_lambda_req]proxy_lambda_req 队列
  • arn:aws:sqs:[your_region]:[your_aws_account]:[proxy_lambda_resp]proxy_lambda_resp 队列

构建和部署proxy-lambda

应将proxy-lambda函数部署到AWS,以替换您想要调试的函数。

在运行以下bash脚本之前,将以下部分替换为您自己的值(从项目根目录运行)

  • 目标 - AWS上lambda函数的架构,例如 x86_64-unknown-linux-gnu
  • 区域 - lambda函数所在的区域,例如 us-east-1
  • 名称 - 您想要替换为代理的lambda函数的名称,例如 my-lambda
target=x86_64-unknown-linux-gnu 
region=us-east-1
name=my-lambda

cargo build --release --target $target
cp ./target/$target/release/proxy-lambda ./bootstrap && zip proxy.zip bootstrap && rm bootstrap
aws lambda update-function-code --region $region --function-name $name --zip-file fileb://proxy.zip

如果使用AWS控制台中的测试事件运行已部署的proxy-lambda,则它应返回OK或超时等待响应。请检查CloudWatch日志以获取详细的执行报告。

调试

先决条件

  • proxy-lambda已部署到AWS
  • SQS队列已创建并具有推荐的访问策略

list of sqs queues

启动本地lambda

  • 在单独的终端中运行 cargo lambda-debugger
  • 添加模拟器打印的提示中的环境变量
  • 在添加环境变量的同一个终端中,使用 cargo run 启动您的 lambda

launch example

调试

  • 作为常规数据流的一部分在 AWS 上触发事件,例如通过网页上的用户操作
  • 模拟器应显示 lambda 负载并将其转发到本地 lambda 以进行处理
  • 需要时进行调试

成功、失败和重放

  • 如果配置了响应队列(proxy_lambda_resp),则将成功的响应发送回调用者
  • 恐慌或处理器错误不会被发送回 AWS
  • 在 lambda 成功完成之前,将重复使用相同的入站 SQS 消息
  • lambda-debugger 在本地 lambda 成功完成后从 proxy_lambda_req 队列中删除请求消息
  • proxy-lambda 在将其转发给调用者(例如 API Gateway)后将响应消息从 proxy_lambda_resp 队列中删除
  • proxy-lambda 在向 proxy_lambda_resp 发送新请求之前清除 proxy_lambda_resp 队列
  • 您必须手动清除 proxy_lambda_req 队列以删除过时的请求

如果本地 lambda 失败、终止或恐慌,您可以更改其代码并再次运行它,以重用请求队列中的相同入站负载

高级远程调试设置

自定义 SQS 队列名称

默认情况下,proxy-lambda 和本地 lambda-debugger 尝试连接到同一区域中的 proxy_lambda_reqproxy_lambda_resp 队列。

如果您的队列名称与默认值不同,请向 proxy-lambdalambda-debugger 提供以下环境变量

延迟响应

调试本地 lambda 可能需要比 AWS 服务愿意等待的时间更长。例如,proxy-lambda 函数可以被配置为最多等待 15 分钟,但 AWS API Gateway 的等待时间限制为 30 秒。

假设您花费了 5 分钟来修复 lambda 代码并返回正确的响应。如果 proxy-lambda 被配置为等待那么长时间,它仍然会将响应转发到 API Gateway,而 API Gateway 4.5 分钟前已经超时。在这种情况下,您可能需要触发另一个请求才能成功完成端到端。

不等待本地 lambda 的响应

由于耗时过长或不需要响应,让 proxy-lambda 等待本地 lambda 的响应可能效率低下。如果响应队列不可访问,proxy-lambdalambda-debugger 都不会期望有响应。

选项 1:删除 proxy_lambda_resp 队列

选项 2:向 proxy-lambdalambda-debugger 添加无值的 PROXY_LAMBDA_RESP_QUEUE_URL 环境变量

选项 3:通过更改 IAM 策略使 proxy_lambda_resp 队列不可访问。例如,将资源名称从正确的队列名称 "Resource": "arn:aws:sqs:us-east-1:512295225992:proxy_lambda_resp" 更改为不存在的名称,例如这样 "Resource": "arn:aws:sqs:us-east-1:512295225992:proxy_lambda_resp_BLOCKED"proxy-lambdalambda-debugger 都将访问错误视为不期望有响应的提示。

取消长 proxy-lambda 等待

如果您的 proxy-lambda 配置为期望较长的调试时间,例如 30 分钟,您可能想取消重新运行的等待。由于在 AWS 上无法终止正在运行的 lambda 实例,取消等待的最简单方法是通过 AWS 控制台向 proxy_lambda_resp 队列发送随机消息。等待的 proxy-lambda 将将其转发给调用者并可供新的请求使用。

大量负载和数据压缩

SQS 负载数据大小由 SQS 限制为 262,144 字节,而 Lambda 允许高达 6MB。 proxy-lambdalambda-debugger 使用 flate2 crate 压缩超大数据负载,并以编码的 Base58 字符串形式发送,以克服此限制。

在调试模式下,数据压缩可能需要长达一分钟的时间。与发布版本相比,它要快得多。

日志记录

proxy-lambdalambda-debugger 都使用 RUST_LOG 环境变量来设置日志级别和过滤器。如果 RUST_LOG 不存在或为空,则两个 crate 都在 INFO 级别进行日志记录,并抑制其依赖项的日志。有关更多信息,请参阅 https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#example-syntax

RUST_LOG 的示例值

  • error - 仅从所有 crate 和依赖项中记录错误
  • warn,lambda_debugger=info - lambda-debugger 的级别为 INFO,其他一切为 WARN
  • proxy=debug - 在 proxy-lambda 中进行详细记录

依赖项

~20–32MB
~484K SLoC