AWS SDK JS httpOptions超时间歇性失效问题咨询
AWS SDK JS S3 超时配置疑问解答
问题背景
部署了一个用于读取和分发S3文件的AWS Lambda函数,初始化AWS SDK JS时使用以下配置:
awsS3CustomConfig = { maxRetries: parseInt(1), httpOptions: { timeout: parseInt(1000), }, }
运行中出现两种现象:
- 偶尔会触发超时异常,日志如下:
{"response":{"statusCode":500,"headers":{},"body":"{\"status\":500,\"timestamp\":\"2023-06-12T23:52:40.865Z\",\"description\":\"Connection timed out after 1000ms\",\"message\":\"generalError\",\"subErrors\":[\"TimeoutError\"]}"}}
- 多数情况下,SDK会输出耗时超130秒但返回200状态码的日志:
{"message":"[AWS s3 200 130.776s 1 retries] getObject({\\n Bucket: 'aue1p1z1s3bd*****',\\n Key: 'bright/listing/802315843012.json',\\n VersionId: undefined\\n})"}
存在两个核心疑问:
- 为何SDK在耗时超130秒后仍未触发1秒的超时设置?
- 为何SDK记录200状态码而非抛出超时错误?
解答
疑问1:1秒超时未触发的原因
AWS SDK JS中的httpOptions.timeout是单次HTTP请求的超时时间,而非整个getObject操作的总耗时。当S3处理大文件时会采用分块传输(Transfer-Encoding: chunked),这种场景下超时计时器会在每个数据块到达后重置,不会从请求发起就持续计时。
另外,配置中设置了maxRetries:1,当第一次请求遇到网络波动等问题时,SDK会自动重试一次,两次请求的耗时叠加后,总时长就会远超1秒的单请求超时限制。
疑问2:返回200状态码而非超时错误的原因
日志里的200状态码是S3服务最终返回的响应状态,说明整个请求(包括可能的重试)最终成功完成。总耗时长达130秒是因为请求过程中遇到了网络延迟、S3服务端处理缓慢等情况,但每个单次HTTP请求都在1秒超时内拿到了分块响应数据,没有触发超时错误,等完整接收所有数据后,SDK就记录了成功的200状态码。
而你看到的超时异常,是某次单次HTTP请求完全没有在1秒内收到任何响应数据,触发了httpOptions.timeout,此时SDK抛出超时错误,最终返回500状态码。
内容的提问来源于stack exchange,提问作者Rajesh Kaushik
相关产品推荐
相关产品推荐

