使用 S3 Java SDK 与 S3 兼容存储(minio)通信
Using S3 Java SDK to talk to S3 compatible storage (minio)
我正在尝试使用 aws-sdk-java AwsS3client 与 minio 存储通信。从 CLI 我可以做到:
aws --profile=minioplay --endpoint-url https://play.minio.io:9000 s3 cp logback.xml s3://miniohstest-jixusroqeb --debug
因此使用非默认配置文件和自定义端点。
不确定如何从 java sdk 做到这一点(我能做到吗?)。
我粗略地将上面的 awscli
命令翻译成这个 scala 片段:
val cred = ...
val endpoint = "https://play.minio.io:9000"
val client = AmazonS3ClientBuilder
.standard()
.withCredentials(cred)
.withEndpointConfiguration(
new EndpointConfiguration(
endpoint,
AwsHostNameUtils.parseRegion(endpoint, AmazonS3Client.S3_SERVICE_NAME)
)
)
.build()
使用上述客户端我只能发出非常简单的请求,例如:
client.listBuckets().asScala.foreach(println(_))
有效。但是当我尝试做一些高级的事情时,比如:
val listRequest = new ListObjectsRequest()
.withBucketName("miniohstest-jixusroqeb")
//.withPrefix(r.getURI.getPath)
//.withDelimiter(delimiter)
val res = client.listObjects(listRequest)
res.getObjectSummaries.forEach(x => println(x.getKey))
它抛出以下异常:
Exception in thread "main" com.amazonaws.SdkClientException: Unable to execute HTTP request: miniohstest-jixusroqeb.play.minio.io
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1114)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1064)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
我做错了什么?
我通过设置 withPathStyleAccessEnabled(true)
解决了这个问题。
我正在尝试使用 aws-sdk-java AwsS3client 与 minio 存储通信。从 CLI 我可以做到:
aws --profile=minioplay --endpoint-url https://play.minio.io:9000 s3 cp logback.xml s3://miniohstest-jixusroqeb --debug
因此使用非默认配置文件和自定义端点。
不确定如何从 java sdk 做到这一点(我能做到吗?)。
我粗略地将上面的 awscli
命令翻译成这个 scala 片段:
val cred = ...
val endpoint = "https://play.minio.io:9000"
val client = AmazonS3ClientBuilder
.standard()
.withCredentials(cred)
.withEndpointConfiguration(
new EndpointConfiguration(
endpoint,
AwsHostNameUtils.parseRegion(endpoint, AmazonS3Client.S3_SERVICE_NAME)
)
)
.build()
使用上述客户端我只能发出非常简单的请求,例如:
client.listBuckets().asScala.foreach(println(_))
有效。但是当我尝试做一些高级的事情时,比如:
val listRequest = new ListObjectsRequest()
.withBucketName("miniohstest-jixusroqeb")
//.withPrefix(r.getURI.getPath)
//.withDelimiter(delimiter)
val res = client.listObjects(listRequest)
res.getObjectSummaries.forEach(x => println(x.getKey))
它抛出以下异常:
Exception in thread "main" com.amazonaws.SdkClientException: Unable to execute HTTP request: miniohstest-jixusroqeb.play.minio.io
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1114)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1064)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
我做错了什么?
我通过设置 withPathStyleAccessEnabled(true)
解决了这个问题。