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

github

github.com

maven

mvnrepository.com