AWS SDK for Java v1からv2へ移行する—AmazonS3ClientからS3Client/S3Presignerへ

AWS SDK for Java v1からv2へ移行するとき、S3との連携コードは大きく変わります。
v1では AmazonS3Client と GeneratePresignedUrlRequest を用いて署名付きURLを生成していましたが、v2では S3Client(同期)や S3AsyncClient(非同期)、そして S3Presigner という専用クラスが存在します。
SDK v2はモジュール化されており、依存ライブラリを必要なものだけに繹れるほか、ビルダー・パターンによる設定が可能です。
移行のメリットと具体的な手順をまとめます。
v1とv2の主な違い
- パッケージの変更
- v1のクラスは
com.amazonaws.services.s3パッケージに含まれていましたが、v2ではsoftware.amazon.awssdk.services.s3に移動しました。
- v1のクラスは
- クライアントの種類
- v1では主に
AmazonS3Clientを使用しましたが、v2では同期用のS3Clientと非同期用のS3AsyncClientが提供されます。
- v1では主に
- 署名付きURLの生成
- v1の
GeneratePresignedUrlRequestに代わり、v2ではS3Presignerを使用します。
- v1の
- 設定方法
- v1では各種設定をビルダーに直接セットしていましたが、v2では
S3Configurationを利用してaccelerateModeEnabled()やpathStyleAccessEnabled()などの詳細設定が可能です。
- v1では各種設定をビルダーに直接セットしていましたが、v2では
依存関係の設定
Gradleを使用している場合、AWS SDK v2は BOM を利用してバージョンをそろえると便利です。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation platform('software.amazon.awssdk:bom:2.25.12') // 最新版を確認してください
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:s3-presigner'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
application.yml ではリージョンやバケット名を定義しておくとサービスクラスで参照しやすくなります。
aws:
region: ap-northeast-1
s3:
bucket: your-bucket-name
v1: AmazonS3Client の例
以下は v1 の AmazonS3Client で署名付きURLを生成する例です。GeneratePresignedUrlRequest を用いて有効期限や HTTP メソッドを指定します。
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withRegion(Regions.AP_NORTHEAST_1)
.build();
public URL generatePresignedPutUrl(String bucketName, String key) {
Date expiration = Date.from(Instant.now().plus(10, ChronoUnit.MINUTES));
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, key)
.withMethod(HttpMethod.PUT)
.withExpiration(expiration);
return s3.generatePresignedUrl(req);
}
v2: S3Client と S3Presigner の例
v2 では S3Client を Bean として注入し、S3Presigner で署名付きURLを作成します。S3Configuration で詳細設定も行えます。
@Configuration
public class AwsConfig {
@Bean
public S3Client s3Client() {
return S3Client.builder()
.region(Region.AP_NORTHEAST_1)
.serviceConfiguration(S3Configuration.builder()
.accelerateModeEnabled(false)
.checksumValidationEnabled(false)
.chunkedEncodingEnabled(true)
.build())
.build();
}
@Bean
public S3Presigner s3Presigner(S3Client s3) {
return S3Presigner.builder()
.region(Region.AP_NORTHEAST_1)
.build();
}
}
署名付きURL発行サービスの例は以下の通りです。
@Service
public class PresignService {
private final S3Presigner presigner;
public PresignService(S3Presigner presigner) {
this.presigner = presigner;
}
public URL generatePresignedPutUrl(String bucket, String key, Duration duration, String contentType) {
PutObjectRequest por = PutObjectRequest.builder()
.bucket(bucket)
.key(key)
.contentType(contentType)
.build();
PutObjectPresignRequest preReq = PutObjectPresignRequest.builder()
.signatureDuration(duration)
.putObjectRequest(por)
.build();
PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(preReq);
return presignedRequest.url();
}
}
移行手順
- 依存関係を更新: v1 用の
aws-java-sdk-s3を削除し、AWS SDK v2 の BOM とs3モジュール、s3-presignerモジュールを追加します。 - インポートの更替え:
com.amazonaws.services.s3.AmazonS3Clientをsoftware.amazon.awssdk.services.s3.S3Clientへ、GeneratePresignedUrlRequestをS3Presignerへ置き換えます。 - クライアント生成:
AmazonS3ClientBuilderをS3Client.builder()やS3AsyncClient.builder()に変更します。 - 署名付きURL処理の更新:
GeneratePresignedUrlRequestからPutObjectPresignRequest、GetObjectPresignRequestなどへ置き換え、S3Presignerで URL を生成します。 - 例外処理の変更: v1 の
AmazonServiceExceptionから v2 のS3Exceptionなどに更替ます。 - テストと検討: 既存機能が v2 でも動作するかをテストし、CORS 設定や署名有効期限、ヘッダーの違いなども確認します。
まとめ
AWS SDK for Java v2 は非同期クライアントやモジュール化による軸量化、粗巡な設定が可能な S3Configuration などの利点があります。移行はクラスの置き換えだけではなく計画の見直しも必要ですが、将来的な保守性や性能向上を考えると価値があります。特に v2 の S3Presigner を使うことで、安全かつ柔軟に署名付きURLを発行できます。段階的に移行を進めながら、新旧両方のクライアントを適切に管理しましょう。
是非フォローしてください
最新の情報をお伝えします
