1 个不稳定版本
0.2.1 | 2024 年 8 月 5 日 |
---|
在 HTTP 服务器 中排名第 421
每月下载量 115 次
46KB
560 行(不包括注释)
AWS Lambda 运行时模拟器,用于本地和远程调试
本模拟器允许您在本地运行 Lambda 函数,无论是从文件中获取本地有效负载还是从 AWS 获取远程有效负载,就像本地 Lambda 在那里运行一样。
安装和用法
cargo install lambda-debugger
使用本地有效负载进行调试
对于只需要单个静态有效负载的简单用例,请使用此方法。
- 将您的有效负载保存到文件中,例如,将
{"command": "echo"}
保存到test-payload.json
文件 - 使用有效负载文件名作为其唯一参数启动模拟器,例如
cargo lambda-debugger test-payload.json
- 添加模拟器打印的 env 变量,并在另一个终端中使用
cargo run
启动您的 lambda
lambda 将连接到模拟器并接收有效负载。您可以根据需要多次重新运行 lambda 使用相同的有效负载。
使用远程有效负载进行调试
使用此方法从其他 AWS 服务获取动态有效负载或需要在处理涉及 API Gateway 的网站上的用户操作时发送动态响应,例如以下图中所示
远程调试配置
本项目提供必要的工具,将 AWS 有效负载实时带到您的本地计算机,运行 lambda 并将响应发送回 AWS,就像本地 lambda 在 AWS 上运行一样。
- proxy-lambda 在 AWS 和您的开发机器之间实时转发 Lambda 请求和响应
- lambda-debugger 提供 Lambda API 以在本地运行 lambda 函数并与 AWS 交换有效负载
限制
此 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队列已创建并具有推荐的访问策略
启动本地lambda
- 在单独的终端中运行
cargo lambda-debugger
- 添加模拟器打印的提示中的环境变量
- 在添加环境变量的同一个终端中,使用
cargo run
启动您的 lambda
调试
- 作为常规数据流的一部分在 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_req
和 proxy_lambda_resp
队列。
如果您的队列名称与默认值不同,请向 proxy-lambda 和 lambda-debugger 提供以下环境变量
PROXY_LAMBDA_REQ_QUEUE_URL
- 请求 队列,例如 https://sqs.us-east-1.amazonaws.com/512295225992/debug_requestPROXY_LAMBDA_RESP_QUEUE_URL
- 响应 队列,例如 https://sqs.us-east-1.amazonaws.com/512295225992/debug_response
延迟响应
调试本地 lambda 可能需要比 AWS 服务愿意等待的时间更长。例如,proxy-lambda 函数可以被配置为最多等待 15 分钟,但 AWS API Gateway 的等待时间限制为 30 秒。
假设您花费了 5 分钟来修复 lambda 代码并返回正确的响应。如果 proxy-lambda 被配置为等待那么长时间,它仍然会将响应转发到 API Gateway,而 API Gateway 4.5 分钟前已经超时。在这种情况下,您可能需要触发另一个请求才能成功完成端到端。
不等待本地 lambda 的响应
由于耗时过长或不需要响应,让 proxy-lambda 等待本地 lambda 的响应可能效率低下。如果响应队列不可访问,proxy-lambda 和 lambda-debugger 都不会期望有响应。
选项 1:删除 proxy_lambda_resp 队列
选项 2:向 proxy-lambda 和 lambda-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-lambda 和 lambda-debugger 都将访问错误视为不期望有响应的提示。
取消长 proxy-lambda 等待
如果您的 proxy-lambda 配置为期望较长的调试时间,例如 30 分钟,您可能想取消重新运行的等待。由于在 AWS 上无法终止正在运行的 lambda 实例,取消等待的最简单方法是通过 AWS 控制台向 proxy_lambda_resp
队列发送随机消息。等待的 proxy-lambda 将将其转发给调用者并可供新的请求使用。
大量负载和数据压缩
SQS 负载数据大小由 SQS 限制为 262,144 字节,而 Lambda 允许高达 6MB。 proxy-lambda 和 lambda-debugger 使用 flate2 crate 压缩超大数据负载,并以编码的 Base58 字符串形式发送,以克服此限制。
在调试模式下,数据压缩可能需要长达一分钟的时间。与发布版本相比,它要快得多。
日志记录
proxy-lambda 和 lambda-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,其他一切为 WARNproxy=debug
- 在 proxy-lambda 中进行详细记录
依赖项
~20–32MB
~484K SLoC