使用 S3 Java SDK 与 S3 兼容存储通信 (minio)

Posted

技术标签:

【中文标题】使用 S3 Java SDK 与 S3 兼容存储通信 (minio)【英文标题】:Using S3 Java SDK to talk to S3 compatible storage (minio) 【发布时间】:2018-08-26 05:12:06 【问题描述】:

我正在尝试使用 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 sn-p:

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)

我做错了什么?

【问题讨论】:

【参考方案1】:

我通过设置withPathStyleAccessEnabled(true)解决了这个问题。

【讨论】:

以上是关于使用 S3 Java SDK 与 S3 兼容存储通信 (minio)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java SDK 将目录与 AWS S3 同步?

如何使用 IAM 角色通过 aws sdk (java) 从 ECS 容器调用 s3 存储桶

如何使用scala和aws-java-sdk从S3存储桶中获取所有S3ObjectSummary?

如何使用aws java sdk将文件从S3存储桶从一个区域复制到另一个区域?

如何使用 aws-sdk 将文件同步上传到 S3?

AWS php sdk 用于即时写入 s3 存储桶