使用AWS SDK v3上传文件至S3遇[ERR_SOCKET_CONNECTION_TIMEOUT]超时错误
我使用AWS SDK v3向S3存储桶上传文件,尽管持有有效的IAM凭证,却反复遇到Socket连接超时错误[ERR_SOCKET_CONNECTION_TIMEOUT]。
初始的S3Client初始化代码如下:
const s3 = new S3Client({ region: process.env.AWS_REGION || '', credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID || '', secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || '', }, });
我尝试延长超时时间,但问题仍未解决,修改后的代码:
const s3 = new S3Client({ region: process.env.AWS_REGION || '', credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID || '', secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || '', }, requestHandler: new NodeHttpHandler({ connectionTimeout: 10000, requestTimeout: 10000, }) });
可能的排查方向及解决方法
检查网络连通性与防火墙
确认运行代码的环境能正常访问AWS S3服务。企业内网、VPC或防火墙环境中,需确保允许出站访问S3的443端口。可以通过以下命令测试:telnet <bucket-name>.s3.<region>.amazonaws.com 443 # 或者 curl https://<bucket-name>.s3.<region>.amazonaws.com验证Region配置有效性
确保process.env.AWS_REGION是合法的AWS区域值(如us-east-1、ap-southeast-1),空值会导致SDK无法解析正确的S3端点。可以先硬编码区域测试,排除环境变量读取问题:const s3 = new S3Client({ region: 'ap-southeast-1', // 替换为你的实际区域 credentials: { /* ... */ }, });配置代理(若环境使用代理)
如果系统依赖HTTP/HTTPS代理,SDK不会自动读取系统代理设置,需显式配置:import { NodeHttpHandler } from "@aws-sdk/node-http-handler"; import HttpsProxyAgent from "https-proxy-agent"; const s3 = new S3Client({ region: process.env.AWS_REGION, credentials: { /* ... */ }, requestHandler: new NodeHttpHandler({ httpAgent: new HttpsProxyAgent(process.env.HTTPS_PROXY), connectionTimeout: 10000, requestTimeout: 10000, }), });需先安装依赖:
npm install https-proxy-agent确认IAM权限覆盖范围
即使凭证有效,也要确保IAM用户/角色拥有s3:PutObject权限,且策略明确指定了目标存储桶。可以用AWS CLI验证:aws s3 cp test.txt s3://<your-bucket-name>/test.txt --region <your-region>CLI能成功上传则权限无问题,问题出在SDK配置或环境;CLI失败则需检查IAM策略。
切换HTTP客户端
尝试将默认的NodeHttpHandler替换为FetchHttpHandler(Node.js 18+可直接使用,低版本需安装node-fetch):import { FetchHttpHandler } from "@aws-sdk/fetch-http-handler"; const s3 = new S3Client({ region: process.env.AWS_REGION, credentials: { /* ... */ }, requestHandler: new FetchHttpHandler({ timeout: 10000, }), });排查DNS解析问题
若环境DNS无法解析S3端点,可尝试手动指定DNS服务器,或临时在hosts文件中添加S3端点的IP映射测试。
内容的提问来源于stack exchange,提问作者Amjad sibili

