怎样才能解决在使用 AWS 软件开发工具包 (SDK) 调用 Lambda 函数时出现的“native lambda error:InvalidSignatureException: 签名已过期”错误?

1 分钟阅读
0

当我使用 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 函数是否超时?

AWS 官方
AWS 官方已更新 1 年前