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