|

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

AWS SDK for Java v1からv2への移行イメージ図【AmazonS3ClientからS3Client/S3Presignerへ】

AWS SDK for Java v1からv2へ移行するとき、S3との連携コードは大きく変わります。
v1では AmazonS3ClientGeneratePresignedUrlRequest を用いて署名付きURLを生成していましたが、v2では S3Client(同期)や S3AsyncClient(非同期)、そして S3Presigner という専用クラスが存在します。
SDK v2はモジュール化されており、依存ライブラリを必要なものだけに繹れるほか、ビルダー・パターンによる設定が可能です。
移行のメリットと具体的な手順をまとめます。

v1とv2の主な違い

  • パッケージの変更
    • v1のクラスは com.amazonaws.services.s3 パッケージに含まれていましたが、v2では software.amazon.awssdk.services.s3 に移動しました。
  • クライアントの種類
    • v1では主に AmazonS3Client を使用しましたが、v2では同期用の S3Client と非同期用の S3AsyncClient が提供されます。
  • 署名付きURLの生成
    • v1の GeneratePresignedUrlRequest に代わり、v2では S3Presigner を使用します。
  • 設定方法
    • v1では各種設定をビルダーに直接セットしていましたが、v2では S3Configuration を利用して accelerateModeEnabled()pathStyleAccessEnabled() などの詳細設定が可能です。

依存関係の設定

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();
    }
}

移行手順

  1. 依存関係を更新: v1 用の aws-java-sdk-s3 を削除し、AWS SDK v2 の BOM と s3 モジュール、s3-presigner モジュールを追加します。
  2. インポートの更替えcom.amazonaws.services.s3.AmazonS3Clientsoftware.amazon.awssdk.services.s3.S3Client へ、GeneratePresignedUrlRequestS3Presigner へ置き換えます。
  3. クライアント生成AmazonS3ClientBuilderS3Client.builder()S3AsyncClient.builder() に変更します。
  4. 署名付きURL処理の更新GeneratePresignedUrlRequest から PutObjectPresignRequestGetObjectPresignRequest などへ置き換え、S3Presigner で URL を生成します。
  5. 例外処理の変更: v1 の AmazonServiceException から v2 の S3Exception などに更替ます。
  6. テストと検討: 既存機能が v2 でも動作するかをテストし、CORS 設定や署名有効期限、ヘッダーの違いなども確認します。

まとめ

AWS SDK for Java v2 は非同期クライアントやモジュール化による軸量化、粗巡な設定が可能な S3Configuration などの利点があります。移行はクラスの置き換えだけではなく計画の見直しも必要ですが、将来的な保守性や性能向上を考えると価値があります。特に v2 の S3Presigner を使うことで、安全かつ柔軟に署名付きURLを発行できます。段階的に移行を進めながら、新旧両方のクライアントを適切に管理しましょう。

是非フォローしてください

最新の情報をお伝えします

類似投稿