当我使用 AWS SDK 调用 AWS Lambda 函数时,该函数返回“Signature expired”(签名已过期)错误。
简短描述
当客户端时间和服务器时间不匹配时,Lambda 签名将过期,您会收到类似于以下内容的错误消息:
“Error: native lambda error:InvalidSignatureException: Signature expired: 20230118T161739Z is now earlier than 20230118T161739Z (20190318T162239Z - 5 min.)”(错误:本机 Lambda error:InvalidSignatureException: 签名已过期:20230118T161739Z 现在早于 20230118T161739Z(20190318T162239Z - 5 分钟))
API 请求必须在请求时间戳 5 分钟内到达 AWS,否则 AWS 会拒绝该请求。在某些情况下,您可以更改客户端时间以匹配服务器时间。
解决方法
当您使用 AWS SDK 同步调用 Lambda 函数时,连接将持续到返回响应为止。Node.js SDK 默认允许 50 个连接。如果达到连接配额,则 SDK 会在本地对请求进行排队,直到连接可用。如果您收到“Signature expired”(签名已过期)错误且存在以下操作,则可能会达到连接配额:
- Lambda 函数未节流。
- 客户端时间正确。
- (仅限 Node.js SDK)您在创建客户端时设置了 correctClockSkew:true 选项,这样调用该函数时就会更正时间。
- 您高速调用了 Lambda 函数,或者您高速调用了 Lambda 函数且调用运行了很长一段时间。
SDK 对请求进行签名,然后将请求放入队列中。如果队列变得过大并且请求等待的时间超过 5 分钟,则签名将会过期。由于签名已过期,所有其他请求都会失败。
如果您不需要调用的响应,请使用异步调用。异步调用允许 SDK 仅使用连接来调用请求,不等待响应。
您还可以在应用程序中使用顶级等待 (TLA)。如果您在处理程序之外进行 API 调用,请使用 TLA,在使用 Node.js AWS SDK v3 时会收到 SignatureDoesNotMatch 异常。
或者,增加 SDK 允许的最大连接数。
**注意:**当您添加连接时,Lambda 函数的调用速率更高,并可能导致节流。
相关信息
对 Lambda 应用程序进行监控和问题排查
如何排查 Lambda 函数调用超时错误?
如何确定我的 Lambda 函数是否超时?