You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:17:50