AWS Lambda嵌套调用出现InvalidSignatureException异常问题咨询
根因说明
这个错误是AWS JS SDK v3 3.20版本的已知缺陷导致的:SDK会在Lambda执行环境中缓存签名凭证,当执行环境被复用(冷启动后的后续调用)时,会直接使用已经过期的缓存签名,即使Lambda系统时钟与NTP同步正常,也会触发签名过期报错,跨Lambda调用的链路延迟会进一步提高这个问题的出现概率。
修复建议
- 优先升级AWS JS SDK版本:该签名缓存缺陷在3.49.0及之后的版本已经被官方修复,直接将
@aws-sdk/client-lambda升级到最新稳定版即可解决绝大多数同类偶发错误。 - 若暂时无法升级版本,可在初始化Lambda客户端时禁用签名凭证缓存,配置示例如下:
const { LambdaClient } = require("@aws-sdk/client-lambda"); const lambdaClient = new LambdaClient({ signer: { cacheCredentials: false, clockSkew: 0 } });
- 配置针对性重试策略,对
InvalidSignatureException类型错误追加自动重试逻辑,避免单次签名错误导致业务请求失败,配置示例如下:
const { StandardRetryStrategy, defaultRetryDecider } = require("@aws-sdk/middleware-retry"); const customRetryDecider = (error) => { if (error.name === "InvalidSignatureException") return true; return defaultRetryDecider(error); }; const retryStrategy = new StandardRetryStrategy(async () => 3, { retryDecider: customRetryDecider }); const lambdaClient = new LambdaClient({ retryStrategy });
- 检查接收端Lambda的超时配置:如果Lambda执行时长接近设置的超时阈值,调用其他Lambda的请求会被积压在事件队列中,实际发送时签名已经过期,这种情况适当调大Lambda的超时时间即可解决。
内容的提问来源于stack exchange,提问作者Michael Eliot
相关产品推荐
相关产品推荐

