AWS SDK S3 node.js连接到本地MinIO服务器



我有一个用Node.js编写的应用服务器,它将文件上传到AWS S3存储。为此,我使用https://www.npmjs.com/package/aws-sdk,当我连接并上传到我的AWS生产存储时,它工作正常。但是在开发过程中,我想将文件上传到本地MinIO服务器(从docker映像创建https://hub.docker.com/r/minio/minio/):

)
docker run -p 9000:9000 -p 9001:9001 
quay.io/minio/minio server /minio --console-address ":9001"

MinIO服务器本身工作良好,我能够在本地登录,创建桶等。然而,当我试图使用AWS SDK为node.js上传文件到我的本地MinIO存储时,我无法这样做:

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
#s3Client = new S3Client({
credentials: {
accessKeyId: config.getAwsStorageAccessKeyId(), // from env variables
secretAccessKey: config.getAwsStorageSecretAccessKey(),
},
...(globalConfig.isReleaseVersion() && {
endpoint: config.getAwsStorageEndpoint(), // from env "http://localhost:9001"
}),
});

之后我尝试上传object:

await this.#s3Client.send(new PutObjectCommand({
Bucket: config.getAwsStorageWebflowBucketName(), // from env "test" value
Key: 'example.json',
Body: body, // a buffer
}));

我收到错误:

ERROR EndpointError: Custom endpoint `test.127.0.0.1://9001/` was not a valid URI

但是我能够从我的浏览器到达地址http://test.localhost:9001/。当我试图直接传递值'http://localhost:9001/'作为S3Client配置的端点时,我得到错误:

ERROR Error: getaddrinfo ENOTFOUND test.localhost

看起来端口值被忽略我的SDK。如何解决这个问题?

<是的,我知道有单独的MinIO>

您需要做的就是将s3ForcePathStyle配置选项设置为true。或者(在sdk V3中)它可以命名为forcePathStyle。在我的代码中,我是这样做的:

const awsConfig: S3.Types.ClientConfiguration = {
s3ForcePathStyle: true
};

我知道有一个类似的答案,但它确实解决了我的问题。

我还提供了其他选项:

sslEnabled: false
endpoint: http://localhost:port/
accessKeyId: dummy
secretAccessKey: dummydummy

http://localhost:9001不是正确的URL

  • 9001是您访问minio控制台的目录
  • 9000是提供S3 API的接口

运行minio时的控制台输出

试着跟着&它应该可以工作

const s3Client = new S3Client({
region: "region_set_in_minio",
credentials: {
accessKeyId: "minio_access_key",
secretAccessKey: "minio_secret_access_key",
},
endpoint: "http://127.0.0.1:9000",
});

您可以从minio控制台设置minio区域。

转到Administrator -> Settings -> Region

更改minio区域

您是否尝试过选项" s3forcepathstyle ";? 我必须使用这个配置才能使它在本地环境下工作

options.s3ForcePathStyle = true 

看到https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html s3ForcePathStyle-property

在你的代码中
...(globalConfig.isReleaseVersion() && {
endpoint: config.getAwsStorageEndpoint(), // from env "http://localhost:9001",
s3ForcePathStyle: true,
}),

S3 API的侦听器端点是端口9000,9001是仪表板,使用Minio时也删除区域,因为我认为Minio不需要它。这样,SDK将不会为端点提供前缀'test'。

我在这里看到了正确的答案(@gladix和@p2t2p -当然我已经点赞了)。但是我认为我们应该把它写得更清楚一些:

AWS SDK V3

在问题中我看到:

import { S3Client } from '@aws-sdk/client-s3';

这意味着他使用了AWS SDK的V3版本。这一点很重要,因为在V3中传递给客户端的构造函数的配置类型是S3ClientConfig

import { S3ClientConfig } from "@aws-sdk/client-s3";

这里有一个成员forcePathStyle: boolean

AWS SDK V2

然而,如果用户使用V2(如import * as AWS from 'aws-sdk'),则传递给客户端的构造函数的配置是不同类型的ClientConfiguration

import { ClientConfiguration } from "aws-sdk/clients/s3";

这里有一个成员s3ForcePathStyle: boolean

希望这能让事情更清楚:)

相关内容

  • 没有找到相关文章

最新更新