Amazon SDK for Java を使用してパート単位で大きなアーカイブをアップロードする - Amazon S3 Glacier

このページは、ボールトと 2012 RESTAPI年のオリジナルを使用する S3 Glacier サービスの既存のお客様のみを対象としています。

アーカイブストレージソリューションをお探しの場合は、Amazon S3、S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive の S3 Glacier ストレージクラスを使用することをお勧めします。これらのストレージオプションの詳細については、「Amazon S3 ユーザーガイド」の「S3 Glacier ストレージクラス」およびS3 Glacier ストレージクラスを使用した長期データストレージ」を参照してください。 Amazon S3 これらのストレージクラスは Amazon S3 を使用しAPI、すべてのリージョンで利用でき、Amazon S3 コンソール内で管理できます。Storage Cost Analysis、Storage Lens、高度なオプションの暗号化機能などを提供します。

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

Amazon SDK for Java を使用してパート単位で大きなアーカイブをアップロードする

両方高レベル API と低レベル APIJava 版 Amazon SDK for Java で提供されている、大きなアーカイブをアップロードするためのメソッドがあります (「」Amazon S3 Glacier へのアーカイブのアップロード)。

  • 高レベル API には、どのサイズのアーカイブのアップロードにも使用できるメソッドが用意されています。このメソッドは、アップロードするファイルに応じて、単一オペレーションでアーカイブをアップロードするか、Amazon S3 Glacier(S3 Glacier) のマルチパートアップロードのサポートを使用してパート単位でアーカイブをアップロードします。

  • 低レベル API は、基本となる REST 実装にほぼ対応しています。つまり、1 回のオペレーションで小さいアーカイブをアップロードするメソッド、および大きなアーカイブに対してマルチパートアップロードをサポートするメソッドのグループが用意されています。このセクションでは、低レベル API を使用してパート単位で大きなアーカイブをアップロードする方法について説明します。

高レベル API と低レベル API の詳細については、「Amazon S3 Glacier でのAWS SDK for Javaの使用」を参照してください。

AWS SDK for Java の高レベル API を使用してパート単位で大きなアーカイブをアップロードする

高レベル API の同じメソッドを使用して、小さいアーカイブまたは大きなアーカイブをアップロードします。高レベル API メソッドでは、アーカイブのサイズに基づいて、アーカイブを 1 回のオペレーションでアップロードするか、S3 Glacier に用意されているマルチパートアップロード API を使用するかを決定します。詳細については、「AWS SDK for Java の高レベル API を使用してアーカイブをアップロードする」を参照してください。

AWS SDK for Java の低レベル API を使用してパート単位で大きなアーカイブをアップロードする

アップロードを細かく制御するために、低レベル API を使用して、リクエストの設定やレスポンスの処理を行うことができます。以下に、AWS SDK for Java を使用してパート単位で大きなアーカイブをアップロードする手順を示します。

  1. AmazonGlacierClient クラスのインスタンス(クライアント)を作成します。

    アーカイブの保存先となる AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、そのAWSリージョンに適用されます。

  2. initiateMultipartUpload メソッドを呼び出し、マルチパートアップロードを開始します。

    アーカイブのアップロード先となるボールト名、アーカイブのパートをアップロードするために使用するパートサイズ、およびオプションの説明を指定する必要があります。この情報は、InitiateMultipartUploadRequest クラスのインスタンスを作成することによって指定します。S3 Glacier により、レスポンスとしてアップロード ID が返されます。

  3. uploadMultipartPart メソッドを呼び出し、パートをアップロードします。

    アップロードするパートごとに、ボールト名、このパートでアップロードされる最終的にアセンブルされたアーカイブ内のバイト範囲、パートデータのチェックサム、およびアップロード ID を指定する必要があります。

  4. completeMultipartUpload メソッドを呼び出し、マルチパートアップロードを完了します。

    アップロード ID、アーカイブ全体のチェックサム、アーカイブのサイズ (アップロードしたすべてのパートを組み合わせたサイズ)、およびボールト名を指定する必要があります。S3 Glacier は、アップロードされたパートからアーカイブを構築し、アーカイブ ID を返します。

例: AWS SDK for Java を使用してパート単位で大きなアーカイブをアップロードする

以下の Java コード例では、AWS SDK for Java を使用してボールト (examplevault) にアーカイブをアップロードします。この例を実行するための詳しい手順については、「Eclipse を使用した Amazon S3 Glacier の Java 実行例」を参照してください。ここに示したコードは、アップロードするファイルの名前で更新する必要があります。

注記

この例は、1 MB~1 GB のパートサイズに対して有効です。ただし、S3 Glacier では 4 GB までのパートサイズをサポートしています。

import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.glacier.AmazonGlacierClient; import com.amazonaws.services.glacier.TreeHashGenerator; import com.amazonaws.services.glacier.model.CompleteMultipartUploadRequest; import com.amazonaws.services.glacier.model.CompleteMultipartUploadResult; import com.amazonaws.services.glacier.model.InitiateMultipartUploadRequest; import com.amazonaws.services.glacier.model.InitiateMultipartUploadResult; import com.amazonaws.services.glacier.model.UploadMultipartPartRequest; import com.amazonaws.services.glacier.model.UploadMultipartPartResult; import com.amazonaws.util.BinaryUtils; public class ArchiveMPU { public static String vaultName = "examplevault"; // This example works for part sizes up to 1 GB. public static String partSize = "1048576"; // 1 MB. public static String archiveFilePath = "*** provide archive file path ***"; public static AmazonGlacierClient client; public static void main(String[] args) throws IOException { ProfileCredentialsProvider credentials = new ProfileCredentialsProvider(); client = new AmazonGlacierClient(credentials); client.setEndpoint("https://glacier.us-west-2.amazonaws.com/"); try { System.out.println("Uploading an archive."); String uploadId = initiateMultipartUpload(); String checksum = uploadParts(uploadId); String archiveId = CompleteMultiPartUpload(uploadId, checksum); System.out.println("Completed an archive. ArchiveId: " + archiveId); } catch (Exception e) { System.err.println(e); } } private static String initiateMultipartUpload() { // Initiate InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest() .withVaultName(vaultName) .withArchiveDescription("my archive " + (new Date())) .withPartSize(partSize); InitiateMultipartUploadResult result = client.initiateMultipartUpload(request); System.out.println("ArchiveID: " + result.getUploadId()); return result.getUploadId(); } private static String uploadParts(String uploadId) throws AmazonServiceException, NoSuchAlgorithmException, AmazonClientException, IOException { int filePosition = 0; long currentPosition = 0; byte[] buffer = new byte[Integer.valueOf(partSize)]; List<byte[]> binaryChecksums = new LinkedList<byte[]>(); File file = new File(archiveFilePath); FileInputStream fileToUpload = new FileInputStream(file); String contentRange; int read = 0; while (currentPosition < file.length()) { read = fileToUpload.read(buffer, filePosition, buffer.length); if (read == -1) { break; } byte[] bytesRead = Arrays.copyOf(buffer, read); contentRange = String.format("bytes %s-%s/*", currentPosition, currentPosition + read - 1); String checksum = TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(bytesRead)); byte[] binaryChecksum = BinaryUtils.fromHex(checksum); binaryChecksums.add(binaryChecksum); System.out.println(contentRange); //Upload part. UploadMultipartPartRequest partRequest = new UploadMultipartPartRequest() .withVaultName(vaultName) .withBody(new ByteArrayInputStream(bytesRead)) .withChecksum(checksum) .withRange(contentRange) .withUploadId(uploadId); UploadMultipartPartResult partResult = client.uploadMultipartPart(partRequest); System.out.println("Part uploaded, checksum: " + partResult.getChecksum()); currentPosition = currentPosition + read; } fileToUpload.close(); String checksum = TreeHashGenerator.calculateTreeHash(binaryChecksums); return checksum; } private static String CompleteMultiPartUpload(String uploadId, String checksum) throws NoSuchAlgorithmException, IOException { File file = new File(archiveFilePath); CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest() .withVaultName(vaultName) .withUploadId(uploadId) .withChecksum(checksum) .withArchiveSize(String.valueOf(file.length())); CompleteMultipartUploadResult compResult = client.completeMultipartUpload(compRequest); return compResult.getLocation(); } }