チェックサムによるデータ整合性保護 - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

チェックサムによるデータ整合性保護

Amazon Simple Storage Service (Amazon S3) では、オブジェクトをアップロードするときにチェックサムを指定できます。チェックサムを指定すると、そのチェックサムはオブジェクトとともに保存され、オブジェクトのダウンロード時に検証できます。

チェックサムは、ファイルを転送する際のデータの整合性をさらに強化します。チェックサムを使用すると、受信したファイルが元のファイルと一致することを確認することで、データ整合性を検証できます。Amazon S3 でのチェックサムの詳細については、サポート対象アルゴリズムなど、「Amazon Simple Storage Service ユーザーガイド」を参照してください。

ニーズに最適なアルゴリズムを柔軟に選択して、SDK にチェックサムを計算させることができます。または、サポートされているアルゴリズムのいずれかを使用して、事前に計算された独自のチェックサム値を指定することもできます。

注記

AWS SDK for Java 2.x のバージョン 2.30.0 以降、SDK はアップロードの CRC32 チェックサムを自動的に計算することで、デフォルトの整合性保護を提供します。ユーザーが事前計算されたチェックサム値を指定しない場合、または SDK がチェックサムを計算する際に使用すべきアルゴリズムを指定しない場合、SDK はこのチェックサムを計算します。

SDK には、外部で設定できるデータ整合性保護のグローバル設定も用意されています。詳細については、「AWS SDK とツールリファレンスガイド」を参照してください。

チェックサムについては、オブジェクトのアップロードとオブジェクトのダウンロードという 2 つのリクエストフェーズで説明します。

オブジェクトのアップロード

putObject メソッドでオブジェクトをアップロードし、チェックサムアルゴリズムを指定した場合、SDK は指定したアルゴリズムでチェックサムを計算します。

次のコードスニペットは、SHA256 チェックサムを含むオブジェクトをアップロードするリクエストを示しています。SDK はリクエストを送信すると、SHA256 チェックサムを計算してオブジェクトをアップロードします。Amazon S3 は、チェックサムを計算し、SDK によって提供されるチェックサムと比較することで、コンテンツの整合性を検証します。次に、Amazon S3 はオブジェクトと共にチェックサムを保存します。

public void putObjectWithChecksum() { s3Client.putObject(b -> b .bucket(bucketName) .key(key) .checksumAlgorithm(ChecksumAlgorithm.SHA256), RequestBody.fromString("This is a test")); }

リクエストでチェックサムアルゴリズムを指定しない場合、チェックサムの動作は、次の表に示すように、使用する SDK のバージョンによって異なります。

チェックサムアルゴリズムが指定されていない場合のチェックサムの動作

Java SDK バージョン チェックサムの動作
2.30.0 より前 SDK は、CRC ベースのチェックサムを自動的に計算してリクエストに含めることはありません。
2.30.0 以降

SDK は、CRC32 アルゴリズムを使用してチェックサムを計算し、リクエストに含めます。Amazon S3 は、独自の CRC32 チェックサムを計算して転送の整合性を検証し、SDK が提供するチェックサムと比較します。チェックサムが一致した場合、チェックサムはオブジェクトとともに保存されます。

事前に計算されたチェックサム値を使用してください。

リクエストで事前に計算されたチェックサム値を指定すると、SDK による自動計算が無効になり、代わりに提供された値が使用されます。

次の例は、事前に計算された SHA256 チェックサムを含むリクエストを示しています。

public void putObjectWithPrecalculatedChecksum(String filePath) { String checksum = calculateChecksum(filePath, "SHA-256"); s3Client.putObject((b -> b .bucket(bucketName) .key(key) .checksumSHA256(checksum)), RequestBody.fromFile(Paths.get(filePath))); }

Amazon S3 が、指定されたアルゴリズムのチェックサム値が正しくないと判断した場合、サービスはエラーレスポンスを返します。

マルチパートアップロード

チェックサムはマルチパートアップロードでも使用できます。

SDK for Java 2.x には、マルチパートアップロードでチェックサムを使用する 2 つのオプションがあります。最初のオプションでは S3TransferManager を使用します。

次の転送マネージャーの例では、アップロードに SHA1 アルゴリズムを指定しています。

public void multipartUploadWithChecksumTm(String filePath) { S3TransferManager transferManager = S3TransferManager.create(); UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(b -> b .bucket(bucketName) .key(key) .checksumAlgorithm(ChecksumAlgorithm.SHA1)) .source(Paths.get(filePath)) .build(); FileUpload fileUpload = transferManager.uploadFile(uploadFileRequest); fileUpload.completionFuture().join(); transferManager.close(); }

アップロードで Transfer Manager を使用する際にチェックサムアルゴリズムを指定しない場合、SDK は CRC32 アルゴリズムに基づいてチェックサムを自動的に計算します。SDK は、SDK のすべてのバージョンに対してこの計算を実行します。

2 つ目のオプションは S3ClientAPI (または S3AsyncClientAPI) を使用してマルチパートアップロードを実行します。このアプローチでチェックサムを指定する場合は、アップロードの開始時に使用するアルゴリズムを指定する必要があります。また、パートリクエストごとにアルゴリズムを指定し、アップロード後にパートごとに計算されたチェックサムを指定する必要があります。

public void multipartUploadWithChecksumS3Client(String filePath) { ChecksumAlgorithm algorithm = ChecksumAlgorithm.CRC32; // Initiate the multipart upload. CreateMultipartUploadResponse createMultipartUploadResponse = s3Client.createMultipartUpload(b -> b .bucket(bucketName) .key(key) .checksumAlgorithm(algorithm)); // Checksum specified on initiation. String uploadId = createMultipartUploadResponse.uploadId(); // Upload the parts of the file. int partNumber = 1; List<CompletedPart> completedParts = new ArrayList<>(); ByteBuffer bb = ByteBuffer.allocate(1024 * 1024 * 5); // 5 MB byte buffer try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) { long fileSize = file.length(); long position = 0; while (position < fileSize) { file.seek(position); long read = file.getChannel().read(bb); bb.flip(); // Swap position and limit before reading from the buffer. UploadPartRequest uploadPartRequest = UploadPartRequest.builder() .bucket(bucketName) .key(key) .uploadId(uploadId) .checksumAlgorithm(algorithm) // Checksum specified on each part. .partNumber(partNumber) .build(); UploadPartResponse partResponse = s3Client.uploadPart( uploadPartRequest, RequestBody.fromByteBuffer(bb)); CompletedPart part = CompletedPart.builder() .partNumber(partNumber) .checksumCRC32(partResponse.checksumCRC32()) // Provide the calculated checksum. .eTag(partResponse.eTag()) .build(); completedParts.add(part); bb.clear(); position += read; partNumber++; } } catch (IOException e) { System.err.println(e.getMessage()); } // Complete the multipart upload. s3Client.completeMultipartUpload(b -> b .bucket(bucketName) .key(key) .uploadId(uploadId) .multipartUpload(CompletedMultipartUpload.builder().parts(completedParts).build())); }

完全な例テストのコードは、GitHub のコードサンプルリポジトリにあります。

オブジェクトのダウンロード

getObject メソッドを使用してオブジェクトをダウンロードすると、SDK は GetObjectRequest のビルダーの checksumMode のメソッドが ChecksumMode.ENABLED に設定されている場合にチェックサムを自動的に検証します。

次のスニペット内のリクエストは、チェックサムを計算して値を比較することでレスポンス内のチェックサムを検証するよう SDK に指示します。

public GetObjectResponse getObjectWithChecksum() { return s3Client.getObject(b -> b .bucket(bucketName) .key(key) .checksumMode(ChecksumMode.ENABLED)) .response(); }
注記

オブジェクトがチェックサム付きでアップロードされなかった場合、検証は行われません。

その他のチェックサム計算オプション

注記

送信データの整合性を検証し、送信エラーを検出するために、チェックサム計算オプションについては SDK のデフォルト設定を維持することをお勧めします。デフォルトでは、SDK は PutObjectGetObject を含む多くの S3 オペレーションに対して、この重要なチェックを追加します。

ただし、Amazon S3 の使用で最小限のチェックサム検証しか必要としない場合は、デフォルトの設定を変更することで、多くのチェックを無効にできます。

必須でない場合に自動チェックサム計算を無効にする

SDK がサポートするオペレーション(例:PutObjectGetObject)に対して、自動チェックサム計算を無効にできます。ただし、一部の S3 オペレーションではチェックサムの計算が必須であり、これらのオペレーションではチェックサム計算を無効にすることはできません。

SDK は、リクエストのペイロード用チェックサムの計算と、レスポンスのペイロード用チェックサムの計算をそれぞれ個別の設定として提供します。

次のリストでは、さまざまな範囲でのチェックサム計算を最小限に抑えるために使用できる設定について説明します。

  • すべてのアプリケーション範囲 — 環境変数または共有 AWS config および credentials ファイル内のプロファイルの設定を変更することで、すべてのアプリケーションがこれらの設定を使用できます。これらの設定は、アプリケーションまたはサービスクライアントの範囲で上書きされない限り、すべての AWS SDK アプリケーションのすべてのサービスクライアントに影響します。

    • プロファイルで設定を追加します。

      [default] request_checksum_calculation = WHEN_REQUIRED response_checksum_validation = WHEN_REQUIRED
    • 環境変数を追加します。

      AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED AWS_RESPONSE_CHECKSUM_VALIDATION=WHEN_REQUIRED
  • 現在のアプリケーション範囲 — Java システムプロパティ aws.requestChecksumCalculationWHEN_REQUIRED に設定して、チェックサムの計算を制限できます。レスポンスの対応するシステムプロパティは aws.responseChecksumValidation です。

    これらの設定は、サービスクライアントの作成中に上書きされない限り、アプリケーション内のすべての SDK サービスクライアントに影響します。

    アプリケーションの開始時にシステムプロパティを設定します。

    import software.amazon.awssdk.core.SdkSystemSetting; import software.amazon.awssdk.core.checksums.RequestChecksumCalculation; import software.amazon.awssdk.core.checksums.ResponseChecksumValidation; import software.amazon.awssdk.services.s3.S3Client; class DemoClass { public static void main(String[] args) { System.setProperty(SdkSystemSetting.AWS_REQUEST_CHECKSUM_CALCULATION.property(), // Resolves to "aws.requestChecksumCalculation". "WHEN_REQUIRED"); System.setProperty(SdkSystemSetting.AWS_RESPONSE_CHECKSUM_VALIDATION.property(), // Resolves to "aws.responseChecksumValidation". "WHEN_REQUIRED"); S3Client s3Client = S3Client.builder().build(); // Use s3Client. } }
  • 単一の S3 サービスクライアント範囲 — ビルダーメソッドを使用して、最小量のチェックサムを計算するように単一の S3 サービスクライアントを設定できます。

    import software.amazon.awssdk.core.checksums.RequestChecksumCalculation; import software.amazon.awssdk.services.s3.S3Client; public class RequiredChecksums { public static void main(String[] args) { S3Client s3 = S3Client.builder() .requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED) .responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED) .build(); // Use s3Client. } // ... }

LegacyMd5Plugin を使用した MD5 との互換性の簡素化

バージョン 2.30.0 での CRC32 チェックサム動作のリリースに加えて、SDK は必要なオペレーションの MD5 チェックサムの計算を停止しました。

S3 オペレーションにレガシーの MD5 チェックサム動作が必要な場合は、 SDK のバージョン 2.31.32 でリリースされた LegacyMd5Plugin を使用できます。

LegacyMd5Plugin は、レガシー MD5 チェックサムの動作に依存するアプリケーションとの互換性を維持する必要がある場合、特に S3A ファイルシステムコネクタで使用されるようなサードパーティの S3 互換ストレージプロバイダーを使用する場合に特に便利です (Apache Spark、Iceberg) 。

LegacyMd5Plugin を使用するには、S3 クライアントビルダーに追加します。

// For synchronous S3 client. S3Client s3Client = S3Client.builder() .addPlugin(LegacyMd5Plugin.create()) .build(); // For asynchronous S3 client. S3AsyncClient asyncClient = S3AsyncClient.builder() .addPlugin(LegacyMd5Plugin.create()) .build();

チェックサムが必要なオペレーションに MD5 チェックサムを追加し、チェックサムをサポートしているが必須ではないオペレーションに対しては SDK デフォルトチェックサムの追加をスキップする場合は、ClientBuilder オプション requestChecksumCalculation および responseChecksumValidationWHEN_REQUIRED として有効にできます。これにより、SDK のデフォルトのチェックサムのみが、チェックサムを必要とするオペレーションに追加されます。

// Use the `LegacyMd5Plugin` with `requestChecksumCalculation` and `responseChecksumValidation` set to WHEN_REQUIRED. S3AsyncClient asyncClient = S3AsyncClient.builder() .addPlugin(LegacyMd5Plugin.create()) .requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED) .responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED) .build();

この設定は、新しいチェックサムアルゴリズムを完全にはサポートしていないものの、特定のオペレーションに MD5 チェックサムが必要なサードパーティーの S3 互換ストレージシステムを使用する場合に特に便利です。