当我使用 AWS 软件开发工具包 (SDK) 调用 AWS Lambda 函数时,该函数返回签名已过期的错误。
概述
当客户端时间与服务器时间不匹配时,会出现 Lambda 签名已过期的信息,类似于以下错误:
"Error: native lambda error:InvalidSignatureException: Signature expired: 20230118T161739Z is now earlier than 20230118T161739Z (20190318T162239Z - 5 min.)"
API 请求必须在请求时间戳五分钟内到达 AWS,否则 AWS 会拒绝该请求。在某些情况下,无法通过更改客户端时间以匹配服务器时间来纠正此问题。
解决方法
在使用 AWS 软件开发工具包 (SDK) 同步调用 Lambda 函数时,会在返回响应之前一直进行连接。Node.js 软件开发工具包 (SDK) 默认允许进行 50 个连接。如果达到连接上限,那么软件开发工具包 (SDK) 将在本地对请求进行排队,直到可进行连接。如果您收到了签名已过期的错误,则可能已达到连接上限,同时,在进行以下操作:
- Lambda 函数未节流。
- 客户端时间正确。
- (仅限 Node.js 软件开发工具包)在创建客户端时设置了 correctClockSkew:true 选项,以确保在调用时更正时间。
- Lambda 函数的调用率高,运行时间长。
- Lambda 函数的调用率高。
软件开发工具包 (SDK) 会对请求进行签名,然后将其置于队列中,等待进行连接。如果队列变得太大并且请求等待的时间超过五分钟,则签名将会过期。任何其他请求都会失败,因为签名已过期。
要解决此问题,请考虑在不需要调用响应的情况下对 Lambda 使用异步调用。这样,软件开发工具包 (SDK) 可使用连接仅调用请求,而不要等待响应。
您还可以增加软件开发工具包 (SDK) 允许的最大连接数量。
**注意:**增加连接数量可以提高 Lambda 函数的调用率,可能会导致节流。
相关信息
对 Lambda 应用程序进行监控和问题排查
如何排查 Lambda 函数调用超时错误?
如何确定我的 Lambda 函数是否超时?