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

能否用AWS S3 SDK连接本地MinIO?Go代码连接报错求助

使用AWS S3 SDK连接本地MinIO实例失败的解决方法

问题描述

尝试连接Docker中运行的本地MinIO实例,编写Go代码后运行失败,报错无法解析mybucket.localhost主机。

原代码

package main

import (
    "bytes"
    "context"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
    "log"
)

func main() {

    endpoint := "localhost:9000"
    accessKeyID := "1mVyDeEcrRU7qQ7h"
    secretAccessKey := "vNi9SNfcHNxfRDETSvkeFLO210mzu7ee"
    useSSL := false

    awsSession := session.Must(session.NewSession(&aws.Config{
        Region: aws.String("ap-south-1"),
        Credentials: credentials.NewStaticCredentialsFromCreds(credentials.Value{
            AccessKeyID:     accessKeyID,
            SecretAccessKey: secretAccessKey,
            SessionToken:    "",
        }),
        Endpoint:   aws.String(endpoint),
        DisableSSL: aws.Bool(!useSSL),
    }))

    ctx := context.Background()

    file, err := downloadFileFromS3(ctx, awsSession, "mybucket", "data.txt")
    if err != nil {
        log.Fatal(err)
    }

    reader := bytes.NewReader(file)
    println(reader)
}

func downloadFileFromS3(ctx context.Context, sess *session.Session, bucketName string, fileName string) ([]byte, error) {
    downloader := s3manager.NewDownloader(sess)

    buff := &aws.WriteAtBuffer{}
    _, err := downloader.DownloadWithContext(ctx, buff,
        &s3.GetObjectInput{
            Bucket: aws.String(bucketName),
            Key:    aws.String(fileName),
        })
    if err != nil {
        return nil, err
    }

    return buff.Bytes(), nil
}

报错信息

GOROOT=/usr/local/go #gosetup
GOPATH=/Users/kuldeep/go #gosetup
/usr/local/go/bin/go build -o /private/var/folders/29/zkqqp9_d0fscymp5ph4rscl40000gp/T/GoLand/___2go_build_minio_client_example minio-client-example #gosetup
/private/var/folders/29/zkqqp9_d0fscymp5ph4rscl40000gp/T/GoLand/___2go_build_minio_client_example
2023/01/16 22:37:52 RequestError: send request failed
caused by: Get "http://mybucket.localhost:9000/data.txt": dial tcp: lookup mybucket.localhost: no such host

Process finished with the exit code 1

解决方案

报错原因是AWS S3 SDK默认使用虚拟主机样式的请求路径(http://bucket.endpoint/key),但本地DNS未配置mybucket.localhost的解析记录,导致无法找到主机。

只需在AWS Config中添加S3ForcePathStyle: aws.Bool(true),强制SDK使用路径样式的请求路径(http://endpoint/bucket/key),即可解决该问题。

修改后的Session配置代码如下:

awsSession := session.Must(session.NewSession(&aws.Config{
    Region: aws.String("ap-south-1"),
    Credentials: credentials.NewStaticCredentialsFromCreds(credentials.Value{
        AccessKeyID:     accessKeyID,
        SecretAccessKey: secretAccessKey,
        SessionToken:    "",
    }),
    Endpoint:         aws.String(endpoint),
    DisableSSL:       aws.Bool(!useSSL),
    S3ForcePathStyle: aws.Bool(true), // 新增这一行
}))

关于AWS S3 SDK连接MinIO的确认

完全可以使用AWS S3 SDK以编程方式连接MinIO,因为MinIO实现了完整的Amazon S3兼容API,只要配置正确的Endpoint、访问密钥,以及启用路径样式访问(针对本地/私有部署的MinIO),就能和操作S3一样操作MinIO存储。

内容的提问来源于stack exchange,提问作者Kuldeep Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:55:31