能否用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
相关产品推荐
相关产品推荐

