如何解决在使用 AWS SDK 调用 Lambda 函数时出现的“native lambda error:InvalidSignatureException: Signature expired”(本机 Lambda error:InvalidSignatureException: 签名已过期)错误?

1 分钟阅读
0

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

AWS 官方
AWS 官方已更新 5 个月前