이 페이지는 볼트와 2012년의 원래 REST API를 사용하는 Amazon Glacier 서비스의 기존 고객에게만 해당됩니다.
아카이브 스토리지 솔루션을 찾고 있다면 Amazon Glacier Amazon S3, S3 Glacier Flexible Retrieval 및 S3S3 Glacier Deep Archive의 Amazon Glacier 스토리지 클래스를 사용하는 것이 좋습니다. 이러한 스토리지 옵션에 대한 자세한 내용은 Amazon Glacier 스토리지 클래스
Amazon Glacier(기존 독립 실행형 볼트 기반 서비스)는 2025년 12월 15일부터 기존 고객에게 영향을 주지 않고 더 이상 신규 고객을 받지 않습니다. Amazon Glacier는 데이터를 볼트에 저장하고 Amazon S3 및 Amazon S3 Glacier 스토리지 클래스와 구별되는 자체 APIs가 있는 독립 실행형 서비스입니다. 기존 데이터는 Amazon Glacier에서 무기한으로 안전하고 액세스할 수 있습니다. 마이그레이션이 필요하지 않습니다. 저비용 장기 아카이브 스토리지의 경우는 S3 버킷 기반 API, 전체 가용성, 저렴한 비용 및 서비스 통합을 통해 우수한 고객 경험을 제공하는 Amazon S3 Glacier 스토리지 클래스
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon SDK for Java를 사용하여 대용량 아카이브를 파트로 나누어 업로드
Amazon SDK for Java에서 제공하는 하이레벨 및 로우레벨 API 둘 모두는 대규모 아카이브를 업로드하는 방법을 제공합니다(Amazon Glacier에서 아카이브 업로드 섹션 참조).
-
고레벨 API는 모든 크기의 아카이브를 업로드하는 데 사용할 수 있는 메서드를 제공합니다. 업로드하는 파일에 따라 메서드는 아카이브를 단일 작업으로 업로드하거나 Amazon Glacier(Amazon Glacier)의 멀티파트 업로드 지원을 사용하여 아카이브를 여러 부분으로 나누어 업로드합니다.
-
저레벨 API는 기본 REST 구현체에 가깝게 매핑합니다. 따라서 더욱 작은 크기의 아카이브를 단일 작업으로 업로드하는 메서드를 제공하거나, 혹은 대용량 아카이브의 경우 멀티파트 업로드를 지원하는 메서드 그룹을 제공합니다. 이번 단원에서는 저레벨 API를 사용하는 대용량 아카이브의 멀티파트 업로드에 대해서 설명합니다.
고레벨 및 저레벨 API에 대한 자세한 내용은 Amazon Glacier AWS SDK for Java 에서 사용 단원을 참조하십시오.
주제
의 상위 수준 API를 사용하여 대용량 아카이브를 파트로 업로드 AWS SDK for Java
작든 크든 상관없이 고레벨 API를 사용하여 아카이브를 업로드하는 메서드는 동일합니다. 상위 수준 API 메서드는 아카이브 크기를 기반으로 아카이브를 단일 작업으로 업로드할지 아니면 Amazon Glacier에서 제공하는 멀티파트 업로드 API를 사용할지 결정합니다. 자세한 내용은 의 상위 수준 API를 사용하여 아카이브 업로드 AWS SDK for Java 단원을 참조하십시오.
의 하위 수준 API를 사용하여 대용량 아카이브를 파트로 업로드 AWS SDK for Java
업로드를 세분화하여 제어할 때는 저레벨 API를 사용하여 요청을 구성하고 응답을 처리할 수 있습니다. 다음은 AWS SDK for Java을 사용하여 대용량 아카이브를 여러 파트로 나누어 업로드하는 단계입니다.
-
AmazonGlacierClient클래스(클라이언트)의 인스턴스를 만듭니다.아카이브를 저장할 AWS 리전을 지정해야 합니다. 이 클라이언트를 사용하여 수행하는 모든 작업은 해당 AWS 리전에 적용됩니다.
-
initiateMultipartUpload메서드를 호출하여 멀티파트 업로드를 시작합니다.아카이브를 업로드할 볼트 이름과 아카이브를 여러 파트로 나누어 업로드하는 데 사용할 파트 크기, 그리고 설명(옵션)을 입력해야 합니다.
InitiateMultipartUploadRequest클래스의 인스턴스를 만들어 이 정보를 제공합니다. 이에 대한 응답으로 Amazon Glacier는 업로드 ID를 반환합니다. -
uploadMultipartPart메서드를 호출하여 각 파트를 업로드합니다.업로드하는 파트마다 볼트 이름, 현재 파트에서 업로드할 최종 아카이브의 바이트 범위, 파트 데이터의 체크섬, 그리고 업로드 ID를 입력해야 합니다.
-
completeMultipartUpload메서드를 호출하여 멀티파트 업로드를 마칩니다.이때는 업로드 ID, 전체 아카이브의 체크섬, 아카이브 크기(업로드한 모든 파트의 총 크기), 그리고 볼트 이름을 입력해야 합니다. Amazon Glacier는 업로드된 파트에서 아카이브를 구성하고 아카이브 ID를 반환합니다.
예:를 사용하여 대용량 아카이브를 파트에 업로드 AWS SDK for Java
다음 Java 코드 예제에서는 AWS SDK for Java 를 사용하여 아카이브를 볼트()에 업로드합니다examplevault. 이 예제의 실행 방법에 대한 단계별 지침은 Eclipse를 사용하여 Amazon Glacier용 Java 예제 실행 단원을 참조하십시오. 아래와 같이 업로드할 파일 이름을 사용해 코드를 업데이트해야 합니다.
참고
아래 예제는 파트 크기가 1MB~1GB일 때 유효합니다. 그러나 Amazon Glacier는 최대 4GB의 부품 크기를 지원합니다.
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(); } }