簡體   English   中英

AWS SDK S3 node.js 連接到本地 MinIO 服務器

[英]AWS SDK S3 node.js connect to local MinIO server

我有一個用 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 SDK - 我想使用 AWS 提供的一個,配置中endpoint參數的存在意味着它應該是可能的>

您需要做的就是將s3ForcePathStyle配置選項設置為true 或者它可以有名稱forcePathStyle 在我的代碼中,我是這樣做的:

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

我知道有一個類似的答案,但它確實解決了我的問題。

我還提供的其他選項:

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

S3 API 的偵聽器端點是端口 9000,9001 用於儀表板,使用 Minio 時也刪除區域,因為我認為 Minio 不需要它。 這樣,sdk 將不會為端點提供前綴“test”。

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

  • 9001 是您訪問 minio 控制台的地方
  • 9000 是服務 S3 API 的那個

運行 minio 時控制台 output

嘗試以下 & 它應該工作

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 區域。

Go 到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,
}),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM