aws-sdk-java-s3 で minio からオブジェクトを取得する

minio のドキュメント を読みながらちょこちょこ検証したらこれでいいことがわかった。

withPathStyleAccessEnabled(true) が重要だったみたい。

@Grab('com.amazonaws:aws-java-sdk-s3:1.11.788')
 
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration
import com.amazonaws.services.s3.AmazonS3
import com.amazonaws.services.s3.AmazonS3ClientBuilder
import com.amazonaws.services.s3.AmazonS3URI
import com.amazonaws.services.s3.model.S3Object
 
def loadFromS3(String url, OutputStream os) {
 
    try {
        String endpoint = System.env['AWS_S3_ENDPOINT'] ?: System.properties['aws.s3.endpoint'] ?: 'http://localhost'
        String region = System.env['AWS_DEFAULT_REGION'] ?: System.properties['aws.default.region'] ?: 'ap-northeast-1'
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(new EndpointConfiguration(endpoint, region))
            .withPathStyleAccessEnabled(true)
            .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
            .build()
        AmazonS3URI s3Uri = new AmazonS3URI(url)
        s3Client.listObjects(s3Uri.bucket).objectSummaries.each { summary ->
            println(summary.bucketName + '/' + summary.key + ':' + summary.size)
        }
        S3Object o = s3Client.getObject(s3Uri.bucket, s3Uri.key)
        o.objectContent.withCloseable { is ->
            os << is
        }
    } catch (Exception e) {
        println(e.message)
    }
}
 
def src = args[0]
def dst = args[1]
 
new File(dst).withOutputStream { os ->
    loadFromS3(src, os)
}

こんな風に実行した。

env \
AWS_S3_ENDPOINT=http://localhost:9000/ \
AWS_ACCESS_KEY_ID=test \
AWS_SECRET_ACCESS_KEY=test \
groovy s3.groovy s3://testbucket/test.json test.json