

 **このページは、ボールトと 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 は、ボールトにデータを保存する独自の API を備えたスタンドアロンサービスであり、Amazon S3 および Amazon S3 Glacier ストレージクラスとは異なります。既存のデータは Amazon Glacier で無期限に安全性が確保され、引き続きアクセス可能です。移行は必要ありません。低コストの長期アーカイブストレージの場合、 は [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) により、ボールトインベントリが自動的に作成され、インベントリが約 1 日 1 回のペースで更新されます。Amazon Glacier によって最初に作成されるインベントリは、取得できるようになるまで、通常半日から最大 1 日かかります。次の 2 ステップのプロセスで、Amazon Glacier からボールトインベントリを取得できます。

 

1. [ジョブの開始 (ジョブの POST)](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 は両方のトピックにジョブの完了メッセージを送信します。

  E メールで通知を受け取るか、アプリケーションがポーリングできる Amazon Simple Queue Service (Amazon SQS) にメッセージを格納するように SNS トピックを設定できます。メッセージがキューに表示されたら、ジョブが正常に完了したかどうかを確認し、ジョブの出力をダウンロードできます。
+ **明示的にジョブ情報をリクエストする** -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 はボールトインベントリを少なくとも 1 日 1 回のペースで更新します。この更新は、アーカイブを最初にボールトにアップロードした日から開始されます。最後のインベントリ以降に、ボールトに対してアーカイブの追加や削除が行われていない場合、インベントリの日付は更新されません。ボールトインベントリに対してジョブを開始すると、Amazon Glacier により最後に生成されたインベントリが返されます。そのインベントリはポイントインタイムのスナップショットであり、リアルタイムのデータではありません。Amazon Glacier によりボールトに対して最初に作成されるインベントリは、取得できるようになるまで、通常半日から最大 1 日かかることに注意してください。

 アーカイブをアップロードするごとにボールトインベントリを取得することは、あまり便利には感じられないかもしれません。しかし、Amazon Glacier にアップロードしたアーカイブに関するメタデータに関連付けられたデータベースをクライアント側で管理する場合を考えてみてください。そのような場合には、実際のボールトインベントリとデータベース内の情報とを必要に応じて照合できるため、ボールトインベントリの利便性が実感できるものと思われます。アーカイブの作成日でフィルタするか、クォータを設定することによって、取得されるインベントリの項目数を制限できます。インベントリの取得の制限の詳細については、「[インベントリの取得の範囲](api-initiate-job-post.md#api-initiate-job-post-vault-inventory-list-filtering)」を参照してください。

インベントリは、カンマ区切り値 (CSV) と JSON の 2 つの形式で返すことができます。インベントリジョブを開始する際に、オプションで形式を指定できます。デフォルト形式は 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 SNS を使用して、Amazon Glacier でメッセージを発行します。

    

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 トピックを指定しています。
+ Amazon SQS キューにジョブ ID を含むメッセージがあるかどうかを確認します。

  メッセージがある場合は、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 SNS を使用して、Amazon Glacier でメッセージを発行します。

   また、`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)](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 CLI、 `aws configure list` コマンドを使用します。

     ```
     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":
   ...
   ]}
   ```