AWS SDK for .NET을 사용하는 대용량 아카이브 업로드 - Amazon S3 Glacier

이 페이지는 저장소와 2012년 원래 REST API를 사용하는 S3 Glacier 서비스의 기존 고객만 사용할 수 있습니다.

아카이브 스토리지 솔루션을 찾고 있다면 Amazon S3의 S3 Glacier 스토리지 클래스 S3 Glacier Instant Retrieval, S3 Glacier Flexible RetrievalS3 Glacier Deep Archive를 사용하는 것이 좋습니다. 이러한 스토리지 옵션에 대한 자세한 내용은 Amazon S3 사용 설명서S3 Glacier 스토리지 클래스S3 Glacier 스토리지 클래스를 사용한 장기 데이터 저장을 참조하세요. 이러한 스토리지 클래스는 Amazon S3 API를 사용하며, 모든 리전에서 사용 가능하고, Amazon S3 콘솔 내에서 관리할 수 있습니다. 스토리지 비용 분석, Storage Lens, 고급 선택적 암호화 기능 등과 같은 기능을 제공합니다.

AWS SDK for .NET을 사용하는 대용량 아카이브 업로드

.NET용 Amazon SDK에서 제공하는 하이레벨 및 로우레벨 API 둘 모두는 대규모 아카이브를 분할하여 업로드하는 방법을 제공합니다(Amazon S3 Glacier에 아카이브 업로드 섹션 참조).

  • 고레벨 API는 모든 크기의 아카이브를 업로드하는 데 사용할 수 있는 메서드를 제공합니다. 이 방법은 업로드하는 파일에 따라 아카이브를 단일 작업으로 업로드하거나, 혹은 Amazon S3 Glacier(S3 Glacier)에서 지원되는 멀티파트 업로드 기능을 사용해 아카이브를 여러 파트로 나누어 업로드합니다.

  • 저레벨 API는 기본 REST 구현체에 가깝게 매핑합니다. 따라서 더욱 작은 크기의 아카이브를 단일 작업으로 업로드하는 메서드를 제공하거나, 혹은 대용량 아카이브의 경우 멀티파트 업로드를 지원하는 메서드 그룹을 제공합니다. 이번 단원에서는 저레벨 API를 사용하는 대용량 아카이브의 멀티파트 업로드에 대해서 설명합니다.

고레벨 및 저레벨 API에 대한 자세한 내용은 AWS SDK for .NET와 함께 Amazon S3 Glacier 사용 단원을 참조하십시오.

AWS SDK for .NET의 고레벨 API를 사용하는 대용량 아카이브의 멀티파트 업로드

작든 크든 상관없이 고레벨 API를 사용하여 아카이브를 업로드하는 메서드는 동일합니다. 다만 하이레벨 API 방법은 아카이브 크기에 따라 아카이브를 단일 작업으로 업로드할지 아니면 S3 Glacier에서 제공하는 멀티파트 업로드 API를 사용할지 결정합니다. 자세한 내용은 AWS SDK for .NET의 고레벨 API를 사용하는 아카이브 업로드 단원을 참조하십시오.

AWS SDK for .NET의 하위 수준 API를 사용하는 대용량 아카이브의 멀티파트 업로드

업로드를 세분화하여 제어할 때는 저레벨 API를 사용하여 요청을 구성하고 응답을 처리할 수 있습니다. 다음은 AWS SDK for .NET을 사용하여 대용량 아카이브를 여러 파트로 나누어 업로드하는 단계입니다.

  1. AmazonGlacierClient 클래스(클라이언트)의 인스턴스를 만듭니다.

    아카이브를 저장하기 원하는 AWS 리전을 지정해야 합니다. 이 클라이언트를 사용하여 실행하는 모든 작업이 해당 AWS 리전에 적용됩니다.

  2. InitiateMultipartUpload 메서드를 호출하여 멀티파트 업로드를 시작합니다.

    아카이브를 업로드할 볼트 이름과 아카이브를 여러 파트로 나누어 업로드하는 데 사용할 파트 크기, 그리고 설명(옵션)을 입력해야 합니다. InitiateMultipartUploadRequest 클래스의 인스턴스를 만들어 이 정보를 제공합니다. 그러면 S3 Glacier가 응답으로 업로드 ID를 반환합니다.

  3. UploadMultipartPart 메서드를 호출하여 각 파트를 업로드합니다.

    업로드하는 파트마다 볼트 이름, 현재 파트에서 업로드할 최종 아카이브의 바이트 범위, 파트 데이터의 체크섬, 그리고 업로드 ID를 입력해야 합니다.

  4. CompleteMultipartUpload 메서드를 호출하여 멀티파트 업로드를 마칩니다.

    업로드 ID, 전체 아카이브의 체크섬, 아카이브 크기(업로드한 모든 파트의 총 크기), 그리고 볼트 이름을 제공해야 합니다. S3 Glacier는 업로드된 파트부터 아카이브를 구성하여 아카이브 ID를 반환합니다.

예: .NET용 Amazon SDK를 사용하는 대용량 아카이브를 파트로 나누어 업로드

다음은 AWS SDK for .NET을 사용하여 아카이브를 볼트(examplevault)에 업로드하는 C# 코드 예제입니다. 이 예제의 실행 방법에 대한 단계별 지침은 코드 예제 실행 단원을 참조하십시오. 아래와 같이 업로드할 파일 이름을 사용해 코드를 업데이트해야 합니다.

using System; using System.Collections.Generic; using System.IO; using Amazon.Glacier; using Amazon.Glacier.Model; using Amazon.Runtime; namespace glacier.amazon.com.rproxy.goskope.com.docsamples { class ArchiveUploadMPU { static string vaultName = "examplevault"; static string archiveToUpload = "*** Provide file name (with full path) to upload ***"; static long partSize = 4194304; // 4 MB. public static void Main(string[] args) { AmazonGlacierClient client; List<string> partChecksumList = new List<string>(); try { using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2)) { Console.WriteLine("Uploading an archive."); string uploadId = InitiateMultipartUpload(client); partChecksumList = UploadParts(uploadId, client); string archiveId = CompleteMPU(uploadId, client, partChecksumList); Console.WriteLine("Archive ID: {0}", archiveId); } Console.WriteLine("Operations successful. To continue, press Enter"); Console.ReadKey(); } catch (AmazonGlacierException e) { Console.WriteLine(e.Message); } catch (AmazonServiceException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("To continue, press Enter"); Console.ReadKey(); } static string InitiateMultipartUpload(AmazonGlacierClient client) { InitiateMultipartUploadRequest initiateMPUrequest = new InitiateMultipartUploadRequest() { VaultName = vaultName, PartSize = partSize, ArchiveDescription = "Test doc uploaded using MPU." }; InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest); return initiateMPUresponse.UploadId; } static List<string> UploadParts(string uploadID, AmazonGlacierClient client) { List<string> partChecksumList = new List<string>(); long currentPosition = 0; var buffer = new byte[Convert.ToInt32(partSize)]; long fileLength = new FileInfo(archiveToUpload).Length; using (FileStream fileToUpload = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read)) { while (fileToUpload.Position < fileLength) { Stream uploadPartStream = GlacierUtils.CreatePartStream(fileToUpload, partSize); string checksum = TreeHashGenerator.CalculateTreeHash(uploadPartStream); partChecksumList.Add(checksum); // Upload part. UploadMultipartPartRequest uploadMPUrequest = new UploadMultipartPartRequest() { VaultName = vaultName, Body = uploadPartStream, Checksum = checksum, UploadId = uploadID }; uploadMPUrequest.SetRange(currentPosition, currentPosition + uploadPartStream.Length - 1); client.UploadMultipartPart(uploadMPUrequest); currentPosition = currentPosition + uploadPartStream.Length; } } return partChecksumList; } static string CompleteMPU(string uploadID, AmazonGlacierClient client, List<string> partChecksumList) { long fileLength = new FileInfo(archiveToUpload).Length; CompleteMultipartUploadRequest completeMPUrequest = new CompleteMultipartUploadRequest() { UploadId = uploadID, ArchiveSize = fileLength.ToString(), Checksum = TreeHashGenerator.CalculateTreeHash(partChecksumList), VaultName = vaultName }; CompleteMultipartUploadResponse completeMPUresponse = client.CompleteMultipartUpload(completeMPUrequest); return completeMPUresponse.ArchiveId; } } }