

 **Esta página es solo para los clientes actuales del servicio Amazon Glacier que utilizan Vaults y la API de REST original de 2012.**

Si busca soluciones de almacenamiento de archivos, se recomienda que utilice las clases de almacenamiento de Amazon Glacier en Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval y S3 Glacier Deep Archive. Para obtener más información sobre estas opciones de almacenamiento, consulte las [clases de almacenamiento de Amazon Glacier](https://aws.amazon.com/s3/storage-classes/glacier/).

Amazon Glacier (servicio original independiente basado en bóveda) ya no acepta nuevos clientes. Amazon Glacier es un servicio independiente propio APIs que almacena datos en almacenes y es distinto de las clases de almacenamiento Amazon S3 y Amazon S3 Glacier. Sus datos actuales permanecerán seguros y accesibles en Amazon Glacier de forma indefinida. No hay que hacer migraciones. Para un almacenamiento de archivos a largo plazo y de bajo costo, AWS recomienda las [clases de almacenamiento Amazon S3 Glacier](https://aws.amazon.com/s3/storage-classes/glacier/), que ofrecen una experiencia de cliente superior con S3 basada en cubos APIs, Región de AWS disponibilidad total, costos más bajos e AWS integración de servicios. Si desea mejorar las capacidades, considere la posibilidad de migrar a las clases de almacenamiento de Amazon S3 Glacier mediante nuestra [AWS Guía de soluciones para la transferencia de datos de los almacenes de Amazon Glacier a las clases de almacenamiento de Amazon S3 Glacier](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/).

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Descarga de un inventario de almacén en Amazon Glacier
<a name="vault-inventory"></a>

Después de cargar un primer archivo en el almacén, Amazon Glacier (Amazon Glacier) crea automáticamente un inventario de almacén y, después, lo actualiza aproximadamente una vez al día. Una vez que Amazon Glacier crea el primer inventario, normalmente debe transcurrir entre medio día y un día para que el inventario pueda recuperarse. Para recuperar un inventario de almacén de Amazon Glacier, puede utilizar este proceso de dos pasos: 

 

1. Inicie un trabajo de recuperación de inventario utilizando la operación [Inicialización de trabajos (POST trabajos)](api-initiate-job-post.md).
**importante**  
Si se utiliza una política de recuperación de datos, puede producirse una excepción `PolicyEnforcedException` en la solicitud de inicio del trabajo de recuperación. Para obtener más información sobre las políticas de recuperación de datos, consulte [Políticas de recuperación de datos de Amazon Glacier](data-retrieval-policy.md). Para obtener más información sobre la excepción `PolicyEnforcedException`, consulte [Respuestas de error](api-error-responses.md).

1. Una vez completado el trabajo, descargue los bytes utilizando la operación [Obtención de la salida del trabajo (GET output)](api-job-output-get.md). 

Por ejemplo, para poder recuperar un archivo o un inventario de almacén, primero es necesario iniciar un trabajo de recuperación. La solicitud del trabajo se ejecuta de forma asincrónica. Cuando se inicia un trabajo de recuperación, Amazon Glacier crea un trabajo y devuelve un ID de trabajo en la respuesta. Una vez que Amazon Glacier finaliza el trabajo, se puede obtener la salida del trabajo, los bytes del archivo o los datos del inventario del almacén. 

El trabajo debe completarse antes de poder obtener la salida. Para determinar el estado del trabajo, cuenta con las siguientes opciones:

 
+ **Esperar una notificación de finalización del trabajo:** puede especificar un tema de Amazon Simple Notification Service (Amazon SNS) en el que Amazon Glacier puede publicar una notificación cuando se complete el trabajo. Para especificar un tema de Amazon SNS, puede utilizar los siguientes métodos: 
  + Puede especificar un tema de Amazon SNS en cada trabajo. 

    Cuando inicie un trabajo, si lo desea, puede especificar un tema de Amazon SNS.
  + Puede configurar las notificaciones en el almacén.

    Puede configurar las notificaciones para determinados eventos en el almacén (consulte [Configuración de notificaciones de almacenes en Amazon Glacier](configuring-notifications.md)). Amazon Glacier envía un mensaje al tema de SNS especificado siempre que se produce ese evento específico.

  Si ha configurado las notificaciones en el almacén y ha especificado además un tema de Amazon SNS al iniciar un trabajo, Amazon Glacier envía un mensaje de finalización del trabajo a ambos temas. 

  Puede configurar el tema de SNS para que le envíe las notificaciones a través del correo electrónico o almacenar el mensaje en una instancia de Amazon Simple Queue Service (Amazon SQS) que la aplicación puede sondear. Cuando aparece un mensaje en la cola, puede comprobar si el trabajo se ha completado correctamente y, a continuación, descargar la salida del trabajo. 
+ **Solicitar explícitamente información del trabajo:** Amazon Glacier también proporciona una operación para describir el trabajo ([Descripción del trabajo (GET JobID)](api-describe-job-get.md)) que le permite sondear información sobre el trabajo. Puede enviar periódicamente esta solicitud para obtener información sobre el trabajo. No obstante, la opción recomendada es utilizar las notificaciones de Amazon SNS.

 

**nota**  
La información que se obtiene través de las notificaciones de SNS es la misma que se obtiene llamando a Describe Job. 

**Topics**
+ [

## Acerca del inventario
](#vault-inventory-about)
+ [

# Descarga del inventario de un almacén en Amazon Glacier mediante el AWS SDK para Java
](retrieving-vault-inventory-java.md)
+ [

# Descarga del inventario de un almacén en Amazon Glacier mediante el AWS SDK para .NET
](retrieving-vault-inventory-sdk-dotnet.md)
+ [

# Descarga de un inventario de almacén con la API de REST
](retrieving-vault-inventory-rest-api.md)
+ [

# Descarga del inventario de una bóveda en Amazon Glacier mediante AWS Command Line Interface
](retrieving-vault-inventory-cli.md)

## Acerca del inventario
<a name="vault-inventory-about"></a>

A partir del día que se carga por primera vez un archivo en el almacén, Amazon Glacier actualiza el inventario del almacén al menos una vez al día. Si no se han agregando ni eliminado archivos en el almacén desde el último inventario, la fecha del inventario no se actualiza. Al iniciar un trabajo para el inventario de un almacén, Amazon Glacier devuelve el último inventario que generó, que es una point-in-time instantánea y no datos en tiempo real. Tenga en cuenta que, una vez que Amazon Glacier crea el primer inventario de almacén, debe transcurrir entre medio día y un día para que el inventario pueda recuperarse.

 Es posible que no le parezca útil recuperar un inventario del almacén cada vez que carga un archivo. Sin embargo, imagine que tiene una base de datos del cliente que asocia los metadatos de los archivos que se cargan en Amazon Glacier. En ese caso, el inventario del almacén podría resultarle útil para, en función de sus necesidades, conciliar la información de la base de datos con el inventario del almacén real. Puede limitar el número de elementos del inventario que se van a recuperar utilizando como filtro la fecha de creación del archivo o definiendo una cuota. Para obtener más información sobre la limitación de la recuperación de inventario, consulte [Recuperación del inventario por intervalos](api-initiate-job-post.md#api-initiate-job-post-vault-inventory-list-filtering).

El inventario se puede devolver con dos formatos: valores separados por comas (CSV) o JSON. Si lo desea, puede especificar el formato al iniciar el trabajo de inventario. El formato predeterminado es JSON. Para obtener más información acerca de los campos de datos que se devuelven en la salida de un trabajo de inventario, consulte [Cuerpo de respuesta](api-job-output-get.md#api-job-output-get-responses-elements) en la *API Get Job Output (Obtener salida de trabajo)*.

# Descarga del inventario de un almacén en Amazon Glacier mediante el AWS SDK para Java
<a name="retrieving-vault-inventory-java"></a>

A continuación, se indican los pasos necesarios para recuperar un inventario de almacén con la API de bajo nivel de AWS SDK para Java. La API de alto nivel no se puede usar para recuperar un inventario de almacenes. 

 

1. Cree una instancia de la clase `AmazonGlacierClient` (el cliente). 

    Debe especificar la AWS región en la que reside la bóveda. Todas las operaciones que realice con este cliente se aplican a esa AWS región. 

1.  Inicie un trabajo de recuperación de inventario ejecutando el método `initiateJob`.

   Proporcione información del trabajo en un objeto `InitiateJobRequest` para ejecutar `initiateJob`. 
**nota**  
Tenga en cuenta que, si no se ha realizado ningún inventario en el almacén, se devuelve un error. Amazon Glacier (Amazon Glacier) prepara un inventario de cada almacén de forma periódica, cada 24 horas. 

   Amazon Glacier devuelve un ID de trabajo como respuesta. La respuesta está disponible en una instancia de la clase `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. Esperar a que el trabajo finalice.

   Debe esperar hasta que la salida del trabajo esté lista para que pueda realizar la descarga. Si ha configurado las notificaciones en el almacén o ha especificado un tema de Amazon Simple Notification Service (Amazon SNS) al comenzar el trabajo, Amazon Glacier envía un mensaje a ese tema cuando complete el trabajo. 

   También puede sondear Amazon Glacier mediante la llamada al método `describeJob` para que determine el estado de finalización del trabajo. No obstante, el enfoque recomendado es utilizar un tema de Amazon SNS para las notificaciones. En el ejemplo de código de la siguiente sección, se utiliza Amazon SNS para que Amazon Glacier publique un mensaje.

    

1. Descargue la salida del trabajo (los datos del inventario de almacén) ejecutando el método `getJobOutput`.

   Tiene que proporcionar el ID de la cuenta, el ID del trabajo y el nombre del almacén creando una instancia de la clase `GetJobOutputRequest`. Si no proporciona el ID de la cuenta, se utilizará el ID de cuenta asociado a las credenciales proporcionadas para firmar la solicitud. Para obtener más información, consulte [Uso del AWS SDK para Java con Amazon Glacier](using-aws-sdk-for-java.md). 

   La salida que devuelve Amazon Glacier está disponible en el objeto `GetJobOutputResult`. 

    

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

 

**nota**  
Para obtener información acerca de la API de REST subyacente relacionada con el trabajo, consulte [Operaciones de tareas](job-operations.md).

## Ejemplo: Recuperación de un inventario de almacén con Amazon SDK para Java
<a name="retrieving-vault-inventory-java-example"></a>

En el siguiente ejemplo de código Java, se recupera el inventario del almacén especificado.

En el ejemplo se realizan las siguientes tareas: 
+ Se crea un tema de Amazon Simple Notification Service (Amazon SNS).

  Amazon Glacier envía una notificación a este tema cuando se completa el trabajo. 
+ Se crea una cola de Amazon Simple Queue Service (Amazon SQS).

  En el ejemplo, se asocia una política a la cola para permitir que el tema de Amazon SNS publique mensajes en la cola.
+ Se inicia un trabajo para descargar el archivo especificado.

  En la solicitud de trabajo, se especifica el tema de Amazon SNS creado para que Amazon Glacier pueda publicar una notificación en este tema cuando se complete el trabajo.
+ Se consulta si hay algún mensaje que contenga el ID de trabajo en la cola de Amazon SQS.

  Si hay algún mensaje, debe analizar el código JSON y comprobar si el trabajo se completó correctamente. En caso afirmativo, descargue el archivo. 
+ Se realiza una limpieza mediante la eliminación del tema de Amazon SNS y la cola de Amazon SQS que creó.

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

# Descarga del inventario de un almacén en Amazon Glacier mediante el AWS SDK para .NET
<a name="retrieving-vault-inventory-sdk-dotnet"></a>

A continuación, se indican los pasos necesarios para recuperar un inventario de almacén con la API de bajo nivel de AWS SDK para .NET. La API de alto nivel no se puede usar para recuperar un inventario de almacenes.

 

1. Cree una instancia de la clase `AmazonGlacierClient` (el cliente). 

   Debe especificar la AWS región en la que reside la bóveda. Todas las operaciones que realice con este cliente se aplican a esa AWS región.

1. Inicie un trabajo de recuperación de inventario ejecutando el método `InitiateJob`.

   La información del trabajo debe proporcionarse en un objeto `InitiateJobRequest`. Amazon Glacier (Amazon Glacier) devuelve un ID de trabajo como respuesta. La respuesta está disponible en una instancia de la clase `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. Esperar a que el trabajo finalice.

   Debe esperar hasta que la salida del trabajo esté lista para que pueda realizar la descarga. Si configuró las notificaciones en el almacén con la identificación de un tema de​ Amazon Simple Notification Service (Amazon SNS) o especificó un tema de Amazon SNS al iniciar un trabajo, Amazon Glacier envía un mensaje a ese tema cuando complete el trabajo. En el ejemplo de código de la siguiente sección, se utiliza Amazon SNS para que Amazon Glacier publique un mensaje.

   También puede sondear Amazon Glacier mediante la llamada al método `DescribeJob` para que determine el estado de finalización del trabajo. No obstante, el enfoque recomendado es utilizar un tema de Amazon SNS para las notificaciones. 

1. Descargue la salida del trabajo (los datos del inventario de almacén) ejecutando el método `GetJobOutput`.

   Tiene que proporcionar el ID de la cuenta, el nombre del almacén y el ID del trabajo creando una instancia de la clase `GetJobOutputRequest`. Si no proporciona el ID de la cuenta, se presumirá que se trata del ID de cuenta asociado a las credenciales proporcionadas para firmar la solicitud. Para obtener más información, consulte [Uso de AWS SDK para .NET con Amazon Glacier](using-aws-sdk-for-dot-net.md). 

   La salida que devuelve Amazon Glacier está disponible en el objeto `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);
      }
   }
   ```

    
**nota**  
Para obtener información acerca de la API de REST subyacente relacionada con el trabajo, consulte [Operaciones de tareas](job-operations.md).

## Ejemplo: recuperar el inventario de un almacén mediante la API de bajo nivel del AWS SDK para .NET
<a name="creating-vaults-sdk-dotnet-example-inventory"></a>

En el siguiente ejemplo de código C\$1, se recupera el inventario del almacén especificado. 

En el ejemplo se realizan las siguientes tareas:

 
+ Se configura un tema de Amazon SNS.

  Amazon Glacier envía una notificación a este tema cuando se completa el trabajo. 
+ Se configura una cola de Amazon SQS. 

  En el ejemplo, se asocia una política a la cola para permitir que el tema de Amazon SNS publique mensajes. 
+ Se inicia un trabajo para descargar el archivo especificado.

  En la solicitud de trabajo, el ejemplo especifica el tema de Amazon SNS para que Amazon Glacier pueda enviar un mensaje cuando se complete el trabajo.
+ Se comprueba periódicamente si hay mensajes en la cola de Amazon SQS. 

  Si hay algún mensaje, debe analizar el código JSON y comprobar si el trabajo se completó correctamente. En caso afirmativo, descargue el archivo. En el ejemplo de código, se utiliza la biblioteca de JSON.NET (consulte [JSON.NET](http://json.codeplex.com/)) para analizar el código JSON.
+ Se realiza una limpieza con la eliminación del tema de Amazon SNS y la cola de Amazon SQS que creó.

**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.us.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);
      }
    }
  }
}
```

# Descarga de un inventario de almacén con la API de REST
<a name="retrieving-vault-inventory-rest-api"></a>

**Para descarga un inventario de almacén con la API de REST**

El proceso para descargar un inventario de almacén se compone de dos pasos.

1. Inicie un trabajo del tipo `inventory-retrieval`. Para obtener más información, consulte [Inicialización de trabajos (POST trabajos)](api-initiate-job-post.md).

1. Una vez que se complete el trabajo, descargue los datos del inventario. Para obtener más información, consulte [Obtención de la salida del trabajo (GET output)](api-job-output-get.md).

# Descarga del inventario de una bóveda en Amazon Glacier mediante AWS Command Line Interface
<a name="retrieving-vault-inventory-cli"></a>

Siga estos pasos para descargar un inventario de almacén en Amazon Glacier (Amazon Glacier) con la AWS Command Line Interface (AWS CLI).

**Topics**
+ [

## (Requisito previo) Configurar el AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## Ejemplo: descargar un inventario de Vault mediante el AWS CLI
](#Retrieving-Vault-Inventory-CLI-Implementation)

## (Requisito previo) Configurar el AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Descargue y configure la AWS CLI. Para obtener instrucciones, consulte los siguientes temas en la *Guía del usuario de la AWS Command Line Interface *: 

    [Instalación del AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

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

1. Compruebe AWS CLI la configuración introduciendo los siguientes comandos en la línea de comandos. Estos comandos no proporcionan las credenciales de forma explícita, por lo que se utilizan las credenciales del perfil predeterminado.
   + Pruebe a usar el comando de ayuda.

     ```
     aws help
     ```
   + Para obtener una lista de los almacenes de Amazon Glacier en la cuenta configurada, use el comando `list-vaults`. *123456789012*Sustitúyala por tu Cuenta de AWS ID.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Para ver los datos de configuración actuales de AWS CLI, utilice el `aws configure list` comando.

     ```
     aws configure list
     ```

## Ejemplo: descargar un inventario de Vault mediante el AWS CLI
<a name="Retrieving-Vault-Inventory-CLI-Implementation"></a>

1. Utilice el comando `initiate-job` para comenzar un trabajo de recuperación de inventario.

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

    Resultado previsto:

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

1. Utilice el comando `describe-job` para comprobar el estado del trabajo de recuperación anterior.

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

    Resultado previsto:

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

1. Esperar a que el trabajo finalice.

   Debe esperar hasta que la salida del trabajo esté lista para que pueda realizar la descarga. El ID de trabajo se mantiene en vigor al menos 24 horas después de que Amazon Glacier finalice el trabajo. Si ha configurado las notificaciones en el almacén o ha especificado un tema de Amazon Simple Notification Service (Amazon SNS) al comenzar el trabajo, Amazon Glacier envía un mensaje a ese tema cuando complete el trabajo. 

   Puede configurar la configuración de notificaciones de determinados eventos en el almacén. Para obtener más información, consulte [Configuración de notificaciones de almacenes en Amazon Glacier](configuring-notifications.md). Amazon Glacier envía un mensaje al tema de SNS especificado siempre que se produzca ese evento específico.

1. Cuando haya finalizado, utilice el comando `get-job-output` para descargar el trabajo de recuperación en el archivo `output.json`.

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

   Este comando genera un archivo con los siguientes campos.

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