Chargement d'archives volumineuses en plusieurs parties à l'aide du kit SDK Amazon pour Java - Amazon S3 Glacier

Cette page est réservée aux clients existants du service S3 Glacier utilisant Vaults et l'original REST API de 2012.

Si vous recherchez des solutions de stockage d'archives, nous vous conseillons d'utiliser les classes de stockage S3 Glacier dans Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval et S3 Glacier Deep Archive. Pour en savoir plus sur ces options de stockage, consultez les sections Classes de stockage S3 Glacier et Stockage de données à long terme à l'aide des classes de stockage S3 Glacier dans le guide de l'utilisateur Amazon S3. Ces classes de stockage utilisent Amazon S3API, sont disponibles dans toutes les régions et peuvent être gérées au sein de la console Amazon S3. Ils offrent des fonctionnalités telles que l'analyse des coûts de stockage, Storage Lens, des fonctionnalités de chiffrement optionnelles avancées, etc.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Chargement d'archives volumineuses en plusieurs parties à l'aide du kit SDK Amazon pour Java

Les API de haut et bas niveau fournies par le kit SDK Amazon pour Java proposent une méthode permettant de charger une archive volumineuse (voir Chargement d'une archive dans Amazon S3 Glacier).

  • L'API de haut niveau fournit une méthode que vous pouvez utiliser pour charger des archives de n'importe quelle taille. Selon le fichier que vous chargez, la méthode charge l'archive en une seule opération ou utilise le chargement partitionné pris en charge par Amazon S3 Glacier (S3 Glacier) de façon à charger l'archive en plusieurs parties.

  • L'API de bas niveau est mappée étroitement à l'implémentation REST sous-jacente. Par conséquent, elle fournit une méthode pour charger des archives plus petites en une seule opération et un groupe de méthodes qui prennent en charge le chargement partitionné en plusieurs parties pour les archives plus volumineuses. Cette section explique le chargement des archives volumineuses en plusieurs parties à l'aide de l'API de bas niveau.

Pour plus d'informations sur les API de haut niveau et de bas niveau, consultez Utilisation d'AWS SDK for Java avec Amazon S3 Glacier.

Chargement d'archives volumineuses en plusieurs parties à l'aide de l'API de haut niveau du kit AWS SDK for Java

Vous utilisez les mêmes méthodes de l'API de haut niveau pour charger les archives petites ou volumineuses. Selon la taille de l'archive, les méthodes d'API de haut niveau décident de charger l'archive en une seule opération ou d'utiliser l'API de chargement partitionné fournie par S3 Glacier. Pour de plus amples informations, veuillez consulter Chargement d'une archive à l'aide de l'API de haut niveau du kit AWS SDK for Java.

Chargement d'archives volumineuses en plusieurs parties à l'aide de l'API de bas niveau du kit AWS SDK for Java

Pour bénéficier d'un contrôle précis du chargement, vous pouvez utiliser l'API de bas niveau afin de configurer la demande et traiter la réponse. Voici les étapes pour charger des archives volumineuses en plusieurs parties à l'aide du kit AWS SDK for Java.

  1. Créez une instance de la classe AmazonGlacierClient (le client).

    Vous devez spécifier la région AWS dans laquelle vous souhaitez enregistrer l'archive. Toutes les opérations que vous effectuez à l'aide de ce client s'appliquent à cette région AWS.

  2. Lancez un téléchargement partitionné en appelant la méthode initiateMultipartUpload.

    Vous devez fournir le nom du coffre dans lequel vous souhaitez charger l'archive, spécifier la taille des parties de l'archive à charger et indiquer éventuellement une description. Vous fournissez ces informations en créant une instance de la classe InitiateMultipartUploadRequest. En réponse, S3 Glacier renvoie un ID de chargement.

  3. Chargez les parties en appelant la méthode uploadMultipartPart.

    Pour chaque partie que vous chargez, vous devez fournir le nom du coffre, la plage d'octets dans l'archive assemblée finale qui sera chargée dans cette partie, le total de contrôle des données de la partie et l'ID du chargement.

  4. Terminez le chargement partitionné en appelant la méthode completeMultipartUpload.

    Vous devez fournir l'ID de chargement, le total de contrôle de l'archive entière, la taille de l'archive (taille combinée de toutes les parties que avez chargées) et le nom du coffre. S3 Glacier construit l'archive à partir des parties chargées et renvoie un ID d'archive.

Exemple : Chargement d'une archive volumineuse en plusieurs parties à l'aide du kit AWS SDK for Java

L'exemple de code Java suivant utilise le kit AWS SDK for Java pour charger une archive dans un coffre (examplevault). Pour obtenir les instructions étape par étape permettant d'exécuter cet exemple, consultez la section Exécution d'exemples Java pour Amazon S3 Glacier en utilisant Eclipse. Vous devez mettre à jour le code tel qu'il est présenté avec le nom du fichier que vous souhaitez charger.

Note

Cet exemple concerne des tailles de partie comprises entre 1 Mo et 1 Go. Toutefois, S3 Glacier prend en charge les tailles de parties ne dépassant pas 4 Go.

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