如何防止 aws-sdk 将存储桶设置为 IP 地址作为端点的子域

hal*_*alo 2 javascript amazon-s3 node.js aws-sdk

我从一家公司获得了一个对象存储服务,他们使用 aws s3 结构。因此您可以使用为 aws s3 设计的库来连接到该存储(例如用于 python 的 boto3 和用于 javascript 的 aws-sdk 等库)。我使用 aws-sdk。

我需要使用 IP 地址来访问存储,因此我需要将端点设置为其 IP 地址,并且它工作正常。问题是这家公司的文件存储系统与aws有点不同。虽然 aws 使用存储桶名称作为子域,但该公司在文件路径中使用存储桶名称。

aws:bucket.amazon.com
他们的:<-ipaddress->/public/bucket/...

使用 boto3 时效果很好,但是当我使用 aws-sdk 并在参数中设置存储桶时,aws-sdk 将存储桶设置为 IP 地址的子域,并且它不再起作用。

由于它在使用 boto3 时工作正常,我认为它也必须与 aws-sdk 一起工作。所以我正在寻找一种方法来防止 aws-sdk 将存储桶设置为子域并以不同的方式使用它。

    const AWS = require("aws-sdk");
    const ep = new AWS.Endpoint("http://<ip address>");
    global.s3 = new AWS.S3({
      apiVersion: "2006-03-01",
      endpoint: ep,
    }); 
   

    const params = {
          Bucket: `${process.env.AWS_BUCKET}`,
          Prefix: `${_path}`,
        };

    const result = await s3.listObjects(params).promise();

Run Code Online (Sandbox Code Playgroud)

上面代码的结果是这个错误: Inaccessible host: <bucket>.<ip address>. This service may not be available in the us-east-1' region.'

这是正确的,因为该地址不存在。但我该如何解决这个问题。

当我获取存储桶列表并且未设置存储桶时,它工作正常。

hal*_*alo 7

经过三天的寻找答案,终于找到了解决办法。aws s3 有两种处理存储桶的方式。

  1. :在子域中使用它来连接到它

  2. :在对象的路径中使用它

就我而言,我应该使用第二种方法,方法是配置 aws-sdk 并设置s3ForcePathStyle为 true。像这样:AWS.config.s3ForcePathStyle = true;

并解决了问题。