使用AWS SDK V3的@aws-sdk/client-s3遇ENOTFOUND错误求助
AWS SDK V3 for S3 抛出 Error: getaddrinfo ENOTFOUND 问题修复
我在迁移到AWS SDK V3的@aws-sdk/client-s3时遇到了Error: getaddrinfo ENOTFOUND错误,但使用V2版本的代码可以正常从自定义S3兼容存储获取文件。以下是我的V3和V2代码,求解决方法。
原V3报错代码
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'); const { createReadStream } = require('fs'); const sslCertificate = createReadStream('./securityCert.pem'); const s3 = new S3Client({ endpoint: 'https://customeUrl.dummy.net', region: 'us-east-1', service: 's3', credentials: { accessKeyId: 'ACCESS_KEY', secretAccessKey: 'SECURITY_KEY' }, tls: { ca: sslCertificate }, signatureVersion: 'v4', s3ForcePathStyle: true, }); const bucketName = 'bucket_name'; const objectKey = 's3upload123.txt'; const getObjectCommand = new GetObjectCommand({ Bucket: bucketName, Key: objectKey }); s3.send(getObjectCommand) .then(data => { console.log("data", data.Body.toString()); }) .catch(err => { console.error(err); });
可正常运行的V2代码
const AWS = require('aws-sdk'); const fs = require("fs"); const https = require('https'); const sslCertificate = fs.readFileSync('./securityCert.pem'); const s3 = new AWS.S3({ // signatureVersion: 'v4', // region: "us-east-1", accessKeyId: 'ACCESS_KEY', secretAccessKey: 'SECURITY_KEY', endpoint: `https://customeUrl.dummy.net`, s3ForcePathStyle: true, httpOptions: { agent: new https.Agent({ ca: sslCertificate }) } }); const bucketName = 'bucket_name'; const objectKey = 's3upload123.txt'; const getObjectParams = { Bucket: bucketName, Key: objectKey }; s3.getObject(getObjectParams, (err, data) => { if (err) { console.error(err); } else { console.log("data", data.Body.toString()); } });
问题根源与修复方案
你的V3代码存在几处配置错误,导致无法正确解析自定义端点并建立连接:
1. 错误的CA证书配置方式
V3的S3Client不支持顶层的tls配置项,且不能用文件流createReadStream传递CA证书,需要像V2一样用fs.readFileSync读取证书为Buffer,然后通过nodeHttpHandlerOptions配置自定义HTTP Agent。
2. 冗余与错误的配置参数
- V3不需要手动指定
service: 's3',S3Client本身就是针对S3服务的客户端 signatureVersion需要放在signerConfig对象下,而非顶层配置
修正后的V3代码
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'); const fs = require('fs'); const https = require('https'); // 读取证书为Buffer,和V2保持一致 const sslCertificate = fs.readFileSync('./securityCert.pem'); const s3 = new S3Client({ endpoint: 'https://customeUrl.dummy.net', region: 'us-east-1', credentials: { accessKeyId: 'ACCESS_KEY', secretAccessKey: 'SECURITY_KEY' }, // 配置自定义HTTP Agent,包含CA证书 nodeHttpHandlerOptions: { httpsAgent: new https.Agent({ ca: sslCertificate }) }, // 正确配置签名版本 signerConfig: { signatureVersion: 'v4' }, s3ForcePathStyle: true }); const bucketName = 'bucket_name'; const objectKey = 's3upload123.txt'; const getObjectCommand = new GetObjectCommand({ Bucket: bucketName, Key: objectKey }); s3.send(getObjectCommand) .then(data => { console.log("data", data.Body.toString()); }) .catch(err => { console.error(err); });
关键修改点说明
- CA证书处理:用
fs.readFileSync读取证书为Buffer,通过nodeHttpHandlerOptions.httpsAgent传入,和V2的httpOptions.agent逻辑一致 - 移除冗余参数:删除了不必要的
service: 's3'配置 - 修正签名版本配置:将
signatureVersion移至signerConfig对象下,符合V3的配置规范 - 端点解析修复:正确的HTTP Agent配置确保客户端能正确解析自定义端点的SSL证书,避免DNS解析错误
内容的提问来源于stack exchange,提问作者umehta
相关产品推荐
相关产品推荐

