aws-sdk-java-v2を使用してs3からオブジェクトを取得する。
aws-sdk-javaのバージョン2が出ていたので試してみました。 v1と比べて、パッケージ名が変更されていたり、APIがビルダー形式(いわゆる流れるようなインターフェース)になっていたりと微妙に差はありますが、大きく差があるわけではないというのが印象です。 東京リージョンのs3のエンドポイントがきちんととれないというのも従来通り。なんでやねん。
pomには以下のような感じで記載します。group idが変わってます。
<dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ec2</artifactId> <version>2.10.82</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.10.82</version> </dependency> <!-- proxy設定を行う場合は以下を追加する必要がある。 --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> <version>2.10.82</version> <type>jar</type> </dependency> </dependencies>
package dev.megascus.s3access; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Paths; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.core.sync.ResponseTransformer; import software.amazon.awssdk.http.SdkHttpClient; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.http.apache.ProxyConfiguration; public class Main1 { //おまじない() private static final String ENDPOINT_URL = "https://s3-ap-northeast-1.amazonaws.com"; public static void main(String[] args) throws IOException, URISyntaxException { String accessKey = "your_access_key"; String secret = "your_secret_key"; //通常は認証情報をプログラム内では設定しない。環境変数等から指定する。 AwsCredentials credentials = AwsBasicCredentials.create(accessKey, secret); //東京 Region region = Region.AP_NORTHEAST_1; //Proxy設定が必要な場合 ProxyConfiguration proxy = ProxyConfiguration.builder().endpoint(new URI("http://proxy_server_url")).build(); SdkHttpClient client = ApacheHttpClient.builder().proxyConfiguration(proxy).build(); S3Client s3 = S3Client.builder() .region(region) .endpointOverride(new URI(ENDPOINT_URL)) .credentialsProvider(StaticCredentialsProvider.create(credentials)) .httpClient(client) //Proxy設定が必要な場合 .build(); String bucketName = "your-bucket-name"; String fileObjKeyName = "ファイル名"; s3.getObject(GetObjectRequest.builder().bucket(bucketName).key(fileObjKeyName).build(), ResponseTransformer.toFile(Paths.get("c:\\temp", fileObjKeyName))); } }
なんで作り直したのに、わざわざJavaの慣習に従わないパッケージ名に変更したのだろうか・・・・・・
なお、公式ドキュメントでも差分は公開されています。
https://docs.aws.amazon.com/ja_jp/sdk-for-java/v2/migration-guide/whats-different.htmldocs.aws.amazon.com