

 **이 페이지는 볼트와 2012년부터 원래 REST API를 사용하는 Amazon Glacier 서비스의 기존 고객만 사용할 수 있습니다.**

아카이브 스토리지 솔루션을 찾고 있다면 Amazon S3의 Amazon Glacier 스토리지 클래스, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval 및 S3 Glacier Deep Archive를 사용하는 것이 좋습니다. 이러한 스토리지 옵션에 대한 자세한 내용은 [Amazon Glacier 스토리지 클래스](https://aws.amazon.com/s3/storage-classes/glacier/)를 참조하세요.

Amazon Glacier(기존 독립 실행형 볼트 기반 서비스)는 더 이상 신규 고객을 받지 않습니다. Amazon Glacier는 데이터를 볼트에 저장하고 Amazon S3 및 Amazon S3 Glacier 스토리지 클래스와 구별되는 자체 API를 갖춘 독립 실행형 서비스입니다. 기존 데이터는 Amazon Glacier에서 무기한으로 안전하게 보관되며 액세스 가능합니다. 마이그레이션은 필요하지 않습니다. 저비용 장기 아카이브 스토리지의 경우는 [S3 버킷 기반 API, 전체 가용성, 저렴한 비용 및 서비스 통합을 통해 우수한 고객 경험을 제공하는 Amazon S3 Glacier 스토리지 클래스](https://aws.amazon.com/s3/storage-classes/glacier/)를 AWS 권장합니다. S3 APIs AWS 리전 AWS 향상된 기능을 원하는 경우 [Amazon Glacier 볼트에서 Amazon S3 Glacier 스토리지 클래스로 데이터를 전송하기 위한AWS 솔루션 지침](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/)을 사용하여 Amazon S3 Glacier 스토리지 클래스로 마이그레이션하는 것이 좋습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Glacier에서 볼트 인벤토리 다운로드
<a name="vault-inventory"></a>

첫 번째 아카이브를 볼트에 업로드하면 Amazon Glacier(Amazon Glacier)가 자동으로 볼트 인벤토리를 생성한 후 대략 하루에 한 번씩 업데이트합니다. Amazon Glacier가 첫 번째 인벤토리를 생성한 후 해당 인벤토리를 가져올 수 있을 때까지 일반적으로 반나절에서 하루가 걸립니다. Amazon Glacier에서 볼트 인벤토리를 가져오려면 다음 2단계 프로세스를 따릅니다.

 

1. [작업 시작(POST jobs)](api-initiate-job-post.md) 작업을 사용하여 인벤토리 가져오기 작업을 시작합니다.
**중요**  
데이터 가져오기 정책은 `PolicyEnforcedException` 예외에 따라 가져오기 작업 시작 요청이 오류로 중단되는 원인이 될 수 있습니다. 데이터 가져오기 정책에 대한 자세한 내용은 [Amazon Glacier 데이터 검색 정책](data-retrieval-policy.md) 섹션을 참조하세요. `PolicyEnforcedException` 예외에 대한 자세한 내용은 [오류 응답](api-error-responses.md) 섹션을 참조하세요.

1. 작업이 완료된 후 [작업 출력 가져오기(GET output)](api-job-output-get.md) 작업을 사용하여 바이트를 다운로드합니다.

예를 들어 아카이브 또는 볼트 인벤토리를 가져오려면 가져오기 작업을 먼저 시작해야 합니다. 이때 작업 요청은 비동기식으로 실행됩니다. 검색 작업을 시작하면 Amazon Glacier가 작업을 생성한 후 응답으로 작업 ID를 반환합니다. Amazon Glacier가 가져오기 작업을 마치면 사용자는 작업 출력, 아카이브 바이트 또는 볼트 인벤토리 데이터를 다운로드할 수 있습니다.

작업 출력을 가져오려면 먼저 작업을 완료해야 합니다. 작업 상태는 다음 옵션을 사용해 확인할 수 있습니다.

 
+ **작업 완료 알림 대기**: 작업이 완료되면 Amazon Glacier가 알림 메시지를 게시할 수 있도록 Amazon Simple Notification Service(Amazon SNS) 토픽을 지정할 수 있습니다. Amazon SNS 토픽을 지정하는 방법은 다음과 같습니다.
  + 작업을 기준으로 Amazon SNS 토픽을 지정합니다.

    작업을 시작할 때 선택적으로 Amazon SNS 토픽을 지정할 수 있습니다.
  + 볼트에 알림 구성을 설정합니다.

    볼트의 특정 이벤트에 대해 알림 구성을 설정할 수 있습니다([Amazon Glacier의 볼트 알림 구성](configuring-notifications.md) 섹션 참조). Amazon Glacier는 특정 이벤트가 발생할 때마다 지정된 SNS 토픽에 메시지를 보냅니다.

  볼트에서 알림 구성을 설정하고, 작업을 시작할 때 Amazon SNS 토픽까지 지정했다면, Amazon Glacier는 두 토픽 모두에 작업 완료 메시지를 전송합니다.

  SNS 토픽을 이메일을 통해 알려주도록 혹은 애플리케이션이 폴링할 수 있는 Amazon Simple Queue Service(Amazon SQS)에 메시지를 저장하도록 구성할 수 있습니다. 메시지가 대기열에 표시되면 작업이 성공적으로 완료되었는지 먼저 확인한 후 작업 출력을 다운로드합니다.
+ **명시적인 작업 정보 요청**: Amazon Glacier는 작업 정보를 폴링할 수 있도록 작업 설명([작업 설명(GET JobID)](api-describe-job-get.md))도 제공합니다. 주기적으로 이 요청을 전송하여 작업 정보를 가져올 수 있습니다. 그러나 Amazon SNS의 알림 메시지의 사용을 권장합니다.

 

**참고**  
SNS 알림을 통해 가져오는 정보는 작업 설명을 호출하여 가져오는 정보와 동일합니다.

**Topics**
+ [

## 인벤토리 정보
](#vault-inventory-about)
+ [

# 를 사용하여 Amazon Glacier에서 볼트 인벤토리 다운로드 AWS SDK for Java
](retrieving-vault-inventory-java.md)
+ [

# 를 사용하여 Amazon Glacier에서 볼트 인벤토리 다운로드 AWS SDK for .NET
](retrieving-vault-inventory-sdk-dotnet.md)
+ [

# REST API를 사용하여 볼트 인벤토리 다운로드
](retrieving-vault-inventory-rest-api.md)
+ [

# 를 사용하여 Amazon Glacier에서 볼트 인벤토리 다운로드 AWS Command Line Interface
](retrieving-vault-inventory-cli.md)

## 인벤토리 정보
<a name="vault-inventory-about"></a>

Amazon Glacier는 아카이브를 볼트에 처음 업데이트한 날짜부터 최소한 하루에 한 번씩 볼트 인벤토리를 업데이트합니다. 마지막 인벤토리 이후 볼트에 대한 아카이브 추가 또는 삭제가 없는 경우에는 인벤토리 데이터가 업데이트되지 않습니다. 볼트 인벤토리 작업이 시작되면 Amazon Glacier는 마지막으로 생성한 인벤토리, 즉 실시간 데이터가 아닌 특정 시점 스냅샷을 반환합니다. Amazon Glacier가 첫 번째 볼트 인벤토리를 생성한 후 해당 인벤토리를 가져올 수 있을 때까지 일반적으로 반나절에서 하루가 걸립니다.

 아카이브를 업로드할 때마다 볼트 인벤토리를 가져오는 것이 불필요하다고 생각할 수도 있습니다. 그러나 Amazon Glacier에 업로드하는 아카이브에 대한 메타데이터를 연결하여 클라이언트 측에서 데이터베이스를 관리한다고 가정해보겠습니다. 볼트 인벤토리가 필요에 따라 데이터베이스 정보와 실제 볼트 인벤토리를 서로 조정하는 데 얼마나 유용한지 알게 될 것입니다. 아카이브 생성 날짜를 기준으로 필터링하거나 할당량을 설정하여 가져오는 인벤토리 항목 수를 제한할 수 있습니다. 인벤토리 가져오기 제한에 대한 자세한 내용은 [범위가 지정된 인벤토리 가져오기](api-initiate-job-post.md#api-initiate-job-post-vault-inventory-list-filtering) 섹션을 참조하세요.

인벤토리는 쉼표로 분리된 값(CSV) 또는 JSON의 두 가지 형식으로 반환될 수 있습니다. 이 형식은 인벤토리 작업을 시작할 때 옵션으로 지정할 수 있습니다. 기본 형식은 JSON입니다. 인벤토리 작업 출력에서 반환되는 데이터 필드에 대한 자세한 내용은 **Get Job Output API의 [응답 본문](api-job-output-get.md#api-job-output-get-responses-elements) 섹션을 참조하세요.

# 를 사용하여 Amazon Glacier에서 볼트 인벤토리 다운로드 AWS SDK for Java
<a name="retrieving-vault-inventory-java"></a>

다음은 AWS SDK for Java의 로우레벨 API를 사용해 볼트 인벤토리를 가져오는 단계입니다. 하이레벨 API는 볼트 인벤토리를 가져오도록 지원하지 않습니다.

 

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

    볼트가 있는 AWS 리전을 지정해야 합니다. 이 클라이언트를 사용하여 수행하는 모든 작업은 해당 AWS 리전에 적용됩니다.

1.  `initiateJob` 메서드를 실행하여 인벤토리 가져오기 작업을 시작합니다.

   `InitiateJobRequest` 객체에 작업 정보를 제공하여 `initiateJob`을 실행합니다.
**참고**  
볼트의 인벤토리가 완료되지 않은 경우 오류가 반환된다는 점에 유의하세요. Amazon Glacier(Amazon Glacier)는 각 볼트마다 24시간을 주기로 인벤토리를 준비합니다.

   Amazon Glacier는 응답으로 작업 ID를 반환합니다. 이 응답은 `InitiateJobResult` 클래스 인스턴스에서 사용할 수 있습니다.

    

   ```
   InitiateJobRequest initJobRequest = new InitiateJobRequest()
       .withVaultName("*** provide vault name ***")
       .withJobParameters(
               new JobParameters()
                   .withType("inventory-retrieval")
                   .withSNSTopic("*** provide SNS topic ARN ****")
         );
   
   InitiateJobResult initJobResult = client.initiateJob(initJobRequest);
   String jobId = initJobResult.getJobId();
   ```

1.  작업이 완료될 때까지 기다립니다.

   작업 출력을 다운로드할 수 있을 때까지 기다려야 합니다. 볼트에서 알림 구성을 설정하거나 작업을 시작할 때 Amazon Simple Notification Service(Amazon SNS) 토픽을 지정했다면 Amazon Glacier가 작업 완료 후 해당 토픽에 메시지를 보냅니다.

   `describeJob` 메서드를 직접 호출하여 Amazon Glacier를 폴링함으로써 작업 완료 상태를 확인하는 방법도 있습니다. 하지만 Amazon SNS 토픽을 사용해 식별하는 방법을 권장합니다. 다음 섹션에서 제공하는 코드 예시는 Amazon Glacier가 메시지를 게시할 수 있도록 Amazon SNS를 사용합니다.

    

1. `getJobOutput` 메서드를 실행하여 작업 출력(볼트 인벤토리 데이터)을 다운로드합니다.

   `GetJobOutputRequest` 클래스 인스턴스를 생성하여 계정 ID, 작업 ID 및 볼트 이름을 입력합니다. 계정 ID를 입력하지 않는 경우에는 요청 서명을 위해 입력하는 자격 증명과 연결되어 있는 계정 ID를 사용합니다. 자세한 내용은 [Amazon Glacier AWS SDK for Java 에서 사용](using-aws-sdk-for-java.md) 단원을 참조하십시오.

   Amazon Glacier가 반환하는 출력은 `GetJobOutputResult` 객체에서 사용할 수 있습니다.

    

   ```
   GetJobOutputRequest jobOutputRequest = new GetJobOutputRequest()
           .withVaultName("*** provide vault name ***")
           .withJobId("*** provide job ID ***");
   GetJobOutputResult jobOutputResult = client.getJobOutput(jobOutputRequest);
   // jobOutputResult.getBody(); provides the output stream.
   ```

 

**참고**  
작업과 관련된 기본 REST API에 대한 자세한 내용은 [작업](job-operations.md) 섹션을 참조하세요.

## 예: Amazon SDK for Java를 사용하여 볼트 인벤토리 검색
<a name="retrieving-vault-inventory-java-example"></a>

다음은 볼트를 지정하여 볼트 인벤토리를 가져오는 Java 코드 예제입니다.

이 예에서는 다음과 같은 작업을 수행합니다.
+ Amazon Simple Notification Service(Amazon SNS) 토픽을 생성합니다.

  Amazon Glacier는 작업 완료 후 해당 토픽에 알림을 전송합니다.
+ Amazon Simple Queue Service(Amazon SQS) 대기열을 생성합니다.

  아래 예시는 Amazon SNS 토픽이 메시지를 대기열에 게시할 수 있도록 여기에서 해당 대기열에 정책을 연결합니다.
+ 지정된 아카이브의 다운로드 작업을 시작합니다.

  작업 요청에서 Amazon Glacier가 작업 완료 후 알림 메시지를 해당 토픽에 게시할 수 있도록 생성된 Amazon SNS 토픽이 지정됩니다.
+ 작업 ID가 포함된 메시지가 있는지 Amazon SQS 대기열을 확인합니다.

  메시지가 있으면 JSON 구문을 분석하여 작업이 성공적으로 완료되었는지 확인합니다. 성공적으로 완료되었으면 아카이브를 다운로드합니다.
+ Amazon SNS 토픽과 생성된 Amazon SQS 대기열을 삭제하여 정리합니다.

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.policy.Policy;
import com.amazonaws.auth.policy.Principal;
import com.amazonaws.auth.policy.Resource;
import com.amazonaws.auth.policy.Statement;
import com.amazonaws.auth.policy.Statement.Effect;
import com.amazonaws.auth.policy.actions.SQSActions;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.model.GetJobOutputRequest;
import com.amazonaws.services.glacier.model.GetJobOutputResult;
import com.amazonaws.services.glacier.model.InitiateJobRequest;
import com.amazonaws.services.glacier.model.InitiateJobResult;
import com.amazonaws.services.glacier.model.JobParameters;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.model.CreateTopicRequest;
import com.amazonaws.services.sns.model.CreateTopicResult;
import com.amazonaws.services.sns.model.DeleteTopicRequest;
import com.amazonaws.services.sns.model.SubscribeRequest;
import com.amazonaws.services.sns.model.SubscribeResult;
import com.amazonaws.services.sns.model.UnsubscribeRequest;
import com.amazonaws.services.sqs.AmazonSQSClient;
import com.amazonaws.services.sqs.model.CreateQueueRequest;
import com.amazonaws.services.sqs.model.CreateQueueResult;
import com.amazonaws.services.sqs.model.DeleteQueueRequest;
import com.amazonaws.services.sqs.model.GetQueueAttributesRequest;
import com.amazonaws.services.sqs.model.GetQueueAttributesResult;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.SetQueueAttributesRequest;


public class AmazonGlacierDownloadInventoryWithSQSPolling {

    public static String vaultName = "*** provide vault name ***";
    public static String snsTopicName = "*** provide topic name ***";
    public static String sqsQueueName = "*** provide queue name ***";
    public static String sqsQueueARN;
    public static String sqsQueueURL;
    public static String snsTopicARN;
    public static String snsSubscriptionARN;
    public static String fileName = "*** provide file name ***";
    public static String region = "*** region ***";
    public static long sleepTime = 600; 
    public static AmazonGlacierClient client;
    public static AmazonSQSClient sqsClient;
    public static AmazonSNSClient snsClient;
    
    public static void main(String[] args) throws IOException {
        
    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();

        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier." + region + ".amazonaws.com");
        sqsClient = new AmazonSQSClient(credentials);
        sqsClient.setEndpoint("https://sqs." + region + ".amazonaws.com");
        snsClient = new AmazonSNSClient(credentials);
        snsClient.setEndpoint("https://sns." + region + ".amazonaws.com");
        
        try {
            setupSQS();
            
            setupSNS();

            String jobId = initiateJobRequest();
            System.out.println("Jobid = " + jobId);
            
            Boolean success = waitForJobToComplete(jobId, sqsQueueURL);
            if (!success) { throw new Exception("Job did not complete successfully."); }
            
            downloadJobOutput(jobId);
            
            cleanUp();
            
        } catch (Exception e) {
            System.err.println("Inventory retrieval failed.");
            System.err.println(e);
        }   
    }

    private static void setupSQS() {
        CreateQueueRequest request = new CreateQueueRequest()
            .withQueueName(sqsQueueName);
        CreateQueueResult result = sqsClient.createQueue(request);  
        sqsQueueURL = result.getQueueUrl();
                
        GetQueueAttributesRequest qRequest = new GetQueueAttributesRequest()
            .withQueueUrl(sqsQueueURL)
            .withAttributeNames("QueueArn");
        
        GetQueueAttributesResult qResult = sqsClient.getQueueAttributes(qRequest);
        sqsQueueARN = qResult.getAttributes().get("QueueArn");
        
        Policy sqsPolicy = 
            new Policy().withStatements(
                    new Statement(Effect.Allow)
                    .withPrincipals(Principal.AllUsers)
                    .withActions(SQSActions.SendMessage)
                    .withResources(new Resource(sqsQueueARN)));
        Map<String, String> queueAttributes = new HashMap<String, String>();
        queueAttributes.put("Policy", sqsPolicy.toJson());
        sqsClient.setQueueAttributes(new SetQueueAttributesRequest(sqsQueueURL, queueAttributes)); 

    }
    private static void setupSNS() {
        CreateTopicRequest request = new CreateTopicRequest()
            .withName(snsTopicName);
        CreateTopicResult result = snsClient.createTopic(request);
        snsTopicARN = result.getTopicArn();

        SubscribeRequest request2 = new SubscribeRequest()
            .withTopicArn(snsTopicARN)
            .withEndpoint(sqsQueueARN)
            .withProtocol("sqs");
        SubscribeResult result2 = snsClient.subscribe(request2);
                
        snsSubscriptionARN = result2.getSubscriptionArn();
    }
    private static String initiateJobRequest() {
        
        JobParameters jobParameters = new JobParameters()
            .withType("inventory-retrieval")
            .withSNSTopic(snsTopicARN);
        
        InitiateJobRequest request = new InitiateJobRequest()
            .withVaultName(vaultName)
            .withJobParameters(jobParameters);
        
        InitiateJobResult response = client.initiateJob(request);
        
        return response.getJobId();
    }
    
    private static Boolean waitForJobToComplete(String jobId, String sqsQueueUrl) throws InterruptedException, JsonParseException, IOException {
        
        Boolean messageFound = false;
        Boolean jobSuccessful = false;
        ObjectMapper mapper = new ObjectMapper();
        JsonFactory factory = mapper.getFactory();
        
        while (!messageFound) {
            List<Message> msgs = sqsClient.receiveMessage(
               new ReceiveMessageRequest(sqsQueueUrl).withMaxNumberOfMessages(10)).getMessages();

            if (msgs.size() > 0) {
                for (Message m : msgs) {
                    JsonParser jpMessage = factory.createJsonParser(m.getBody());
                    JsonNode jobMessageNode = mapper.readTree(jpMessage);
                    String jobMessage = jobMessageNode.get("Message").textValue();
                    
                    JsonParser jpDesc = factory.createJsonParser(jobMessage);
                    JsonNode jobDescNode = mapper.readTree(jpDesc);
                    String retrievedJobId = jobDescNode.get("JobId").textValue();
                    String statusCode = jobDescNode.get("StatusCode").textValue();
                    if (retrievedJobId.equals(jobId)) {
                        messageFound = true;
                        if (statusCode.equals("Succeeded")) {
                            jobSuccessful = true;
                        }
                    }
                }
                
            } else {
              Thread.sleep(sleepTime * 1000); 
            }
          }
        return (messageFound && jobSuccessful);
    }
    
    private static void downloadJobOutput(String jobId) throws IOException {
        
        GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
            .withVaultName(vaultName)
            .withJobId(jobId);
        GetJobOutputResult getJobOutputResult = client.getJobOutput(getJobOutputRequest);
    
        FileWriter fstream = new FileWriter(fileName);
        BufferedWriter out = new BufferedWriter(fstream);
        BufferedReader in = new BufferedReader(new InputStreamReader(getJobOutputResult.getBody()));            
        String inputLine;
        try {
            while ((inputLine = in.readLine()) != null) {
                out.write(inputLine);
            }
        }catch(IOException e) {
            throw new AmazonClientException("Unable to save archive", e);
        }finally{
            try {in.close();}  catch (Exception e) {}
            try {out.close();}  catch (Exception e) {}             
        }
        System.out.println("Retrieved inventory to " + fileName);
    }
    
    private static void cleanUp() {
        snsClient.unsubscribe(new UnsubscribeRequest(snsSubscriptionARN));
        snsClient.deleteTopic(new DeleteTopicRequest(snsTopicARN));
        sqsClient.deleteQueue(new DeleteQueueRequest(sqsQueueURL));
    }
}
```

# 를 사용하여 Amazon Glacier에서 볼트 인벤토리 다운로드 AWS SDK for .NET
<a name="retrieving-vault-inventory-sdk-dotnet"></a>

다음은 AWS SDK for .NET의 로우레벨 API를 사용해 볼트 인벤토리를 가져오는 단계입니다. 하이레벨 API는 볼트 인벤토리를 가져오도록 지원하지 않습니다.

 

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

   볼트가 있는 AWS 리전을 지정해야 합니다. 이 클라이언트를 사용하여 수행하는 모든 작업은 해당 AWS 리전에 적용됩니다.

1. `InitiateJob` 메서드를 실행하여 인벤토리 가져오기 작업을 시작합니다.

   사용자는 `InitiateJobRequest` 객체에 작업 정보를 제공합니다. Amazon Glacier(Amazon Glacier)는 응답으로 작업 ID를 반환합니다. 이 응답은 `InitiateJobResponse` 클래스 인스턴스에서 사용할 수 있습니다.

    

   ```
   AmazonGlacierClient client;
   client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2);
   
   InitiateJobRequest initJobRequest = new InitiateJobRequest()
   {
     VaultName = vaultName,
     JobParameters = new JobParameters()
     {
       Type = "inventory-retrieval",
       SNSTopic = "*** Provide Amazon SNS topic arn ***",
     }
   };
   InitiateJobResponse initJobResponse = client.InitiateJob(initJobRequest);
   string jobId = initJobResponse.JobId;
   ```

1.  작업이 완료될 때까지 기다립니다.

   작업 출력을 다운로드할 수 있을 때까지 기다려야 합니다. 볼트에서 Amazon Simple Notification Service(Amazon SNS) 토픽을 식별할 수 있도록 알림 구성을 설정했거나 작업을 시작할 때 Amazon SNS 토픽을 지정했다면 Amazon Glacier가 작업 완료 후 해당 토픽에 메시지를 보냅니다. 다음 섹션에서 제공하는 코드 예시는 Amazon Glacier가 메시지를 게시할 수 있도록 Amazon SNS를 사용합니다.

   `DescribeJob` 메서드를 직접 호출하여 Amazon Glacier를 폴링함으로써 작업 완료 상태를 확인하는 방법도 있습니다. 그러나 Amazon SNS 토픽의 알림을 사용해 식별하는 방법을 권장합니다.

1. `GetJobOutput` 메서드를 실행하여 작업 출력(볼트 인벤토리 데이터)을 다운로드합니다.

   `GetJobOutputRequest` 클래스 인스턴스를 생성하여 계정 ID, 볼트 이름 및 작업 ID 정보를 입력합니다. 계정 ID를 입력하지 않는 경우에는 요청 서명을 위해 입력하는 자격 증명과 연결되어 있는 계정 ID로 간주합니다. 자세한 내용은 [Amazon Glacier와 함께 AWS SDK for .NET 사용](using-aws-sdk-for-dot-net.md) 단원을 참조하십시오.

   Amazon Glacier가 반환하는 출력은 `GetJobOutputResponse` 객체에서 사용할 수 있습니다.

    

   ```
   GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
   {
     JobId = jobId,
     VaultName = vaultName
   };
   						       
   GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest); 
   using (Stream webStream = getJobOutputResponse.Body)
   {
      using (Stream fileToSave = File.OpenWrite(fileName))
      {
        CopyStream(webStream, fileToSave);
      }
   }
   ```

    
**참고**  
작업과 관련된 기본 REST API에 대한 자세한 내용은 [작업](job-operations.md) 섹션을 참조하세요.

## 예:의 하위 수준 API를 사용하여 볼트 인벤토리 검색 AWS SDK for .NET
<a name="creating-vaults-sdk-dotnet-example-inventory"></a>

다음은 볼트를 지정하여 볼트 인벤토리를 가져오는 C\$1 코드 예제입니다.

이 예에서는 다음과 같은 작업을 수행합니다.

 
+ Amazon SNS 토픽을 설정합니다.

  Amazon Glacier는 작업 완료 후 해당 토픽에 알림을 전송합니다.
+ Amazon SQS 대기열을 생성합니다.

  아래 예시는 Amazon SNS 토픽이 메시지를 게시할 수 있도록 여기에서 해당 대기열에 정책을 연결합니다.
+ 지정된 아카이브의 다운로드 작업을 시작합니다.

  아래 예시는 Amazon Glacier가 작업 완료 후 메시지를 전송할 수 있도록 작업 요청에서 Amazon SNS 토픽을 지정합니다.
+ Amazon SQS 대기열의 메시지를 주기적으로 확인합니다.

  메시지가 있으면 JSON 구문을 분석하여 작업이 성공적으로 완료되었는지 확인합니다. 성공적으로 완료되었으면 아카이브를 다운로드합니다. 아래 코드 예제에서는 JSON.NET 라이브러리([JSON.NET](http://json.codeplex.com/) 참조)를 사용하여 JSON 구문을 분석합니다.
+ 생성된 Amazon SNS 토픽과 Amazon SQS 대기열을 삭제하여 정리합니다.

**Example**  

```
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;
using Amazon.SimpleNotificationService;
using Amazon.SimpleNotificationService.Model;
using Amazon.SQS;
using Amazon.SQS.Model;
using Newtonsoft.Json;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class VaultInventoryJobLowLevelUsingSNSSQS
  {
    static string topicArn;
    static string queueUrl;
    static string queueArn;
    static string vaultName = "*** Provide vault name ***";
    static string fileName  = "*** Provide file name and path where to store inventory ***";
    static AmazonSimpleNotificationServiceClient snsClient;
    static AmazonSQSClient sqsClient;
    const string SQS_POLICY =
        "{" +
        "    \"Version\" : \"2012-10-17\",&TCX5-2025-waiver;" +
        "    \"Statement\" : [" +
        "        {" +
        "            \"Sid\" : \"sns-rule\"," +
        "            \"Effect\" : \"Allow\"," +
        "            \"Principal\" : {\"AWS\" : \"arn:aws:iam::123456789012:root\" }," +
        "            \"Action\"    : \"sqs:SendMessage\"," +
        "            \"Resource\"  : \"{QuernArn}\"," +
        "            \"Condition\" : {" +
        "                \"ArnLike\" : {" +
        "                    \"aws:SourceArn\" : \"{TopicArn}\"" +
        "                }" +
        "            }" +
        "        }" +
        "    ]" +
        "}";

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      try
      {
        using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2))
        {
            Console.WriteLine("Setup SNS topic and SQS queue."); 
            SetupTopicAndQueue();
            Console.WriteLine("To continue, press Enter"); Console.ReadKey();
            
            Console.WriteLine("Retrieve Inventory List");
            GetVaultInventory(client);
        }
        Console.WriteLine("Operations successful.");
        Console.WriteLine("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); }
      finally
      {        
       // Delete SNS topic and SQS queue.
       snsClient.DeleteTopic(new DeleteTopicRequest() { TopicArn = topicArn });
       sqsClient.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queueUrl });
      }
    }

    static void SetupTopicAndQueue()
    {
      long ticks = DateTime.Now.Ticks;
      
      // Setup SNS topic.
      snsClient = new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.USWest2);
      sqsClient = new AmazonSQSClient(Amazon.RegionEndpoint.USWest2);

      topicArn = snsClient.CreateTopic(new CreateTopicRequest { Name = "GlacierDownload-" + ticks }).TopicArn;
      Console.Write("topicArn: "); Console.WriteLine(topicArn);
 
      CreateQueueRequest createQueueRequest =  new CreateQueueRequest();
      createQueueRequest.QueueName = "GlacierDownload-" + ticks;
      CreateQueueResponse createQueueResponse = sqsClient.CreateQueue(createQueueRequest);
      queueUrl = createQueueResponse.QueueUrl;
      Console.Write("QueueURL: "); Console.WriteLine(queueUrl);

      GetQueueAttributesRequest getQueueAttributesRequest = new GetQueueAttributesRequest();
      getQueueAttributesRequest.AttributeNames = new List<string> { "QueueArn" };
      getQueueAttributesRequest.QueueUrl = queueUrl;
      GetQueueAttributesResponse response = sqsClient.GetQueueAttributes(getQueueAttributesRequest);
      queueArn = response.QueueARN;
      Console.Write("QueueArn: ");Console.WriteLine(queueArn);

      // Setup the Amazon SNS topic to publish to the SQS queue.
      snsClient.Subscribe(new SubscribeRequest()
      {
        Protocol = "sqs",
        Endpoint = queueArn,
        TopicArn = topicArn
      });

      // Add the policy to the queue so SNS can send messages to the queue.
      var policy = SQS_POLICY.Replace("{TopicArn}", topicArn).Replace("{QuernArn}", queueArn);
     
      sqsClient.SetQueueAttributes(new SetQueueAttributesRequest()
      {
          QueueUrl = queueUrl,
          Attributes = new Dictionary<string, string>
          {
              { QueueAttributeName.Policy, policy }
          }
      });

    }
 
    static void GetVaultInventory(AmazonGlacierClient client)
    {
      // Initiate job.
      InitiateJobRequest initJobRequest = new InitiateJobRequest()
      {
        VaultName = vaultName,
        JobParameters = new JobParameters()
        {
          Type = "inventory-retrieval",
          Description = "This job is to download a vault inventory.",
          SNSTopic = topicArn,
        }
      };
   
      InitiateJobResponse initJobResponse = client.InitiateJob(initJobRequest);
      string jobId = initJobResponse.JobId;

      // Check queue for a message and if job completed successfully, download inventory.
      ProcessQueue(jobId, client);    
    }

    private static void ProcessQueue(string jobId, AmazonGlacierClient client)
    {
      ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest() { QueueUrl = queueUrl, MaxNumberOfMessages = 1 };
      bool jobDone = false;
      while (!jobDone)
      {
        Console.WriteLine("Poll SQS queue"); 
        ReceiveMessageResponse receiveMessageResponse = sqsClient.ReceiveMessage(receiveMessageRequest);
        if (receiveMessageResponse.Messages.Count == 0)
        {
          Thread.Sleep(10000 * 60);
          continue;
        }
        Console.WriteLine("Got message");
        Message message = receiveMessageResponse.Messages[0];
        Dictionary<string, string> outerLayer = JsonConvert.DeserializeObject<Dictionary<string, string>>(message.Body);
        Dictionary<string, object> fields = JsonConvert.DeserializeObject<Dictionary<string, object>>(outerLayer["Message"]);
        string statusCode = fields["StatusCode"] as string;

        if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_SUCCEEDED, StringComparison.InvariantCultureIgnoreCase))
        {
          Console.WriteLine("Downloading job output");
          DownloadOutput(jobId, client); // Save job output to the specified file location.
        }
        else if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_FAILED, StringComparison.InvariantCultureIgnoreCase))
          Console.WriteLine("Job failed... cannot download the inventory.");

        jobDone = true;
        sqsClient.DeleteMessage(new DeleteMessageRequest() { QueueUrl = queueUrl, ReceiptHandle = message.ReceiptHandle });
      }
    }

    private static void DownloadOutput(string jobId, AmazonGlacierClient client)
    {
      GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
      {      
        JobId = jobId,
        VaultName = vaultName
      };
      
      GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest); 
      using (Stream webStream = getJobOutputResponse.Body)
      {
        using (Stream fileToSave = File.OpenWrite(fileName))
        {
          CopyStream(webStream, fileToSave);
        }
      }
    }

    public static void CopyStream(Stream input, Stream output)
    {
      byte[] buffer = new byte[65536];
      int length;
      while ((length = input.Read(buffer, 0, buffer.Length)) > 0)
      {
        output.Write(buffer, 0, length);
      }
    }
  }
}
```

# REST API를 사용하여 볼트 인벤토리 다운로드
<a name="retrieving-vault-inventory-rest-api"></a>

**REST API를 사용하여 볼트 인벤토리를 다운로드하려면**

볼트 인벤토리 다운로드는 2단계 프로세스입니다.

1. `inventory-retrieval` 유형의 작업을 시작합니다. 자세한 내용은 [작업 시작(POST jobs)](api-initiate-job-post.md) 단원을 참조하십시오.

1. 작업이 완료되면 인벤토리 데이터를 다운로드합니다. 자세한 내용은 [작업 출력 가져오기(GET output)](api-job-output-get.md) 단원을 참조하십시오.

# 를 사용하여 Amazon Glacier에서 볼트 인벤토리 다운로드 AWS Command Line Interface
<a name="retrieving-vault-inventory-cli"></a>

다음 단계에 따라 AWS Command Line Interface (AWS CLI)를 사용하여 Amazon Glacier(Amazon Glacier)의 볼트 인벤토리를 다운로드합니다.

**Topics**
+ [

## (사전 조건) 설정 AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## 예:를 사용하여 볼트 인벤토리 다운로드 AWS CLI
](#Retrieving-Vault-Inventory-CLI-Implementation)

## (사전 조건) 설정 AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1.  AWS CLI를 다운로드하고 구성합니다. 관련 지침은 *AWS Command Line Interface 사용 설명서*에서 다음 토픽을 참조하세요.

    [설치 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

   [구성 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

1. 명령 프롬프트에 다음 명령을 입력하여 AWS CLI 설정을 확인합니다. 이러한 명령은 명시적으로 자격 증명을 제공하지 않으므로 기본 프로파일의 자격 증명이 사용됩니다.
   + help 명령을 사용해 보십시오.

     ```
     aws help
     ```
   + 구성된 계정의 Amazon Glacier 볼트 목록을 가져오려면 `list-vaults` 명령을 사용합니다. *123456789012*을 AWS 계정 ID로 바꿉니다.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + 에 대한 현재 구성 데이터를 보려면 `aws configure list` 명령을 AWS CLI사용합니다.

     ```
     aws configure list
     ```

## 예:를 사용하여 볼트 인벤토리 다운로드 AWS CLI
<a name="Retrieving-Vault-Inventory-CLI-Implementation"></a>

1. `initiate-job` 명령을 사용하여 인벤토리 검색 작업을 시작합니다.

   ```
   aws glacier initiate-job --vault-name awsexamplevault --account-id 111122223333 --job-parameters='{"Type": "inventory-retrieval"}'
   ```

    예상 결과:

   ```
   {
       "location": "/111122223333/vaults/awsexamplevault/jobs/*** jobid ***", 
       "jobId": "*** jobid ***"
   }
   ```

1. `describe-job` 명령을 사용하여 이전 검색 작업의 상태를 확인합니다.

   ```
   aws glacier describe-job --vault-name awsexamplevault --account-id 111122223333 --job-id *** jobid ***
   ```

    예상 결과:

   ```
   {
       "InventoryRetrievalParameters": {
           "Format": "JSON"
       }, 
       "VaultARN": "*** vault arn ***", 
       "Completed": false, 
       "JobId": "*** jobid ***", 
       "Action": "InventoryRetrieval", 
       "CreationDate": "*** job creation date ***", 
       "StatusCode": "InProgress"
   }
   ```

1.  작업이 완료될 때까지 기다립니다.

   작업 출력을 다운로드할 수 있을 때까지 기다려야 합니다. 작업 ID는 Amazon Glacier가 작업을 완료한 후 최소 24시간 동안 만료되지 않습니다. 볼트에서 알림 구성을 설정하거나 작업을 시작할 때 Amazon Simple Notification Service(Amazon SNS) 토픽을 지정했다면 Amazon Glacier가 작업 완료 후 해당 토픽에 메시지를 보냅니다.

   볼트의 특정 이벤트에 대해 알림 구성을 설정할 수 있습니다. 자세한 내용은 [Amazon Glacier의 볼트 알림 구성](configuring-notifications.md) 단원을 참조하십시오. Amazon Glacier는 특정 이벤트가 발생할 때마다 지정된 SNS 토픽에 메시지를 보냅니다.

1. 완료되면 `get-job-output` 명령을 사용하여 검색 작업을 `output.json` 파일로 다운로드합니다.

   ```
   aws glacier get-job-output --vault-name awsexamplevault --account-id 111122223333 --job-id *** jobid *** output.json
   ```

   이 명령은 다음 필드가 있는 파일을 생성합니다.

   ```
   {
   "VaultARN":"arn:aws:glacier:region:111122223333:vaults/awsexamplevault",
   "InventoryDate":"*** job completion date ***",
   "ArchiveList":[
   {"ArchiveId":"*** archiveid ***",
   "ArchiveDescription":"*** archive description (if set) ***",
   "CreationDate":"*** archive creation date ***",
   "Size":"*** archive size (in bytes) ***",
   "SHA256TreeHash":"*** archive hash ***"
   }
   {"ArchiveId":
   ...
   ]}
   ```