调用Lambda时出现InvalidSignatureException: Signature expired错误求助
问题分析:S3→SQS→Lambda架构中的签名过期错误
架构与问题现象
- 业务流程:
S3 ---> S3 Notification ---> SQS ---> Lambda - 偶发错误日志:
"errorType": "Runtime.UnhandledPromiseRejection" "errorMessage": "InvalidSignatureException: Signature expired: 20221230T132433Z is now earlier than 20221230T132603Z (20221230T133103Z - 5 min.)"
- 重试行为:SQS配置了重试策略,错误消息回队后,Lambda再次处理即可成功完成任务。
根因解析
这个错误的核心是S3事件附带的请求签名过期,具体逻辑是:
- S3生成事件通知时,会附带一个临时签名,用于后续访问对应的S3资源,这个签名默认有效期只有5分钟。
- 当消息在SQS中因为队列积压、Lambda冷启动延迟、前一次执行中断等原因,等待处理的时间超过了5分钟,Lambda真正执行时,这个签名已经失效,就会抛出
InvalidSignatureException。 - 重试时,Lambda处理消息的时机在有效时间窗口内(或直接使用Lambda自身的IAM角色权限重新生成有效凭证),所以能顺利完成S3操作。
常见触发场景:
- SQS队列消息积压,消息等待处理时长超出5分钟;
- Lambda冷启动耗时过长,从消息入队到实际执行的间隔超出签名有效期;
- 第一次处理时Lambda意外中断,消息回队后滞留时间过长,但重试时处理及时。
优化方案
- 调整SQS消息可见性超时:设置为3分钟以内(短于签名有效期),确保消息在签名失效前被处理;
- 提升Lambda并发能力:如果是并发不足导致积压,增加预留并发数,减少消息等待时长;
- 改用Lambda IAM角色访问S3:放弃使用S3事件附带的签名,直接通过Lambda的IAM权限访问S3,每次请求都会生成有效临时凭证,彻底避开签名过期问题。
内容的提问来源于stack exchange,提问作者Maor agai
相关产品推荐
相关产品推荐

