

 **Esta página destina-se somente a clientes atuais do serviço Amazon Glacier que usam cofres e a API REST original de 2012.**

Se você estiver procurando soluções de armazenamento de arquivos do Amazon Glacier, recomendamos usar as classes de armazenamento do Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval e S3 Glacier Deep Archive. Para saber mais sobre essas opções de armazenamento, consulte [Classes de armazenamento do Amazon Glacier](https://aws.amazon.com/s3/storage-classes/glacier/).

O Amazon Glacier (serviço autônomo original baseado em cofre) não está mais aceitando novos clientes. O Amazon Glacier é um serviço independente APIs que armazena dados em cofres e é diferente das classes de armazenamento Amazon S3 e Amazon S3 Glacier. Seus dados existentes permanecerão seguros e acessíveis no Amazon Glacier indefinidamente. Nenhuma migração é necessária. Para armazenamento de arquivamento de baixo custo e longo prazo, AWS recomenda as classes de armazenamento [Amazon S3 Glacier](https://aws.amazon.com/s3/storage-classes/glacier/), que oferecem uma experiência superior ao cliente com APIs base em buckets S3, disponibilidade Região da AWS total, custos mais baixos e integração de serviços. AWS Se você quiser recursos aprimorados, considere migrar para as classes de armazenamento do Amazon S3 Glacier usando nossas [Orientações de soluções da AWS para transferir dados dos cofres do Amazon Glacier para as classes de armazenamento do Amazon S3 Glacier](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/).

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Trabalhar com arquivos no Amazon Glacier
<a name="working-with-archives"></a>

Um arquivo é qualquer objeto, como uma foto, um vídeo ou um documento, armazenado por você em um cofre. É uma unidade básica de armazenamento no Amazon Glacier. Cada arquivo tem uma ID exclusiva e uma descrição opcional. Ao fazer upload de um arquivo, o Amazon Glacier retorna uma resposta que inclui um ID de arquivo. Esse ID de arquivamento é exclusivo na AWS região em que o arquivo está armazenado. Este é um ID de arquivo de exemplo. 

```
TJgHcrOSfAkV6hdPqOATYfp_0ZaxL1pIBOc02iZ0gDPMr2ig-nhwd_PafstsdIf6HSrjHnP-3p6LCJClYytFT_CBhT9CwNxbRaM5MetS3I-GqwxI3Y8QtgbJbhEQPs0mJ3KExample
```

 O arquivo IDs tem 138 bytes. Ao fazer upload de um arquivo, você pode apresentar uma descrição opcional. Você pode recuperar um arquivo usando o ID, mas não a descrição.

 

**Importante**  
O Amazon Glacier oferece um console de gerenciamento. Você pode usar o console para criar e excluir cofres. No entanto, todas as outras interações com o Amazon Glacier exigem que você use a AWS Command Line Interface (CLI) ou escreva o código. Por exemplo, para fazer upload de dados, como fotos, vídeos e outros documentos, você deve usar AWS CLI ou escrever código para fazer solicitações, usando a API REST diretamente ou usando a Amazon SDKs. Para obter mais informações sobre o uso do Amazon Glacier com o AWS CLI, acesse [AWS CLI Referência do Amazon Glacier.](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Para instalar o AWS CLI, acesse [AWS Command Line Interface](https://aws.amazon.com/cli/).

**Topics**
+ [

## Operações de arquivamento no Amazon Glacier
](#archive-operations-quick-intro)
+ [

## Manter metadados de arquivo no lado do cliente
](#client-side-key-map-concept)
+ [

# Carregar um arquivo no Amazon Glacier
](uploading-an-archive.md)
+ [

# Baixando um arquivo no Amazon Glacier
](downloading-an-archive.md)
+ [

# Excluir um arquivo no Amazon Glacier
](deleting-an-archive.md)

## Operações de arquivamento no Amazon Glacier
<a name="archive-operations-quick-intro"></a>

O Amazon Glacier dá suporte às seguintes operações de arquivo básicas: upload, download e exclusão. Fazer download de um arquivo é uma operação assíncrona. 

### Carregar um arquivo no Amazon Glacier
<a name="uploading-an-archive-quick-intro"></a>

Você pode fazer upload de um arquivo em uma única operação ou fazer upload dele em partes. A chamada à API usada por você para fazer upload de um arquivo em partes é conhecida como Multipart Upload. Para obter mais informações, consulte [Carregar um arquivo no Amazon Glacier](uploading-an-archive.md).

 

**Importante**  
O Amazon Glacier oferece um console de gerenciamento. Você pode usar o console para criar e excluir cofres. No entanto, todas as outras interações com o Amazon Glacier exigem que você use a ( AWS Command Line Interface CLI) ou escreva código. Por exemplo, para fazer upload de dados, como fotos, vídeos e outros documentos, você deve usar AWS CLI ou escrever código para fazer solicitações, usando a API REST diretamente ou usando a Amazon SDKs. Para obter mais informações sobre o uso do Amazon Glacier com o AWS CLI, acesse [AWS CLI Referência do Amazon Glacier.](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Para instalar o AWS CLI, acesse [AWS Command Line Interface](https://aws.amazon.com/cli/).

### Encontre um ID de arquivo no Amazon Glacier
<a name="finding-an-archive-id-quick-intro"></a>

Você pode obter o ID de arquivo fazendo download do inventário do cofre que contém o arquivo. Para obter mais informações sobre como fazer download do inventário de cofre, consulte [Fazer download de um inventário de cofre no Amazon Glacier](vault-inventory.md).

### Baixando um arquivo no Amazon Glacier
<a name="downloading-an-archive-quick-intro"></a>

Fazer download de um arquivo é uma operação assíncrona. Você deve primeiro iniciar um trabalho para fazer download de um arquivo específico. Depois de receber a solicitação de trabalho, o Amazon Glacier prepara o arquivo para download. Depois que o trabalho é concluído, você pode fazer download dos dados do arquivo. Por causa da natureza assíncrona do trabalho, você pode solicitar que o Amazon Glacier envie uma notificação para um tópico do Amazon Simple Notification Service (Amazon SNS) quando o trabalho for concluído. Você pode especificar um tópico do SNS para cada solicitação de trabalho individual ou configurar o cofre para enviar uma notificação quando ocorrerem eventos específicos. Para obter mais informações sobre como fazer download de um arquivo, consulte [Baixando um arquivo no Amazon Glacier](downloading-an-archive.md).

### Excluir um arquivo no Amazon Glacier
<a name="deleting-an-archive-quick-intro"></a>

O Amazon Glacier fornece uma chamada de API que pode ser usada para excluir um arquivo por vez. Para obter mais informações, consulte [Excluir um arquivo no Amazon Glacier](deleting-an-archive.md).

### Atualizar um arquivo no Amazon Glacier
<a name="updating-an-archive-quick-intro"></a>

Depois de fazer upload de um arquivo, você não poderá atualizar o conteúdo nem a descrição. A única maneira como você pode atualizar o conteúdo do arquivo ou a descrição é excluindo o arquivo e fazendo upload de outro arquivo. Sempre que você faz upload de um arquivo, o Amazon Glacier retorna um ID de arquivo exclusivo.

## Manter metadados de arquivo no lado do cliente
<a name="client-side-key-map-concept"></a>

Exceto para a descrição de arquivo opcional, o Amazon Glacier não dá suporte a metadados adicionais dos arquivos. Quando se faz upload de um arquivo, o Amazon Glacier atribui um ID, uma sequência de caracteres invisível, do qual não se pode inferir nenhum significado sobre o arquivo. Você pode manter metadados sobre os arquivos no lado do cliente. Os metadados podem incluir o nome do arquivo e algumas outras informações significativas sobre o arquivo. 

**nota**  
Se for um cliente do Amazon Simple Storage Service (Amazon S3), você saberá que, ao fazer upload de um objeto em um bucket, você pode atribuir ao objeto uma chave, como `MyDocument.txt` ou `SomePhoto.jpg`. No Amazon Glacier, não é possível atribuir um chave de objeto aos arquivos com upload. 

Se você mantém metadados de arquivamento do lado do cliente, observe que o Amazon Glacier mantém um inventário do cofre que inclui o arquivo IDs e todas as descrições fornecidas durante o upload do arquivo. Ocasionalmente, você pode fazer download do inventário de cofre para reconciliar todos os problemas no banco de dados no lado do cliente dos metadados do arquivo. No entanto, o Amazon Glacier faz o inventário de cofre quase que diariamente. Quando você solicita um inventário de cofre, o Amazon Glacier retorna o inventário preparado mais recentemente, um snapshot point-in-time.

# Carregar um arquivo no Amazon Glacier
<a name="uploading-an-archive"></a>

O Amazon Glacier fornece um console de gerenciamento que você pode usar para criar e excluir cofres. No entanto, não é possível fazer upload de arquivos para o Amazon Glacier usando o console de gerenciamento. Para fazer upload de dados, como fotos, vídeos e outros documentos, você deve usar o código AWS CLI ou escrever o código para fazer solicitações, usando diretamente a API REST ou usando a Amazon SDKs. 

Para obter informações sobre o uso do Amazon Glacier com o AWS CLI, acesse [AWS CLI Referência do Amazon Glacier.](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Para instalar o AWS CLI, acesse [AWS Command Line Interface](https://aws.amazon.com/cli/). Os tópicos **Fazer upload** a seguir descrevem como fazer upload de arquivos para o Amazon Glacier usando o Amazon SDK para Java, o Amazon SDK para .NET e a API REST.

**Topics**
+ [

## Opções de upload de um arquivo para o Amazon Glacier
](#uploading-an-archive-overview)
+ [

# Fazer upload de um arquivo em uma única operação
](uploading-archive-single-operation.md)
+ [

# Fazer upload de arquivos grandes em partes (Multipart Upload)
](uploading-archive-mpu.md)

## Opções de upload de um arquivo para o Amazon Glacier
<a name="uploading-an-archive-overview"></a>

Dependendo do tamanho de dados que estão no upload, o Amazon Glacier oferece as seguintes opções: 
+ **Fazer upload de arquivos em uma única operação** – Em uma única operação, você pode fazer upload de arquivos de 1 byte até 4 GB. No entanto, recomendamos que os clientes do Amazon Glacier usem Upload Multiparte para fazer upload de arquivos maiores que 100 MB. Para obter mais informações, consulte [Fazer upload de um arquivo em uma única operação](uploading-archive-single-operation.md).
+ **Fazer upload de arquivos em partes** – Usando a multipart upload API, você pode fazer upload de arquivos grandes de até aproximadamente 40.000 GB (10.000 \$1 4 GB). 

  A chamada da API de multipart upload foi projetada para melhorar a experiência de upload para arquivos maiores. Você pode fazer upload de arquivos em partes. O upload dessas partes pode ser feito de maneira independente, em qualquer ordem, e em paralelo. Em caso de falha de um upload da parte, você precisa refazer upload dessa parte, e não de todo o arquivo. Você pode usar um multipart upload para arquivos de 1 byte até aproximadamente 40.000 GB. Para obter mais informações, consulte [Fazer upload de arquivos grandes em partes (Multipart Upload)](uploading-archive-mpu.md).

**Importante**  
O inventário de cofre do Amazon Glacier é atualizado somente uma vez por dia. Ao fazer upload de um arquivo, você não verá imediatamente o novo arquivo adicionado ao cofre (no console ou na lista de inventários de cofre obtido por download) até o inventário de cofre ter sido atualizado.

### Usando o AWS Snowball Edge serviço
<a name="using-import-export-service-for-glacier"></a>

AWS Snowball Edge acelera a transferência de grandes quantidades de dados para dentro e para fora do AWS uso de dispositivos de propriedade da Amazon, contornando a Internet. Para obter mais informações, consulte a página de detalhes do [AWS Snowball Edge](https://aws.amazon.com/snowball). 

Para fazer upload de dados existentes para o Amazon Glacier, considere usar um dos tipos de dispositivo de AWS Snowball Edge para importar dados para o Amazon S3, e movê-los para a classe de armazenamento do Amazon Glacier para fins de arquivamento usando regras de ciclo de vida. Quando você faz a transição de objetos do Amazon S3 para a classe de armazenamento do Amazon Glacier, o Amazon S3 usa internamente o Amazon Glacier no armazenamento durável por um custo menor. Embora os objetos sejam armazenados no Amazon Glacier, eles continuam sendo objetos do Amazon S3 que você gerencia no Amazon S3, e não é possível acessá-los diretamente por meio do Amazon Glacier.

Para obter mais informações sobre a configuração do ciclo de vida do Amazon S3 e a transição de objetos para a classe de armazenamento do Amazon Glacier, consulte [Gerenciamento do ciclo de vida de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) e [Transição de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html) no *Guia do usuário do Amazon Simple Storage Service*.

# Fazer upload de um arquivo em uma única operação
<a name="uploading-archive-single-operation"></a>

Conforme descrito em [Carregar um arquivo no Amazon Glacier](uploading-an-archive.md), você pode fazer upload de arquivos menores em uma única operação. No entanto, recomendamos que os clientes do Amazon Glacier usem Upload Multiparte para fazer upload de arquivos maiores que 100 MB. 

**Topics**
+ [

# Carregando um arquivo em uma única operação usando o AWS Command Line Interface
](uploading-an-archive-single-op-using-cli.md)
+ [

# Carregando um arquivamento em uma única operação usando o AWS SDK para Java
](uploading-an-archive-single-op-using-java.md)
+ [

# Carregando um arquivo em uma única operação usando o AWS SDK para .NET no Amazon Glacier
](uploading-an-archive-single-op-using-dotnet.md)
+ [

# Fazer upload de um arquivo em uma única operação usando a API REST
](uploading-an-archive-single-op-using-rest.md)

# Carregando um arquivo em uma única operação usando o AWS Command Line Interface
<a name="uploading-an-archive-single-op-using-cli"></a>

Você pode fazer upload de um arquivo no Amazon Glacier (Amazon Glacier) usando AWS Command Line Interface o ().AWS CLI

**Topics**
+ [

## (Pré-requisito) Configurando o AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## Exemplo: Carregar um arquivo usando o AWS CLI
](#Uploading-Archives-CLI-Implementation)

## (Pré-requisito) Configurando o AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Faça download e configure a AWS CLI. Para obter instruções, consulte os seguintes tópicos no *Guia do usuário do AWS Command Line Interface *: 

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

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

1. Verifique sua AWS CLI configuração inserindo os seguintes comandos no prompt de comando. Esses comandos não fornecem as credenciais explicitamente, de modo que as credenciais do perfil padrão são usadas.
   + Tente usar o comando de ajuda.

     ```
     aws help
     ```
   + Para obter uma lista dos cofres do Amazon Glacier na conta configurada, use o comando `list-vaults`. *123456789012*Substitua pelo seu Conta da AWS ID.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Para ver os dados de configuração atuais do AWS CLI, use o `aws configure list` comando.

     ```
     aws configure list
     ```

## Exemplo: Carregar um arquivo usando o AWS CLI
<a name="Uploading-Archives-CLI-Implementation"></a>

Para fazer o upload de um arquivo, você deve ter um cofre criado. Para obter mais informações sobre a criação de cofres, consulte [Criar um cofre no Amazon Glacier](creating-vaults.md).

1. Use o comando `upload-archive` para adicionar um arquivo a um cofre existente. No exemplo abaixo, substitua `vault name` e `account ID`. Para o parâmetro `body`, especifique um caminho para o arquivo que você deseja carregar.

   ```
   aws glacier upload-archive --vault-name awsexamplevault --account-id 123456789012 --body archive.zip
   ```

1.  Saída esperada:

   ```
   {
       "archiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw",
       "checksum": "969fb39823836d81f0cc028195fcdbcbbe76cdde932d4646fa7de5f21e18aa67",
       "location": "/123456789012/vaults/awsexamplevault/archives/kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw"
   }
   ```

   Quando concluído, o comando exibirá o ID do arquivo, a soma de verificação e a localização no Amazon Glacier. Para obter mais informações sobre o comando upload-arquivo, consulte [upload-arquivo](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-archive.html) na *Referência de comandos da AWS CLI *.

# Carregando um arquivamento em uma única operação usando o AWS SDK para Java
<a name="uploading-an-archive-single-op-using-java"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK for Java fornecem um método para carregar um arquivo.

**Topics**
+ [

## Fazendo o upload de um arquivo usando a API de alto nível do AWS SDK para Java
](#uploading-an-archive-single-op-high-level-using-java)
+ [

## Carregando um arquivo em uma única operação usando a API de baixo nível do AWS SDK para Java
](#uploading-an-archive-single-op-low-level-using-java)

## Fazendo o upload de um arquivo usando a API de alto nível do AWS SDK para Java
<a name="uploading-an-archive-single-op-high-level-using-java"></a>

A classe `ArchiveTransferManager` da API de nível superior fornece o método `upload`, que você pode usar para fazer upload de um arquivo em um cofre.

 

**nota**  
Você pode usar o método `upload` para fazer upload de arquivos grandes ou pequenos. Dependendo do tamanho do arquivo que você estiver fazendo upload, esse método determina se é necessário fazer upload dele em uma única operação ou usar a multipart upload API para fazer upload do arquivo em partes.

### Exemplo: fazer o upload de um arquivo usando a API de alto nível do AWS SDK para Java
<a name="upload-archive-high-level-java-example"></a>

O exemplo de código Java a seguir faz upload de um arquivo em um cofre (`examplevault`) na Região (`us-west-2`) Oeste dos EUA (Oregon). Para obter uma lista de AWS regiões e endpoints compatíveis, consulte[Acessar o Amazon Glacier](amazon-glacier-accessing.md). 

Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos do Java para o Amazon Glacier usando o Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). É preciso atualizar o código conforme mostrado com o nome do cofre cujo upload você deseja fazer e o nome do arquivo cujo upload quer fazer.

**Example**  

```
import java.io.File;
import java.io.IOException;
import java.util.Date;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.transfer.ArchiveTransferManager;
import com.amazonaws.services.glacier.transfer.UploadResult;


public class ArchiveUploadHighLevel {
    public static String vaultName = "*** provide vault name ***";
    public static String archiveToUpload = "*** provide name of file to upload ***";
    
    public static AmazonGlacierClient client;
    
    public static void main(String[] args) throws IOException {
        
        
    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();
    	
        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier.us-west-2.amazonaws.com/");

        try {
            ArchiveTransferManager atm = new ArchiveTransferManager(client, credentials);
            
            UploadResult result = atm.upload(vaultName, "my archive " + (new Date()), new File(archiveToUpload));
            System.out.println("Archive ID: " + result.getArchiveId());
            
        } catch (Exception e)
        {
            System.err.println(e);
        }
    }
}
```

## Carregando um arquivo em uma única operação usando a API de baixo nível do AWS SDK para Java
<a name="uploading-an-archive-single-op-low-level-using-java"></a>

A API de nível inferior fornece métodos para todas as operações de arquivo. Veja a seguir as etapas para carregar um arquivo usando o AWS SDK para Java.

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região na qual deseja fazer o upload do arquivo. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região. 

1. Forneça informações sobre a solicitação criando uma instância da classe `UploadArchiveRequest`.

   Além dos dados cujo upload deseja fazer, você precisa fornecer uma soma de verificação (hash de árvore SHA-256) da carga útil, o nome do cofre, o tamanho do conteúdo dos dados e o ID da conta. 

   Se você não fornecer um ID da conta, o ID da conta associado às credenciais fornecidas por você para assinar a solicitação será pressuposto. Para obter mais informações, consulte [Usando o AWS SDK para Java com o Amazon Glacier](using-aws-sdk-for-java.md). 

1. Execute o método `uploadArchive` fornecendo o objeto de solicitação como um parâmetro. 

   Em resposta, o Amazon Glacier retorna um ID do arquivo recém-carregado. 

O trecho de código Java a seguir ilustra as etapas anteriores. 

```
AmazonGlacierClient client;

UploadArchiveRequest request = new UploadArchiveRequest()
    .withVaultName("*** provide vault name ***")
    .withChecksum(checksum)
    .withBody(new ByteArrayInputStream(body))
    .withContentLength((long)body.length);

UploadArchiveResult uploadArchiveResult = client.uploadArchive(request);

System.out.println("Location (includes ArchiveID): " + uploadArchiveResult.getLocation());
```

### Exemplo: fazer upload de um arquivo em uma única operação usando a API de baixo nível do AWS SDK para Java
<a name="uploding-single-archive-using-java-example"></a>

O exemplo de código Java a seguir usa o AWS SDK para Java para carregar um arquivo em um vault (`examplevault`). Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos do Java para o Amazon Glacier usando o Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). É preciso atualizar o código conforme mostrado com o nome do cofre cujo upload você deseja fazer e o nome do arquivo cujo upload quer fazer.

```
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.TreeHashGenerator;
import com.amazonaws.services.glacier.model.UploadArchiveRequest;
import com.amazonaws.services.glacier.model.UploadArchiveResult;
public class ArchiveUploadLowLevel {

    public static String vaultName = "*** provide vault name ****";
    public static String archiveFilePath = "*** provide to file upload ****";
    public static AmazonGlacierClient client;
    
    public static void main(String[] args) throws IOException {
    	
    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();

        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier.us-east-1.amazonaws.com/");

        try {
            // First open file and read.
            File file = new File(archiveFilePath);
            InputStream is = new FileInputStream(file); 
            byte[] body = new byte[(int) file.length()];
            is.read(body);
                                    
            // Send request.
            UploadArchiveRequest request = new UploadArchiveRequest()
                .withVaultName(vaultName)
                .withChecksum(TreeHashGenerator.calculateTreeHash(new File(archiveFilePath))) 
                .withBody(new ByteArrayInputStream(body))
                .withContentLength((long)body.length);
            
            UploadArchiveResult uploadArchiveResult = client.uploadArchive(request);
            
            System.out.println("ArchiveID: " + uploadArchiveResult.getArchiveId());
            
        } catch (Exception e)
        {
            System.err.println("Archive not uploaded.");
            System.err.println(e);
        }
    }
}
```

# Carregando um arquivo em uma única operação usando o AWS SDK para .NET no Amazon Glacier
<a name="uploading-an-archive-single-op-using-dotnet"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK para .NET fornecem um método para carregar um arquivo em uma única operação.

**Topics**
+ [

## Fazendo o upload de um arquivo usando a API de alto nível do AWS SDK para .NET
](#uploading-an-archive-single-op-highlevel-using-dotnet)
+ [

## Carregando um arquivo em uma única operação usando a API de baixo nível do AWS SDK para .NET
](#uploading-an-archive-single-op-lowlevel-using-dotnet)

## Fazendo o upload de um arquivo usando a API de alto nível do AWS SDK para .NET
<a name="uploading-an-archive-single-op-highlevel-using-dotnet"></a>

A classe `ArchiveTransferManager` da API de nível superior fornece o método `Upload` que você pode usar para fazer upload de um arquivo em um cofre. 

**nota**  
Você pode usar o método `Upload` para fazer upload de arquivos pequenos ou grandes. Dependendo do tamanho do arquivo que você estiver fazendo upload, esse método determina se é necessário fazer upload dele em uma única operação ou usar a API de multipart upload para fazer upload do arquivo em partes.

### Exemplo: fazer upload de um arquivo usando a API de alto nível do AWS SDK para .NET
<a name="upload-archive-highlevel-any-size-dotnet"></a>

O exemplo de código C\$1 a seguir faz upload de um arquivo em um cofre (`examplevault`) na Região Oeste dos EUA (Oregon). 

Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). É preciso atualizar o código conforme mostrado com o nome do arquivo cujo upload deseja fazer.

**Example**  

```
using System;
using Amazon.Glacier;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveUploadHighLevel
  {
    static string vaultName = "examplevault"; 
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";

    public static void Main(string[] args)
    {
       try
      {
         var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.USWest2);
         // Upload an archive.
         string archiveId = manager.Upload(vaultName, "upload archive test", archiveToUpload).ArchiveId;
         Console.WriteLine("Archive ID: (Copy and save this ID for use in other examples.) : {0}", archiveId);
         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); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }
  }
}
```

## Carregando um arquivo em uma única operação usando a API de baixo nível do AWS SDK para .NET
<a name="uploading-an-archive-single-op-lowlevel-using-dotnet"></a>

A API de nível inferior fornece métodos para todas as operações de arquivo. Veja a seguir as etapas para carregar um arquivo usando o AWS SDK para .NET.

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região na qual deseja fazer o upload do arquivo. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região. 

1. Forneça informações sobre a solicitação criando uma instância da classe `UploadArchiveRequest`.

   Além dos dados cujo upload deseja fazer, você precisa fornecer uma soma de verificação (hash de árvore SHA-256) da carga útil, o nome do cofre e o ID da conta. 

   Se você não fornecer um ID da conta, o ID da conta associado às credenciais fornecidas por você para assinar a solicitação será pressuposto. Para obter mais informações, consulte [Como usar o AWS SDK para .NET com o Amazon Glacier](using-aws-sdk-for-dot-net.md). 

1. Execute o método `UploadArchive` fornecendo o objeto de solicitação como um parâmetro. 

   Em resposta, o Amazon Glacier retorna um ID do arquivo recém-carregado. 

### Exemplo: fazer upload de um arquivo em uma única operação usando a API de baixo nível do AWS SDK para .NET
<a name="upload-archive-single-op-lowlevel-dotnet"></a>

O exemplo de código do C\$1 a seguir ilustra as etapas anteriores. O exemplo usa o AWS SDK para .NET para carregar um arquivo em um cofre (`examplevault`). 

**nota**  
Para obter informações sobre a API REST subjacente para fazer upload de um arquivo em uma única solicitação, consulte [Upload Archive (POST archive)](api-archive-post.md).

Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). É preciso atualizar o código conforme mostrado com o nome do arquivo cujo upload deseja fazer.

**Example**  

```
using System;
using System.IO;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveUploadSingleOpLowLevel
  {
    static string vaultName       = "examplevault";
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      try
      {
         using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2))
        {
          Console.WriteLine("Uploading an archive.");
          string archiveId = UploadAnArchive(client);
          Console.WriteLine("Archive ID: {0}", archiveId);
        }
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }

    static string UploadAnArchive(AmazonGlacierClient client)
    {
      using (FileStream fileStream = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read))
      {
        string treeHash = TreeHashGenerator.CalculateTreeHash(fileStream);
        UploadArchiveRequest request = new UploadArchiveRequest()
        {
          VaultName = vaultName,
          Body = fileStream,
          Checksum = treeHash
        };
        UploadArchiveResponse response = client.UploadArchive(request);
        string archiveID = response.ArchiveId;
        return archiveID;
      }
    }
  }
}
```

# Fazer upload de um arquivo em uma única operação usando a API REST
<a name="uploading-an-archive-single-op-using-rest"></a>

Você pode usar a chamada de API Upload Archive para fazer upload de um arquivo em uma única operação. Para obter mais informações, consulte [Upload Archive (POST archive)](api-archive-post.md).

# Fazer upload de arquivos grandes em partes (Multipart Upload)
<a name="uploading-archive-mpu"></a>

**Topics**
+ [

## Processo Multipart Upload
](#MPUprocess)
+ [

## Fatos rápidos
](#qfacts)
+ [

# Fazendo upload de arquivos grandes usando o AWS CLI
](uploading-an-archive-mpu-using-cli.md)
+ [

# Fazer upload de arquivos grandes em partes usando o Amazon SDK para Java
](uploading-an-archive-mpu-using-java.md)
+ [

# Fazendo upload de arquivos grandes usando o AWS SDK para .NET
](uploading-an-archive-mpu-using-dotnet.md)
+ [

# Fazer upload de arquivos grandes em partes usando a API REST
](uploading-an-archive-mpu-using-rest.md)

## Processo Multipart Upload
<a name="MPUprocess"></a>

Conforme descrito em [Carregar um arquivo no Amazon Glacier](uploading-an-archive.md), recomendamos que os clientes do Amazon Glacier usem upload multiparte para fazer upload de arquivos maiores que 100 mebibytes (MiB). 

1. **Iniciar multipart upload** 

   Quando você envia uma solicitação para iniciar um upload multiparte, o Amazon Glacier retorna um ID desse upload, que é um identificador exclusivo. Todas as operações de multipart upload subsequentes exigirão esse ID. Esse ID não vai expirar por pelo menos 24 horas depois que o Amazon Glacier concluir o trabalho. 

   Na solicitação para iniciar um multipart upload, especifique o tamanho da parte em número de bytes. Cada parte do upload, exceto a última, deve ser desse tamanho.
**nota**  
Você não precisa saber o tamanho do arquivo geral ao usar o multipart upload. Isso significa que é possível usar multipart uploads nos casos em que, ao começar a carregar o arquivo, o tamanho do arquivo não é conhecido. É necessário decidir apenas o tamanho da parte ao iniciar o multipart upload.

   Na solicitação de multipart upload de iniciação, você também pode fornecer uma descrição de arquivo opcional. 

1. **Partes de upload**

   Para cada solicitação de upload da parte, você deve incluir o ID de multipart upload obtido na etapa 1. Na solicitação, você também deve especificar o intervalo de conteúdo, em bytes, identificando a posição da parte no arquivo final. O Amazon Glacier usará as informações do intervalo de conteúdo para montar o arquivo na sequência apropriada. Como você fornece o intervalo de conteúdo para cada parte do upload, ele determina a posição da parte na montagem final do arquivo e, assim, pode fazer upload de partes em qualquer ordem. Você também pode fazer upload de partes em paralelo. Se você fizer upload de uma nova parte usando o mesmo intervalo de conteúdo como uma parte carregada anteriormente, a parte cujo upload foi feito anteriormente será substituída. 

1. **Concluir (ou anular) o Multipart Upload**

   Depois de fazer upload de todas as partes do arquivo, você usará a operação completa. Mais uma vez, você deve especificar o ID de upload na solicitação. O Amazon Glacier cria um arquivo concatenando partes em ordem crescente com base no intervalo de conteúdo fornecido por você. A resposta do Amazon Glacier a uma solicitação para upload multiparte completo inclui um ID do arquivo recém-criado. Caso uma descrição de arquivo opcional tenha sido fornecida na solicitação Iniciar Upload Multiparte, o Amazon Glacier a associará ao arquivo montado. Depois de concluir com êxito um multipart upload, você não poderá se referir ao ID de multipart upload. Isso significa você não pode acessar partes associadas ao ID de multipart upload.

   Se anular um multipart upload, você não poderá fazer mais upload de partes usando esse ID de upload multipartes. Todo o armazenamento consumido por todas as partes associadas ao multipart upload anulado é liberado. Se algum upload de parte estiver em andamento, ele ainda poderá ser bem-sucedido ou falhar mesmo depois da interrupção.

### Operações de multipart upload adicionais
<a name="additional-mpu-operations"></a>

O Amazon Glacier fornece as seguintes chamadas adicionais de API de upload multiparte.

 
+ **List Parts**: usando essa operação, você pode listar as partes de um multipart upload. Isso retorna informações sobre as partes cujo upload você fez para um multipart upload. Para cada solicitação de partes da lista, o Amazon Glacier retorna informações para até 1.000 partes. Se houver mais partes a serem listadas para o multipart upload, o resultado será paginado, e um marcador será retornado na resposta na qual a lista deve continuar. Você precisa enviar solicitações adicionais para recuperar partes subsequentes. Observe que a lista de partes retornada não inclui partes que não tiveram o upload concluído.
+ **List Multipart Uploads**: usando essa operação, você pode obter uma lista de multipart upload em andamento. Um multipart upload em andamento é um upload que você iniciou, mas que ainda não concluiu nem interrompeu. Para cada solicitação de multipart uploads da lista, o Amazon Glacier retorna até 1.000 multipart uploads. Se houver mais multipart uploads a serem listadas, o resultado será paginado, e um marcador será retornado na resposta na qual a lista deve continuar. Você precisa enviar solicitações adicionais para recuperar os multipart uploads restantes.

## Fatos rápidos
<a name="qfacts"></a>

A tabela a seguir fornece especificações básicas do multipart upload.


| Item | Especificação | 
| --- | --- | 
| Tamanho de arquivo máximo | 10.000 x 4 gibibytes (GiB)  | 
| Número máximo de partes por upload | 10.000 | 
| Tamanho da parte | De 1 MiB a 4 GiB, a última parte pode ser < 1 MiB. Você especifica o valor de tamanho em bytes. O tamanho da peça deve ser um mebibyte (1024 kibibytes [KiB]) multiplicado por uma potência de 2. Por exemplo, `1048576` (1 MiB), `2097152` (2 MiB), `4194304` (4 MiB), `8388608` (8 MiB).   | 
| Número máximo de partes retornadas em uma solicitação de listagem de partes | 1.000  | 
| Número máximo de multipart uploads retornados em uma solicitação de listagem de multipart uploads | 1.000  | 

# Fazendo upload de arquivos grandes usando o AWS CLI
<a name="uploading-an-archive-mpu-using-cli"></a>

Você pode fazer upload de um arquivo no Amazon Glacier (Amazon Glacier) usando o AWS Command Line Interface ().AWS CLI Para melhorar a experiência de upload de arquivos maiores, o Amazon Glacier fornece várias operações de API compatíveis com uploads multiparte. Ao usar essas operações de API, você pode fazer upload de arquivos em partes. O upload dessas partes pode ser feito de maneira independente, em qualquer ordem, e em paralelo. Em caso de falha de um upload da parte, você precisa refazer o upload dessa parte, e não de todo o arquivo. Você pode usar um multipart uploads para arquivos de 1 byte até aproximadamente 40.000 GiB. 

Para obter mais informações sobre uploads multiparte do Amazon Glacier, consulte [Fazer upload de arquivos grandes em partes (Multipart Upload)](uploading-archive-mpu.md).

**Topics**
+ [

## (Pré-requisito) Configurando o AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## (Pré-requisito) Instalar Python
](#Uploading-Archives-mpu-CLI-Install-Python)
+ [

## (Pré-requisito) Crie um cofre do Amazon Glacier
](#Uploading-Archives-mpu-CLI-Create-Vault)
+ [

## Exemplo: Fazer upload de arquivos grandes em partes usando o AWS CLI
](#Uploading-Archives-mpu-CLI-Implementation)

## (Pré-requisito) Configurando o AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Faça download e configure a AWS CLI. Para obter instruções, consulte os seguintes tópicos no *Guia do usuário do AWS Command Line Interface *: 

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

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

1. Verifique sua AWS CLI configuração inserindo os seguintes comandos no prompt de comando. Esses comandos não fornecem as credenciais explicitamente, de modo que as credenciais do perfil padrão são usadas.
   + Tente usar o comando de ajuda.

     ```
     aws help
     ```
   + Para obter uma lista dos cofres do Amazon Glacier na conta configurada, use o comando `list-vaults`. *123456789012*Substitua pelo seu Conta da AWS ID.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Para ver os dados de configuração atuais do AWS CLI, use o `aws configure list` comando.

     ```
     aws configure list
     ```

## (Pré-requisito) Instalar Python
<a name="Uploading-Archives-mpu-CLI-Install-Python"></a>

Para concluir um upload de várias partes, você deve calcular o hash da SHA256 árvore do arquivo que você está carregando. Fazer isso é diferente de calcular o hash da SHA256 árvore do arquivo que você deseja carregar. Para calcular o hash da SHA256 árvore do arquivo que você está carregando, você pode usar Java C\$1 (com .NET) ou. Python Neste exemplo, usaremos Python. Para obter instruções sobre como usar Java ou C\$1, consulte[Computar somas de verificação](checksum-calculations.md). 

Para obter informações sobre como instalar ou atualizar Python, consulte [Instalar a Python](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation) no *Guia do usuário Boto3*.

## (Pré-requisito) Crie um cofre do Amazon Glacier
<a name="Uploading-Archives-mpu-CLI-Create-Vault"></a>

Para usar o exemplo a seguir, você deve ter pelo menos um cofre do Amazon Glacier criado. Para obter mais informações sobre a criação de cofres, consulte [Criar um cofre no Amazon Glacier](creating-vaults.md).

## Exemplo: Fazer upload de arquivos grandes em partes usando o AWS CLI
<a name="Uploading-Archives-mpu-CLI-Implementation"></a>

Neste exemplo, você criará um arquivo e usará operações de API de multipart upload para fazer upload desse arquivo, em partes, no Amazon Glacier.
**Importante**  
Antes de iniciar este procedimento, verifique se você executou todas as etapas pré-requisitos. Para fazer upload de um arquivo, você deve ter um cofre criado, AWS CLI configurado e estar preparado para usar Java C\$1 ou Python calcular um hash de SHA256 árvore.

O procedimento a seguir usa os `complete-multipart-upload` AWS CLI comandos `initiate-multipart-upload``upload-multipart-part`, e. 

Para obter mais informações sobre esses comandos, consulte [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html),[https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html), na seção [https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html) da *Referência de comandos da AWS CLI *.

1. Use o comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html) para criar um recurso de multipart upload. Na solicitação para iniciar um upload multipartes, especifique o tamanho da parte em número de bytes. Cada parte do upload, exceto a última, deve ser desse tamanho. Você não precisa saber o tamanho do arquivo geral ao usar o upload multipartes. No entanto, você precisará do tamanho total, em bytes, de cada parte ao concluir o upload na etapa final.

   No comando a seguir, substitua os valores dos parâmetros `--vault-name` e `--account-ID` por suas próprias informações. Esse comando especifica que você fará o upload de um arquivo com um tamanho de 1 mebibyte (MiB) (1024 x 1024 bytes) por arquivo. Substitua esse valor de parâmetro `--part-size`, se necessário. 

   ```
   aws glacier initiate-multipart-upload --vault-name awsexamplevault --part-size 1048576 --account-id 123456789012
   ```

   Saída esperada:

   ```
   {
   "location": "/123456789012/vaults/awsexamplevault/multipart-uploads/uploadId",
   "uploadId": "uploadId"
   }
   ```

   Quando concluído, o comando exibirá o ID de upload e a localização do recurso de upload multiparte no Amazon Glacier. Você usará este ID de carregamento nas etapas subsequentes.

1. Neste exemplo, você pode usar os comandos a seguir para criar um arquivo de 4,4 MiB, dividi-lo em partes de 1 MiB e fazer upload de cada parte. Para fazer upload de seus próprios arquivos, você pode seguir um procedimento semelhante de dividir seus dados em partes e fazer o upload de cada parte. 

   

**Linux ou macOS**  
O comando a seguir cria um arquivo de 4,4 MiB, chamado `file_to_upload`, no Linux ou no macOS.

   ```
   mkfile -n 9000b file_to_upload
   ```

**Windows**  
O comando a seguir cria um arquivo de 4,4 MiB, chamado `file_to_upload`, no Windows.

   ```
   fsutil file createnew file_to_upload 4608000
   ```

1. Em seguida, você dividirá esse arquivo em pedaços de 1 MiB. 

   ```
   split -b 1048576 file_to_upload chunk
   ```

   Você agora tem os cinco blocos a seguir. Os quatro primeiros têm 1 MiB e o último tem aproximadamente 400 kibibytes (KiB). 

   ```
   chunkaa
   chunkab
   chunkac
   chunkad
   chunkae
   ```

1. Use o comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html) para carregar uma parte de um arquivo. Você pode fazer upload de arquivos em partes. Você também pode fazer upload de partes em paralelo. Você pode fazer upload de até 10.000 partes de um multipart upload.

   No comando a seguir, substitua os valores dos parâmetros `--vault-name`, `--account-ID` e `--upload-id`. O ID de upload deve corresponder ao ID fornecido como saída do comando `initiate-multipart-upload`. O parâmetro `--range` especifica que você fará o upload de uma peça com um tamanho de 1 MiB (1024 x 1024 bytes). Esse tamanho deve corresponder ao que você especificou no comando `initiate-multipart-upload`. Ajuste esse valor de tamanho, se necessário. O parâmetro `--body` especifica o nome da parte que você está carregando.

   ```
   aws glacier upload-multipart-part --body chunkaa --range='bytes 0-1048575/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   Se for bem-sucedido, o comando produzirá uma saída que contém a soma de verificação da peça carregada.

1. Execute o comando `upload-multipart-part` novamente para carregar as partes restantes do multipart upload. Atualize os valores dos parâmetros `--range` e `–-body` de cada comando para que correspondam à parte que você está carregando. 

   ```
   aws glacier upload-multipart-part --body chunkab --range='bytes 1048576-2097151/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkac --range='bytes 2097152-3145727/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkad --range='bytes 3145728-4194303/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```

   ```
   aws glacier upload-multipart-part --body chunkae --range='bytes 4194304-4607999/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
   ```
**nota**  
O valor do parâmetro do comando final `--range` é menor porque a parte final do nosso upload é menor que 1 MiB. Se for bem-sucedido, cada comando produzirá uma saída que contém a soma de verificação de cada parte carregada.

1. Em seguida, você montará o arquivo e finalizará o upload. Você deve incluir o tamanho total e o hash da SHA256 árvore do arquivo.

   Para calcular o hash da SHA256 árvore do arquivo, você pode usar Java C\$1 ou. Python Neste exemplo, usaremos Python. Para obter instruções sobre como usar Java ou C\$1, consulte[Computar somas de verificação](checksum-calculations.md).

   Crie o Python arquivo `checksum.py` e insira o código a seguir. Se necessário, substitua o nome do arquivo original.

   ```
   from botocore.utils import calculate_tree_hash
   					
   checksum = calculate_tree_hash(open('file_to_upload', 'rb'))
   print(checksum)
   ```

1. Execute `checksum.py` para calcular o hash SHA256 da árvore. O hash a seguir pode não corresponder à sua saída.

   ```
   $ python3 checksum.py
   $ 3d760edb291bfc9d90d35809243de092aea4c47b308290ad12d084f69988ae0c
   ```

1. Use o comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html) para finalizar o upload do arquivo. Substitua os valores dos parâmetros `--vault-name`, `--account-ID`, `--upload-ID` e `--checksum`. O valor do parâmetro `--archive` especifica o tamanho total, em bytes, do arquivo. Esse valor deve ser a soma de todos os tamanhos das partes individuais cujo upload você fez. Substitua esse valor, se necessário. 

   ```
   aws glacier complete-multipart-upload --archive-size 4608000 --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID --checksum checksum
   ```

   Quando concluído, o comando exibirá o ID, a soma de verificação e a localização do arquivo no Amazon Glacier. 

# Fazer upload de arquivos grandes em partes usando o Amazon SDK para Java
<a name="uploading-an-archive-mpu-using-java"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK for Java fornecem um método para fazer o upload de um grande arquivo (consulte). [Carregar um arquivo no Amazon Glacier](uploading-an-archive.md) 

 
+ A API de nível superior fornece um método que você pode usar para fazer upload de arquivos de qualquer tamanho. Dependendo do arquivo que você estiver fazendo upload, o método faz upload de um arquivo em uma única operação ou usa o suporte a upload multiparte no Amazon Glacier para fazer upload do arquivo em partes.
+ A API de nível inferior é mapeada junto à implementação de REST subjacente. Dessa forma, ela fornece um método para fazer upload de arquivos menores em uma operação e um grupo de métodos que dão suporte a multipart upload para arquivos maiores. Esta seção explica como fazer upload de arquivos grandes em partes usando a API de nível inferior.

Para obter mais informações sobre alto e baixo nível APIs, consulte. [Usando o AWS SDK para Java com o Amazon Glacier](using-aws-sdk-for-java.md)

**Topics**
+ [

## Carregando arquivos grandes em partes usando a API de alto nível do AWS SDK para Java
](#uploading-an-archive-in-parts-highlevel-using-java)
+ [

## Faça upload de arquivos grandes em partes usando a API de baixo nível do AWS SDK para Java
](#uploading-an-archive-mpu-using-java-lowlevel)

## Carregando arquivos grandes em partes usando a API de alto nível do AWS SDK para Java
<a name="uploading-an-archive-in-parts-highlevel-using-java"></a>

Você pode usar os mesmos métodos da API de nível superior para fazer upload de arquivos grandes ou pequenos. Com base no tamanho do arquivo, os métodos da API de nível superior decidem se é necessário fazer upload do arquivo em uma única operação ou usar a API de upload multiparte fornecida pelo Amazon Glacier. Para obter mais informações, consulte [Fazendo o upload de um arquivo usando a API de alto nível do AWS SDK para Java](uploading-an-archive-single-op-using-java.md#uploading-an-archive-single-op-high-level-using-java).

## Faça upload de arquivos grandes em partes usando a API de baixo nível do AWS SDK para Java
<a name="uploading-an-archive-mpu-using-java-lowlevel"></a>

Para controle granular do upload, você pode usar a API de nível inferior, em que pode configurar a solicitação e processar a resposta. Estas são as etapas para fazer upload de arquivos grandes em partes usando o AWS SDK para Java.

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região na qual deseja salvar o arquivo. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região. 

1. Inicie multipart upload chamando o método `initiateMultipartUpload`.

   Você precisa fornecer o nome do cofre no qual deseja fazer upload do arquivo, o tamanho da parte que deseja usar para fazer upload das partes do arquivo e uma descrição opcional. Você precisa fornecer essas informações criando uma instância da classe `InitiateMultipartUploadRequest`. Em resposta, o Amazon Glacier retorna um ID de upload.

1. Faça upload de partes chamando o método `uploadMultipartPart`. 

   Para cada parte cujo upload faz, você precisa fornecer o nome do cofre, o intervalo de bytes no arquivo montado final cujo upload será feito nessa parte, a soma de verificação dos dados da parte e o ID de upload. 

1. Conclua multipart upload chamando o método `completeMultipartUpload`.

   Você precisa fornecer o ID de upload, a soma de verificação de todo o arquivo, o tamanho do arquivo (tamanho combinado de todas as partes cujo upload você fez) e o nome do cofre. O Amazon Glacier cria o arquivo a partir das partes carregadas e retorna um ID de arquivo.

### Exemplo: Fazer upload de um arquivo grande em um Parts usando o AWS SDK para Java
<a name="upload-archive-mpu-java-example"></a>

O exemplo de código Java a seguir usa o AWS SDK para Java para carregar um arquivo em um vault (`examplevault`). Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos do Java para o Amazon Glacier usando o Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). É preciso atualizar o código conforme mostrado com o nome do arquivo cujo upload deseja fazer.

 

**nota**  
Este exemplo é válido para tamanhos de parte de 1 MB a 1 GB. No entanto, o Amazon Glacier dá suporte a tamanhos de parte de até 4 GB. 

**Example**  

```
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.TreeHashGenerator;
import com.amazonaws.services.glacier.model.CompleteMultipartUploadRequest;
import com.amazonaws.services.glacier.model.CompleteMultipartUploadResult;
import com.amazonaws.services.glacier.model.InitiateMultipartUploadRequest;
import com.amazonaws.services.glacier.model.InitiateMultipartUploadResult;
import com.amazonaws.services.glacier.model.UploadMultipartPartRequest;
import com.amazonaws.services.glacier.model.UploadMultipartPartResult;
import com.amazonaws.util.BinaryUtils;

public class ArchiveMPU {

    public static String vaultName = "examplevault";
    // This example works for part sizes up to 1 GB.
    public static String partSize = "1048576"; // 1 MB.
    public static String archiveFilePath = "*** provide archive file path ***";
    public static AmazonGlacierClient client;
    
    public static void main(String[] args) throws IOException {

    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();

        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier.us-west-2.amazonaws.com/");

        try {
            System.out.println("Uploading an archive.");
            String uploadId = initiateMultipartUpload();
            String checksum = uploadParts(uploadId);
            String archiveId = CompleteMultiPartUpload(uploadId, checksum);
            System.out.println("Completed an archive. ArchiveId: " + archiveId);
            
        } catch (Exception e) {
            System.err.println(e);
        }

    }
    
    private static String initiateMultipartUpload() {
        // Initiate
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest()
            .withVaultName(vaultName)
            .withArchiveDescription("my archive " + (new Date()))
            .withPartSize(partSize);            
        
        InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
        
        System.out.println("ArchiveID: " + result.getUploadId());
        return result.getUploadId();
    }

    private static String uploadParts(String uploadId) throws AmazonServiceException, NoSuchAlgorithmException, AmazonClientException, IOException {

        int filePosition = 0;
        long currentPosition = 0;
        byte[] buffer = new byte[Integer.valueOf(partSize)];
        List<byte[]> binaryChecksums = new LinkedList<byte[]>();
        
        File file = new File(archiveFilePath);
        FileInputStream fileToUpload = new FileInputStream(file);
        String contentRange;
        int read = 0;
        while (currentPosition < file.length())
        {
            read = fileToUpload.read(buffer, filePosition, buffer.length);
            if (read == -1) { break; }
            byte[] bytesRead = Arrays.copyOf(buffer, read);

            contentRange = String.format("bytes %s-%s/*", currentPosition, currentPosition + read - 1);
            String checksum = TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(bytesRead));
            byte[] binaryChecksum = BinaryUtils.fromHex(checksum);
            binaryChecksums.add(binaryChecksum);
            System.out.println(contentRange);
                        
            //Upload part.
            UploadMultipartPartRequest partRequest = new UploadMultipartPartRequest()
            .withVaultName(vaultName)
            .withBody(new ByteArrayInputStream(bytesRead))
            .withChecksum(checksum)
            .withRange(contentRange)
            .withUploadId(uploadId);               
        
            UploadMultipartPartResult partResult = client.uploadMultipartPart(partRequest);
            System.out.println("Part uploaded, checksum: " + partResult.getChecksum());
            
            currentPosition = currentPosition + read;
        }
        fileToUpload.close();
        String checksum = TreeHashGenerator.calculateTreeHash(binaryChecksums);
        return checksum;
    }

    private static String CompleteMultiPartUpload(String uploadId, String checksum) throws NoSuchAlgorithmException, IOException {
        
        File file = new File(archiveFilePath);

        CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest()
            .withVaultName(vaultName)
            .withUploadId(uploadId)
            .withChecksum(checksum)
            .withArchiveSize(String.valueOf(file.length()));
        
        CompleteMultipartUploadResult compResult = client.completeMultipartUpload(compRequest);
        return compResult.getLocation();
    }
}
```

# Fazendo upload de arquivos grandes usando o AWS SDK para .NET
<a name="uploading-an-archive-mpu-using-dotnet"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK para .NET fornecem um método para carregar grandes arquivos em partes (consulte). [Carregar um arquivo no Amazon Glacier](uploading-an-archive.md) 

 
+ A API de nível superior fornece um método que você pode usar para fazer upload de arquivos de qualquer tamanho. Dependendo do arquivo que você estiver fazendo upload, o método faz upload de um arquivo em uma única operação ou usa o suporte a upload multiparte no Amazon Glacier para fazer upload do arquivo em partes.
+ A API de nível inferior é mapeada junto à implementação de REST subjacente. Dessa forma, ela fornece um método para fazer upload de arquivos menores em uma operação e um grupo de métodos que dão suporte a multipart upload para arquivos maiores. Esta seção explica como fazer upload de arquivos grandes em partes usando a API de nível inferior.

Para obter mais informações sobre alto e baixo nível APIs, consulte. [Como usar o AWS SDK para .NET com o Amazon Glacier](using-aws-sdk-for-dot-net.md)

**Topics**
+ [

## Carregando arquivos grandes em partes usando a API de alto nível do AWS SDK para .NET
](#uploading-an-archive-in-parts-highlevel-using-dotnet)
+ [

## Carregando arquivos grandes em partes usando a API de baixo nível do AWS SDK para .NET
](#uploading-an-archive-in-parts-lowlevel-using-dotnet)

## Carregando arquivos grandes em partes usando a API de alto nível do AWS SDK para .NET
<a name="uploading-an-archive-in-parts-highlevel-using-dotnet"></a>

Você pode usar os mesmos métodos da API de nível superior para fazer upload de arquivos grandes ou pequenos. Com base no tamanho do arquivo, os métodos da API de nível superior decidem se é necessário fazer upload do arquivo em uma única operação ou usar a API de upload multiparte fornecida pelo Amazon Glacier. Para obter mais informações, consulte [Fazendo o upload de um arquivo usando a API de alto nível do AWS SDK para .NET](uploading-an-archive-single-op-using-dotnet.md#uploading-an-archive-single-op-highlevel-using-dotnet).

## Carregando arquivos grandes em partes usando a API de baixo nível do AWS SDK para .NET
<a name="uploading-an-archive-in-parts-lowlevel-using-dotnet"></a>

Para controle granular do upload, você pode usar a API de nível inferior, em que pode configurar a solicitação e processar a resposta. Estas são as etapas para fazer upload de arquivos grandes em partes usando o AWS SDK para .NET.

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região na qual deseja salvar o arquivo. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região. 

1. Inicie multipart upload chamando o método `InitiateMultipartUpload`.

   Você precisa fornecer o nome do cofre para o qual deseja fazer upload do arquivo, o tamanho da parte que deseja usar para fazer upload das partes do arquivo e uma descrição opcional. Você precisa fornecer essas informações criando uma instância da classe `InitiateMultipartUploadRequest`. Em resposta, o Amazon Glacier retorna um ID de upload.

1. Faça upload de partes chamando o método `UploadMultipartPart`. 

   Para cada parte cujo upload faz, você precisa fornecer o nome do cofre, o intervalo de bytes no arquivo montado final cujo upload será feito nessa parte, a soma de verificação dos dados da parte e o ID de upload. 

1. Conclua o multipart upload chamando o método `CompleteMultipartUpload`.

   Você precisa fornecer o ID de upload, a soma de verificação de todo o arquivo, o tamanho do arquivo (tamanho combinado de todas as partes cujo upload você fez) e o nome do cofre. O Amazon Glacier cria o arquivo a partir das partes carregadas e retorna um ID de arquivo.

### Exemplo: fazer upload de um arquivo grande em partes usando o Amazon SDK para .NET
<a name="upload-archive-mpu-dotnet-example"></a>

O exemplo de código C\$1 a seguir usa o AWS SDK para .NET para carregar um arquivo em um vault ()`examplevault`. Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). Você precisa atualizar o código conforme mostrado com o nome de um arquivo cujo upload deseja fazer.

**Example**  

```
using System;
using System.Collections.Generic;
using System.IO;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveUploadMPU
  {
    static string vaultName       = "examplevault";
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";
    static long partSize          = 4194304; // 4 MB.

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      List<string> partChecksumList = new List<string>();
      try
      {
         using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2)) 
        {
          Console.WriteLine("Uploading an archive.");
          string uploadId  = InitiateMultipartUpload(client);
          partChecksumList = UploadParts(uploadId, client);
          string archiveId = CompleteMPU(uploadId, client, partChecksumList);
          Console.WriteLine("Archive ID: {0}", archiveId);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }

    static string InitiateMultipartUpload(AmazonGlacierClient client)
    {
      InitiateMultipartUploadRequest initiateMPUrequest = new InitiateMultipartUploadRequest()
      {

        VaultName = vaultName,
        PartSize = partSize,
        ArchiveDescription = "Test doc uploaded using MPU."
      };

      InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest);

      return initiateMPUresponse.UploadId;
    }

    static List<string> UploadParts(string uploadID, AmazonGlacierClient client)
    {
      List<string> partChecksumList = new List<string>();
      long currentPosition = 0;
      var buffer = new byte[Convert.ToInt32(partSize)];

      long fileLength = new FileInfo(archiveToUpload).Length;
      using (FileStream fileToUpload = new FileStream(archiveToUpload, FileMode.Open, FileAccess.Read))
      {
        while (fileToUpload.Position < fileLength)
        {
          Stream uploadPartStream = GlacierUtils.CreatePartStream(fileToUpload, partSize);
          string checksum = TreeHashGenerator.CalculateTreeHash(uploadPartStream);
          partChecksumList.Add(checksum);
          // Upload part.
          UploadMultipartPartRequest uploadMPUrequest = new UploadMultipartPartRequest()
          {

            VaultName = vaultName,
            Body = uploadPartStream,
            Checksum = checksum,
            UploadId = uploadID
          };
          uploadMPUrequest.SetRange(currentPosition, currentPosition + uploadPartStream.Length - 1);
          client.UploadMultipartPart(uploadMPUrequest);

          currentPosition = currentPosition + uploadPartStream.Length;
        }
      }
      return partChecksumList;
    }

    static string CompleteMPU(string uploadID, AmazonGlacierClient client, List<string> partChecksumList)
    {
      long fileLength = new FileInfo(archiveToUpload).Length;
      CompleteMultipartUploadRequest completeMPUrequest = new CompleteMultipartUploadRequest()
      {
        UploadId = uploadID,
        ArchiveSize = fileLength.ToString(),
        Checksum = TreeHashGenerator.CalculateTreeHash(partChecksumList),
        VaultName = vaultName
      };

      CompleteMultipartUploadResponse completeMPUresponse = client.CompleteMultipartUpload(completeMPUrequest);
      return completeMPUresponse.ArchiveId;
    }
  }
}
```

# Fazer upload de arquivos grandes em partes usando a API REST
<a name="uploading-an-archive-mpu-using-rest"></a>

Conforme descrito em [Fazer upload de arquivos grandes em partes (Multipart Upload)](uploading-archive-mpu.md), o multipart upload se refere a um conjunto de operações que permite fazer upload de um arquivo em partes e realizar operações relacionadas. Para obter mais informações sobre essas operações, consulte os seguintes tópicos de referência da API:

 
+ [Initiate Multipart Upload (POST multipart-uploads)](api-multipart-initiate-upload.md)
+ [Upload Part (PUT uploadID)](api-upload-part.md)
+ [Complete Multipart Upload (POST uploadID)](api-multipart-complete-upload.md)
+ [Abort Multipart Upload (DELETE uploadID)](api-multipart-abort-upload.md)
+ [List Parts (GET uploadID)](api-multipart-list-parts.md)
+ [List Multipart Uploads (GET multipart-uploads)](api-multipart-list-uploads.md)

# Baixando um arquivo no Amazon Glacier
<a name="downloading-an-archive"></a>

O Amazon Glacier oferece um console de gerenciamento que pode ser usado para criar e excluir cofres. No entanto, você não pode fazer download de arquivos do Amazon Glacier usando o console de gerenciamento. Para baixar dados, como fotos, vídeos e outros documentos, você deve usar o AWS Command Line Interface (AWS CLI) ou escrever código para fazer solicitações, usando a API REST diretamente ou usando AWS SDKs o. 

Para obter informações sobre o uso do Amazon Glacier com o AWS CLI, consulte a [AWS CLI Referência do Amazon Glacier.](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Para instalar o AWS CLI, consulte [AWS Command Line Interface](https://aws.amazon.com/cli/). Os tópicos a seguir descrevem como baixar arquivos para o Amazon Glacier usando a AWS SDK para Java, a e a API AWS SDK para .NET REST do Amazon Glacier.

**Topics**
+ [

# Recuperação de arquivos do Amazon Glacier
](downloading-an-archive-two-steps.md)
+ [

# Baixando um arquivo no Amazon Glacier usando o AWS SDK para Java
](downloading-an-archive-using-java.md)
+ [

# Baixando um arquivo no Amazon Glacier usando o AWS SDK para .NET
](downloading-an-archive-using-dotnet.md)
+ [

# Baixando um arquivo grande usando processamento paralelo com Python
](downloading-large-archive-parallel-python.md)
+ [

# Fazer download de um arquivo usando a API REST
](downloading-an-archive-using-rest.md)
+ [

# Baixando um arquivo no Amazon Glacier usando o AWS CLI
](downloading-an-archive-using-cli.md)

# Recuperação de arquivos do Amazon Glacier
<a name="downloading-an-archive-two-steps"></a>

Recuperar um arquivo do Amazon Glacier é uma operação assíncrona na qual você primeiro inicia um trabalho e, em seguida, faz download da saída depois de concluí-lo. Para iniciar um trabalho de recuperação de arquivamento, você usa a operação da API [Initiate Job (trabalhos POST)](api-initiate-job-post.md) REST ou o equivalente no AWS CLI, ou o. AWS SDKs

**Topics**
+ [

## Opções de recuperação de arquivos
](#api-downloading-an-archive-two-steps-retrieval-options)
+ [

## Recuperações de arquivo no intervalo
](#downloading-an-archive-range)

Recuperar um arquivo do Amazon Glacier é um processo de duas etapas. Esta é uma visão geral do processo de implantação:

**Para recuperar um arquivo**

1. Inicie um trabalho de recuperação de arquivo.

   1. Obtenha o ID do arquivo que você deseja recuperar. Você pode obter o ID de arquivo de um inventário de cofre. Você pode obter o ID do arquivo com a API REST AWS CLI, ou AWS SDKs. Para obter mais informações, consulte [Fazer download de um inventário de cofre no Amazon Glacier](vault-inventory.md). 

   1. Inicie um trabalho solicitando que o Amazon Glacier prepare um arquivo inteiro ou uma parte dele para download subsequente usando a operação [Initiate Job (trabalhos POST)](api-initiate-job-post.md). 

   Quando você inicia um trabalho, o Amazon Glacier cria um ID de trabalho na resposta e o executa de maneira assíncrona. (Você não poderá fazer download da saída do trabalho depois da conclusão desse trabalho conforme descrito na Etapa 2.)
**Importante**  
Somente para recuperações padrão, uma política de recuperação de dados pode causar uma falha na solicitação `Initiate Job` do trabalho de recuperação de inicialização com uma exceção `PolicyEnforcedException` . Para obter mais informações sobre políticas de recuperação de dados, consulte [Políticas de recuperação de dados do Amazon Glacier](data-retrieval-policy.md). Para obter mais informações sobre a exceção `PolicyEnforcedException`, consulte [Respostas de erro](api-error-responses.md).

   Quando necessário, é possível restaurar grandes segmentos dos dados armazenados no Amazon Glacier. Para obter informações sobre as Classes de armazenamento do Amazon Glacier, consulte [Classes de armazenamento de objetos]( https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier) no *Guia do Desenvolvedor do Amazon Simple Storage Service*.

1. Após a conclusão do trabalho, faça download dos bytes usando a operação [Get Job Output (GET output)](api-job-output-get.md). 

   Você pode fazer download de todos os bytes ou especificar um intervalo de bytes para fazer download somente de uma parte da saída do trabalho. Para uma saída maior, fazer download da saída em blocos ajudará se houver uma falha no download, como uma falha de rede. Se obtiver a saída do trabalho em uma única solicitação e houver uma falha na rede, você precisará reiniciar o download da saída desde o início. No entanto, se fizer download da saída em blocos, em caso de alguma falha, você precisará somente reiniciar o download da parte menor, e não de toda a saída. 

O Amazon Glacier deve concluir o trabalho para você obter o resultado. Após a conclusão, um trabalho não vai expirar por pelo menos 24 horas, o que significa que você pode fazer download da saída dentro do período de 24 horas depois do término do trabalho. A restauração pode expirar a qualquer momento após 24 horas da conclusão do trabalho. Para determinar se o trabalho está concluído, verifique o status usando uma das seguintes opções:
+ **Aguardar a notificação de conclusão do trabalho**: você pode especificar um tópico do Amazon Simple Notiﬁcation Service (Amazon SNS) no qual o Amazon Glacier poderá publicar uma notificação depois que o trabalho for concluído. O Amazon Glacier enviará uma notificação somente depois de concluir o trabalho.

  Você pode especificar um tópico do Amazon SNS para um trabalho ao iniciá-lo. Além de especificar um tópico do Amazon SNS na solicitação de trabalho, se o cofre tiver uma configuração de notificação definida para eventos de recuperação do arquivo, o Amazon Glacier também publicará uma notificação para esse tópico do SNS. Para obter mais informações, consulte [Configurar notificações do cofre no Amazon Glacier](configuring-notifications.md).
+ **Solicitar informações do trabalho explicitamente**: você também pode usar a operação da API `Describe Job` do Amazon Glacier ([Trabalho de descrição (GET JobID)](api-describe-job-get.md)) para pesquisar periodicamente informações do trabalho. No entanto, recomendamos usar as notificações do Amazon SNS.

**nota**  
As informações obtidas por você usando a notificação do Amazon SNS são as mesmas recebidas quando se chama `Describe Job` a operação API. 

## Opções de recuperação de arquivos
<a name="api-downloading-an-archive-two-steps-retrieval-options"></a>

Você pode especificar um dos seguintes ao iniciar um trabalho para recuperar um arquivo com base nos requisitos de tempo e custo de acesso. Para obter informações sobre preços de recuperação, consulte [Preços do Amazon Glacier](https://aws.amazon.com/s3/glacier/pricing/).
+ **Expedited**: as recuperações expressas permitem que você acesse rapidamente os dados armazenados na classe de armazenamento S3 Glacier Flexible Retrieval ou no nível S3 Intelligent-Tiering Archive Access quando solicitações urgentes ocasionais para restauração de arquivos são necessárias. Exceto para os arquivos maiores (mais de 250 MB), os dados acessados usando-se recuperações expressas costumam ser disponibilizados dentro de 1 a 5 minutos. A capacidade provisionada garante que sua capacidade de recuperação para recuperações expressas esteja disponível quando você precisar dela. Para obter mais informações, consulte [Capacidade provisionada](#api-downloading-an-archive-two-steps-retrieval-expedited-capacity). 
+ **Padrão**: as recuperações padrão permitem acessar qualquer um dos arquivos em várias horas. As recuperações padrão normalmente são concluídas dentro de 3 a 5 horas. Padrão é a opção assumida para solicitações de recuperação que não especificam a opção de recuperação.
+ **Em massa**: as recuperações em massa são a opção de recuperação de menor custo do Amazon Glacier que você pode usar para recuperar grandes quantidades de dados, até mesmo petabytes, em um dia. As recuperações em massa (Bulk retrievals) normalmente são concluídas dentro de 5 a 12 horas.

A tabela a seguir resume as opções de recuperação de arquivos. Para obter mais informações sobre preços, consulte [Preços do Amazon Glacier](https://aws.amazon.com/s3/glacier/pricing/).


| Serviço | Expressa | Padrão | Em massa | 
| --- | --- | --- | --- | 
|  Amazon Glacier  |  1 a 5 minutos  |  3 a 5 horas  |  5 a 12 horas  | 

Para fazer uma `Bulk` recuperação `Expedited``Standard`, ou, defina o elemento de `Tier` solicitação na solicitação de operação da API [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html)REST com a opção desejada ou o equivalente em AWS Command Line Interface (AWS CLI) ou AWS SDKs. Se você adquiriu a capacidade provisionada, todas as recuperações expressas serão automaticamente fornecidas por meio de sua capacidade provisionada. 

### Capacidade provisionada
<a name="api-downloading-an-archive-two-steps-retrieval-expedited-capacity"></a>

A capacidade provisionada ajuda a garantir que sua capacidade de recuperação para recuperações expressas esteja disponível quando você precisar dela. Cada unidade de capacidade permite que pelo menos três recuperações expressas possam ser realizadas a cada 5 minutos e fornece até 150 megabytes por segundo () de taxa de transferência de recuperação. MBps

Se sua workload exigir acesso altamente confiável e previsível a um subconjunto de seus dados em minutos, será necessário adquirir a capacidade de recuperação provisionada. Sem capacidade provisionada, as recuperações expressas são normalmente aceitas, exceto em raras situações de demanda excepcionalmente alta. Contudo, se precisar de acesso a recuperações expressas em todas as circunstâncias, você deve comprar a capacidade de recuperação provisionada. 

#### Comprar capacidade provisionada
<a name="downloading-an-archive-purchase-provisioned-capacity"></a>

Você pode comprar unidades de capacidade provisionada usando o console do Amazon Glacier, [Purchase Provisioned Capacity (POST provisioned-capacity)](api-PurchaseProvisionedCapacity.md) a operação da API REST, AWS SDKs o ou o. AWS CLI Para obter informações sobre a definição de preços da capacidade provisionada, consulte [Definição de preços do Amazon Glacier](https://aws.amazon.com/s3/glacier/pricing/). 

Uma unidade de capacidade provisionada dura um mês a partir da data e hora da compra.

Se a data de início é dia 31 de um mês, a data de expiração será o último dia do mês seguinte. Por exemplo, se a data de início é dia 31 de agosto, a data de expiração será dia 30 de setembro. Se a data de início é dia 31 de janeiro, a data de expiração será dia 28 de fevereiro.

**Para comprar capacidade provisionada usando o console do Amazon Glacier**

1.  [Faça login Console de gerenciamento da AWS e abra o console do Amazon Glacier em casahttps://console.aws.amazon.com/glacier/.](https://console.aws.amazon.com/glacier/home)

1. No painel de navegação à esquerda, escolha **Configurações de recuperação de dados**.

1. Em **Unidades de capacidade provisionada (PCUs)**, escolha **Comprar** PCU. A caixa de diálogo **Comprar PCU** é exibida.

1. Se quiser comprar capacidade provisionada, entre **confirm** na caixa **Para confirmar a compra**.

1.  Escolha **Comprar PCU**. 

## Recuperações de arquivo no intervalo
<a name="downloading-an-archive-range"></a>

Ao recuperar um arquivo do Amazon Glacier, você pode especificar um intervalo, ou mesmo um segmento, do arquivo a ser recuperado. O padrão é recuperar o arquivo todo. Especificar um intervalo de bytes pode ser útil quando você deseja fazer o seguinte:
+ **Gerenciar os downloads de dados**: o Amazon Glacier permite que os dados recuperados sejam baixados por 24 horas após a conclusão da solicitação de recuperação. Portanto, convém recuperar somente partes do arquivo, de maneira que você possa gerenciar a programação de downloads dentro da janela de download indicada.
+ **Recuperar uma parte segmentada de um arquivo grande**: por exemplo, suponhamos que você tenha agregado muitos arquivos anteriormente e feito upload deles como um único arquivo e agora queira recuperar alguns deles. Nesse caso, pode-se especificar um intervalo do arquivo que contenha os arquivos que lhe interessam usando uma solicitação de recuperação. Ou você pode iniciar várias solicitações de recuperação, cada uma com um intervalo para um ou mais arquivos.

Ao iniciar um trabalho de recuperação usando recuperações de intervalo, você deve fornecer um intervalo alinhado a megabytes. Em outras palavras, o intervalo de bytes pode começar em zero (o início do arquivo) ou em qualquer intervalo de 1 MB posterior (1 MB, 2 MB, 3 MB e assim por diante). 

O final do intervalo pode ser o final do arquivo ou qualquer intervalo de 1 MB maior que o início do intervalo. Além disso, se você quiser obter valores da soma de verificação ao fazer download dos dados (depois da conclusão do trabalho de recuperação), o intervalo solicitado por você na iniciação do trabalho também deverá estar alinhado ao tree-hash. Somas de verificação são uma maneira de você garantir que os dados não tenham sido corrompidos durante a transmissão. Para obter mais informações sobre os alinhamentos a megabytes e ao hash de árvore, consulte [Receber somas de verificação durante o download de dados](checksum-calculations-range.md). 

# Baixando um arquivo no Amazon Glacier usando o AWS SDK para Java
<a name="downloading-an-archive-using-java"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK for Java fornecem um método para baixar um arquivo.

**Topics**
+ [

## Baixando um arquivo usando a API de alto nível do AWS SDK para Java
](#downloading-an-archive-using-java-highlevel-api)
+ [

## Baixando um arquivo usando a API de baixo nível do AWS SDK para Java
](#downloading-an-archive-using-java-lowlevel-api)

## Baixando um arquivo usando a API de alto nível do AWS SDK para Java
<a name="downloading-an-archive-using-java-highlevel-api"></a>

A classe `ArchiveTransferManager` da API de nível superior fornece o método `download` que você pode usar para fazer download de um arquivo. 

**Importante**  
A classe `ArchiveTransferManager` cria um tópico do Amazon Simple Notification Service (Amazon SNS) e uma fila do Amazon Simple Queue Service (Amazon SQS) que está inscrita nesse tópico. Em seguida, ela inicia o trabalho de recuperação do arquivo e sonda a fila em busca do arquivo disponível. Assim que o arquivo estiver disponível, o download começará. Para obter informações sobre tempos de recuperação, consulte [Opções de recuperação de arquivos](downloading-an-archive-two-steps.md#api-downloading-an-archive-two-steps-retrieval-options).

### Exemplo: Baixar um arquivo usando a API de alto nível do AWS SDK para Java
<a name="download-archives-java-highlevel-example"></a>

O exemplo de código do Java a seguir faz download de um arquivo de um cofre (`examplevault`) na região Oeste dos EUA (Oregon) (`us-west-2`).

Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos do Java para o Amazon Glacier usando o Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). Você precisa atualizar o código conforme mostrado com um ID de arquivo existente e o caminho do arquivo local onde deseja salvar o arquivo obtido por download.

**Example**  

```
import java.io.File;
import java.io.IOException;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.transfer.ArchiveTransferManager;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sqs.AmazonSQSClient;


public class ArchiveDownloadHighLevel {
    public static String vaultName = "examplevault";
    public static String archiveId = "*** provide archive ID ***";
    public static String downloadFilePath  = "*** provide location to download archive ***";
    
    public static AmazonGlacierClient glacierClient;
    public static AmazonSQSClient sqsClient;
    public static AmazonSNSClient snsClient;
    
    public static void main(String[] args) throws IOException {
        
    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();
        
        glacierClient = new AmazonGlacierClient(credentials);
        
        sqsClient = new AmazonSQSClient(credentials);
        snsClient = new AmazonSNSClient(credentials);
        glacierClient.setEndpoint("glacier.us-west-2.amazonaws.com");
        sqsClient.setEndpoint("sqs.us-west-2.amazonaws.com");
        snsClient.setEndpoint("sns.us-west-2.amazonaws.com");

        try {
            ArchiveTransferManager atm = new ArchiveTransferManager(glacierClient, sqsClient, snsClient);
            
            atm.download(vaultName, archiveId, new File(downloadFilePath));
            System.out.println("Downloaded file to " + downloadFilePath);
            
        } catch (Exception e)
        {
            System.err.println(e);
        }
    }
}
```

## Baixando um arquivo usando a API de baixo nível do AWS SDK para Java
<a name="downloading-an-archive-using-java-lowlevel-api"></a>

Estas são as etapas para recuperar um inventário de cofre usando a API de nível inferior do AWS SDK para Java . 

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região de onde deseja baixar o arquivo. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região. 

1. Inicie um trabalho `archive-retrieval` executando o método `initiateJob`.

   Forneça informações do trabalho, como o ID do arquivo cujo download deseja fazer e o tópico do Amazon SNS no qual deseja que o Amazon Glacier publique uma mensagem de conclusão do trabalho criando uma instância da classe `InitiateJobRequest`. Em resposta, o Amazon Glacier retorna um ID de trabalho. A resposta está disponível em uma instância da classe `InitiateJobResult`.

    

   ```
   JobParameters jobParameters = new JobParameters()
       .withArchiveId("*** provide an archive id ***")
       .withDescription("archive retrieval")
       .withRetrievalByteRange("*** provide a retrieval range***") // optional
       .withType("archive-retrieval");
   
   InitiateJobResult initiateJobResult = client.initiateJob(new InitiateJobRequest()
       .withJobParameters(jobParameters)
       .withVaultName(vaultName));  
             
   String jobId = initiateJobResult.getJobId();
   ```

   Você também pode especificar um intervalo de bytes para solicitar ao Amazon Glacier que prepare somente uma parte do arquivo. Por exemplo, você pode atualizar a solicitação anterior adicionando a instrução a seguir para solicitar que o Amazon Glacier prepare somente a parte de 1 MB a 2 MB do arquivo.

    

   ```
   int ONE_MEG = 1048576;
   String retrievalByteRange = String.format("%s-%s", ONE_MEG, 2*ONE_MEG -1);
   
   JobParameters jobParameters = new JobParameters()
       .withType("archive-retrieval")
       .withArchiveId(archiveId)
       .withRetrievalByteRange(retrievalByteRange) 
       .withSNSTopic(snsTopicARN);
   
   InitiateJobResult initiateJobResult = client.initiateJob(new InitiateJobRequest()
       .withJobParameters(jobParameters)
       .withVaultName(vaultName));  
             
   String jobId = initiateJobResult.getJobId();
   ```

    

1. Aguarde a conclusão do trabalho .

   Você deve aguardar até a saída do trabalho estar pronta para download. Se você tiver definido uma configuração de notificação no cofre identificando um tópico do Amazon Simple Notiﬁcation Service (Amazon SNS) ou especificado um tópico do Amazon SNS quando tiver iniciado um trabalho, o Amazon Glacier enviará uma mensagem para esse tópico depois de concluir o trabalho. 

   Você também pode sondar o Amazon Glacier chamando o método `describeJob` para determinar o status de conclusão do trabalho. Apesar disso, usar um tópico do Amazon SNS para notificação é a abordagem recomendada.

1. Faça download da saída do trabalho (dados de arquivo) executando o método `getJobOutput`.

   Você fornece as informações da solicitação, como o ID de trabalho e o nome do cofre, criando uma instância da classe `GetJobOutputRequest`. A saída retornada pelo Amazon Glacier está disponível no objeto `GetJobOutputResult`. 

    

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

   O trecho de código anterior faz download de toda a saída do trabalho. Opcionalmente, você pode recuperar somente uma parte da saída ou fazer download de toda a saída em blocos menores especificando o intervalo de bytes em `GetJobOutputRequest`. 

    

   ```
   GetJobOutputRequest jobOutputRequest = new GetJobOutputRequest()
           .withJobId("*** provide a job ID ***")
           .withRange("bytes=0-1048575")   // Download only the first 1 MB of the output.
           .withVaultName("*** provide a vault name ****");
   ```

   Em resposta à chamada `GetJobOutput`, o Amazon Glacier retorna a soma de verificação da parte dos dados obtidos por download, se determinadas condições forem atendidas. Para obter mais informações, consulte [Receber somas de verificação durante o download de dados](checksum-calculations-range.md).

   Para verificar se não há erros no download, você pode computar a soma de verificação no lado do cliente e compará-la com a soma de verificação enviada pelo Amazon Glacier na resposta. 

   Para um trabalho de recuperação de arquivamento com o intervalo opcional especificado, quando você obtém a descrição do trabalho, ela inclui a soma de verificação do intervalo que você está recuperando (). SHA256 TreeHash Você pode usar esse valor para verificar a precisão de todo o intervalo de bytes cujo download fará depois. Por exemplo, se iniciar um trabalho para recuperar um intervalo alinhado ao hash de árvore e fizer download de saída em blocos, de maneira que cada uma das solicitações `GetJobOutput` retorne uma soma de verificação, você poderá computar a soma de verificação de cada parte cujo download você faz no lado do cliente e o hash de árvore. Você pode compará-la com a soma de verificação que o Amazon Glacier retorna em resposta à sua solicitação de descrição de trabalho para verificar se todo o intervalo de bytes que você baixou é igual ao intervalo de bytes armazenado no Amazon Glacier. 

    Para obter um exemplo funcional, consulte [Exemplo 2: Recuperação de um arquivamento usando a API de baixo nível da saída AWS SDK para Java—Download em partes](#downloading-an-archive-with-range-using-java-example). 

### Exemplo 1: Recuperação de um arquivamento usando a API de baixo nível do AWS SDK para Java
<a name="downloading-an-archive-using-java-example"></a>

O exemplo de código do Java a seguir faz download de um arquivo do cofre especificado. Depois que o trabalho for concluído, o exemplo fará download de toda a saída em uma única chamada `getJobOutput`. Para obter um exemplo de como fazer download de saída em blocos, consulte [Exemplo 2: Recuperação de um arquivamento usando a API de baixo nível da saída AWS SDK para Java—Download em partes](#downloading-an-archive-with-range-using-java-example).

O exemplo realiza as seguintes tarefas:

 
+ Cria um tópico do Amazon Simple Notification Service (Amazon SNS).

  O Amazon Glacier enviará uma notificação para esse tópico depois de concluir o trabalho. 
+ Cria uma fila do Amazon Simple Queue Service (Amazon SQS)

  O exemplo anexa uma política à fila para permitir que o tópico do Amazon SNS publique mensagens na fila.
+ Inicia um trabalho para fazer download do arquivo especificado.

  Na solicitação de trabalho, o tópico do Amazon SNS criado é especificado para que o Amazon Glacier possa publicar uma notificação no tópico depois de concluir o trabalho.
+ Verifica periodicamente a fila do Amazon SQS em busca de uma mensagem que contenha o ID do trabalho.

  Se houver uma mensagem, analise o JSON e verifique se o trabalho foi concluído com êxito. Se for o caso, faça download do arquivo. 
+ Realiza uma limpeza excluindo o tópico do Amazon SNS e a fila do Amazon SQS criada por ele.

 

```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.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 AmazonGlacierDownloadArchiveWithSQSPolling {
    
    public static String archiveId = "*** provide archive ID ****";
    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("Archive 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("archive-retrieval")
            .withArchiveId(archiveId)
            .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.getJsonFactory();
        
        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").getTextValue();
                    
                    JsonParser jpDesc = factory.createJsonParser(jobMessage);
                    JsonNode jobDescNode = mapper.readTree(jpDesc);
                    String retrievedJobId = jobDescNode.get("JobId").getTextValue();
                    String statusCode = jobDescNode.get("StatusCode").getTextValue();
                    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);
    
        InputStream input = new BufferedInputStream(getJobOutputResult.getBody());
        OutputStream output = null;
        try {
            output = new BufferedOutputStream(new FileOutputStream(fileName));

            byte[] buffer = new byte[1024 * 1024];

            int bytesRead = 0;
            do {
                bytesRead = input.read(buffer);
                if (bytesRead <= 0) break;
                output.write(buffer, 0, bytesRead);
            } while (bytesRead > 0);
        } catch (IOException e) {
            throw new AmazonClientException("Unable to save archive", e);
        } finally {
            try {input.close();}  catch (Exception e) {}
            try {output.close();} catch (Exception e) {}
        }
        System.out.println("Retrieved archive to " + fileName);
    }
    
    private static void cleanUp() {
        snsClient.unsubscribe(new UnsubscribeRequest(snsSubscriptionARN));
        snsClient.deleteTopic(new DeleteTopicRequest(snsTopicARN));
        sqsClient.deleteQueue(new DeleteQueueRequest(sqsQueueURL));
    }
}
```

### Exemplo 2: Recuperação de um arquivamento usando a API de baixo nível da saída AWS SDK para Java—Download em partes
<a name="downloading-an-archive-with-range-using-java-example"></a>

O exemplo de código do Java a seguir recupera um arquivo do Amazon Glacier. O exemplo de código faz download da saída do trabalho em blocos especificando um intervalo de bytes em um objeto `GetJobOutputRequest`.

 

```
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
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.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.TreeHashGenerator;
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 ArchiveDownloadLowLevelWithRange {
    
    public static String vaultName = "*** provide vault name ***";
    public static String archiveId = "*** provide archive id ***";
    public static String snsTopicName = "glacier-temp-sns-topic";
    public static String sqsQueueName = "glacier-temp-sqs-queue";
    public static long downloadChunkSize = 4194304; // 4 MB  
    public static String sqsQueueARN;
    public static String sqsQueueURL;
    public static String snsTopicARN;
    public static String snsSubscriptionARN;
    public static String fileName = "*** provide file name to save archive to ***";
    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);
            
            long archiveSizeInBytes = waitForJobToComplete(jobId, sqsQueueURL);
            if (archiveSizeInBytes==-1) { throw new Exception("Job did not complete successfully."); }
            
            downloadJobOutput(jobId, archiveSizeInBytes);
            
            cleanUp();
            
        } catch (Exception e) {
            System.err.println("Archive 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("archive-retrieval")
            .withArchiveId(archiveId)
            .withSNSTopic(snsTopicARN);
        
        InitiateJobRequest request = new InitiateJobRequest()
            .withVaultName(vaultName)
            .withJobParameters(jobParameters);
        
        InitiateJobResult response = client.initiateJob(request);
        
        return response.getJobId();
    }
    
    private static long waitForJobToComplete(String jobId, String sqsQueueUrl) throws InterruptedException, JsonParseException, IOException {
        
        Boolean messageFound = false;
        Boolean jobSuccessful = false;
        long archiveSizeInBytes = -1;
        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();
                    archiveSizeInBytes = jobDescNode.get("ArchiveSizeInBytes").longValue();
                    if (retrievedJobId.equals(jobId)) {
                        messageFound = true;
                        if (statusCode.equals("Succeeded")) {
                            jobSuccessful = true;
                        }
                    }
                }
                
            } else {
              Thread.sleep(sleepTime * 1000); 
            }
          }
        return (messageFound && jobSuccessful) ? archiveSizeInBytes : -1;
    }
    
    private static void downloadJobOutput(String jobId, long archiveSizeInBytes) throws IOException {
        
        if (archiveSizeInBytes < 0) {
            System.err.println("Nothing to download.");
            return;
        }

        System.out.println("archiveSizeInBytes: " + archiveSizeInBytes);
        FileOutputStream fstream = new FileOutputStream(fileName);
        long startRange = 0;
        long endRange = (downloadChunkSize > archiveSizeInBytes) ? archiveSizeInBytes -1 : downloadChunkSize - 1;

        do {

            GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
                .withVaultName(vaultName)
                .withRange("bytes=" + startRange + "-" + endRange)
                .withJobId(jobId);
            GetJobOutputResult getJobOutputResult = client.getJobOutput(getJobOutputRequest);

            BufferedInputStream is = new BufferedInputStream(getJobOutputResult.getBody());     
            byte[] buffer = new byte[(int)(endRange - startRange + 1)];

            System.out.println("Checksum received: " + getJobOutputResult.getChecksum());
            System.out.println("Content range " + getJobOutputResult.getContentRange());

            
            int totalRead = 0;
            while (totalRead < buffer.length) {
                int bytesRemaining = buffer.length - totalRead;
                int read = is.read(buffer, totalRead, bytesRemaining);
                if (read > 0) {
                    totalRead = totalRead + read;                             
                } else {
                    break;
                }
                
            }
            System.out.println("Calculated checksum: " + TreeHashGenerator.calculateTreeHash(new ByteArrayInputStream(buffer)));
            System.out.println("read = " + totalRead);
            fstream.write(buffer);
            
            startRange = startRange + (long)totalRead;
            endRange = ((endRange + downloadChunkSize) >  archiveSizeInBytes) ? archiveSizeInBytes : (endRange + downloadChunkSize); 
            is.close();
        } while (endRange <= archiveSizeInBytes  && startRange < archiveSizeInBytes);
        
        fstream.close();
        System.out.println("Retrieved file to " + fileName);

    }
    
    private static void cleanUp() {
        snsClient.unsubscribe(new UnsubscribeRequest(snsSubscriptionARN));
        snsClient.deleteTopic(new DeleteTopicRequest(snsTopicARN));
        sqsClient.deleteQueue(new DeleteQueueRequest(sqsQueueURL));
    }
}
```

# Baixando um arquivo no Amazon Glacier usando o AWS SDK para .NET
<a name="downloading-an-archive-using-dotnet"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK para .NET fornecem um método para baixar um arquivo.

**Topics**
+ [

## Baixando um arquivo usando a API de alto nível do AWS SDK para .NET
](#downloading-an-archive-using-dotnet-highlevel-api)
+ [

## Baixando um arquivo usando a API de baixo nível do AWS SDK para .NET
](#downloading-an-archive-using-dotnet-lowlevel-api)

## Baixando um arquivo usando a API de alto nível do AWS SDK para .NET
<a name="downloading-an-archive-using-dotnet-highlevel-api"></a>

A classe `ArchiveTransferManager` da API de nível superior fornece o método `Download` que você pode usar para fazer download de um arquivo. 

**Importante**  
A classe `ArchiveTransferManager` cria um tópico do Amazon Simple Notification Service (Amazon SNS) e uma fila do Amazon Simple Queue Service (Amazon SQS) que está inscrita nesse tópico. Em seguida, ela inicia o trabalho de recuperação do arquivo e sonda a fila em busca do arquivo disponível. Assim que o arquivo estiver disponível, o download começará. Para obter informações sobre tempos de recuperação, consulte [Opções de recuperação de arquivos](downloading-an-archive-two-steps.md#api-downloading-an-archive-two-steps-retrieval-options)

### Exemplo: Baixar um arquivo usando a API de alto nível do AWS SDK para .NET
<a name="download-archives-dotnet-highlevel-example"></a>

O exemplo de código C\$1 a seguir faz download de um arquivo de um cofre (`examplevault`) na região Oeste dos EUA (Oregon). 

Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). Você precisa atualizar o código conforme mostrado com um ID de arquivo existente e o caminho do arquivo local onde deseja salvar o arquivo obtido por download.

```
using System;
using Amazon.Glacier;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveDownloadHighLevel
  {
    static string vaultName        = "examplevault";
    static string archiveId        = "*** Provide archive ID ***";
    static string downloadFilePath = "*** Provide the file name and path to where to store the download ***";

    public static void Main(string[] args)
    {
      try
      {
        var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.USWest2);

        var options = new DownloadOptions();
        options.StreamTransferProgress += ArchiveDownloadHighLevel.progress;
        // Download an archive.
        Console.WriteLine("Intiating the archive retrieval job and then polling SQS queue for the archive to be available.");
        Console.WriteLine("Once the archive is available, downloading will begin.");
        manager.Download(vaultName, archiveId, downloadFilePath, options);
        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); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }

    static int currentPercentage = -1;
    static void progress(object sender, StreamTransferProgressArgs args)
    {
      if (args.PercentDone != currentPercentage)
      {
        currentPercentage = args.PercentDone;
        Console.WriteLine("Downloaded {0}%", args.PercentDone);
      }
    }
  }
}
```

## Baixando um arquivo usando a API de baixo nível do AWS SDK para .NET
<a name="downloading-an-archive-using-dotnet-lowlevel-api"></a>

Estas são as etapas para fazer download de um arquivo do Amazon Glacier usando a API de nível inferior de AWS SDK para .NET. 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região de onde deseja baixar o arquivo. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região.

1. Inicie um trabalho `archive-retrieval` executando o método `InitiateJob`.

   Você fornece informações do trabalho, como o ID do arquivo cujo download você deseja fazer e o tópico do Amazon SNS no qual deseja que o Amazon Glacier publique uma mensagem de conclusão do trabalho criando uma instância da classe `InitiateJobRequest`. Em resposta, o Amazon Glacier retorna um ID de trabalho. A resposta está disponível em uma instância da classe `InitiateJobResponse`.

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

   Você também pode especificar um intervalo de bytes a fim de solicitar que o Amazon Glacier prepare somente uma parte do arquivo, conforme mostrado na solicitação a seguir. A solicitação especifica que o Amazon Glacier prepare somente o segmento de 1 a 2 MB do arquivo.

   ```
   AmazonGlacierClient client;
   client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2);
   
   
   InitiateJobRequest initJobRequest = new InitiateJobRequest()
   {
     VaultName = vaultName,
     JobParameters = new JobParameters()
     {
       Type      = "archive-retrieval",
       ArchiveId = "*** Provide archive id ***",
       SNSTopic  = "*** Provide Amazon SNS topic ARN ***",
     }
   };
   // Specify byte range.
   int ONE_MEG = 1048576;
   initJobRequest.JobParameters.RetrievalByteRange = string.Format("{0}-{1}", ONE_MEG, 2 * ONE_MEG -1);
   
   InitiateJobResponse initJobResponse = client.InitiateJob(initJobRequest);
   string jobId = initJobResponse.JobId;
   ```

1. Aguarde a conclusão do trabalho .

   Você deve aguardar até a saída do trabalho estar pronta para download. Se você tiver definido uma configuração de notificação no cofre identificando um tópico do Amazon Simple Notiﬁcation Service (Amazon SNS) ou especificado um tópico do Amazon SNS quando tiver iniciado um trabalho, o Amazon Glacier enviará uma mensagem para esse tópico depois de concluir o trabalho. O exemplo de código indicado na seção a seguir usa o Amazon SNS para que o Amazon Glacier publique uma mensagem.

   Você também pode sondar o Amazon Glacier chamando o método `DescribeJob` para determinar o status de conclusão do trabalho. Apesar disso, usar um tópico do Amazon SNS para notificação é a abordagem recomendada. 

1. Faça download da saída do trabalho (dados de arquivo) executando o método `GetJobOutput`.

   Você fornece as informações da solicitação, como o ID de trabalho e o nome do cofre, criando uma instância da classe `GetJobOutputRequest`. A saída retornada pelo Amazon Glacier está disponível no 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);
     }
   }
   ```

   O trecho de código anterior faz download de toda a saída do trabalho. Opcionalmente, você pode recuperar somente uma parte da saída ou fazer download de toda a saída em blocos menores especificando o intervalo de bytes em `GetJobOutputRequest`. 

   ```
   GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
   {
     JobId = jobId,
     VaultName = vaultName
   };
   getJobOutputRequest.SetRange(0, 1048575); // Download only the first 1 MB chunk of the output.
   ```

   Em resposta à chamada `GetJobOutput`, o Amazon Glacier retorna a soma de verificação da parte dos dados obtidos por download, se determinadas condições forem atendidas. Para obter mais informações, consulte [Receber somas de verificação durante o download de dados](checksum-calculations-range.md).

   Para verificar se não há erros no download, você pode computar a soma de verificação no lado do cliente e compará-la com a soma de verificação enviada pelo Amazon Glacier na resposta. 

   Para um trabalho de recuperação de arquivamento com o intervalo opcional especificado, quando você obtém a descrição do trabalho, ela inclui a soma de verificação do intervalo que você está recuperando (SHA256TreeHash). Você pode usar esse valor para verificar ainda mais a precisão de todo o intervalo de bytes que você baixará posteriormente. Por exemplo, se iniciar um trabalho para recuperar um intervalo alinhado ao hash de árvore e fizer download de saída em blocos, de maneira que cada uma das solicitações `GetJobOutput` retorne uma soma de verificação, você poderá computar a soma de verificação de cada parte cujo download você faz no lado do cliente e o hash de árvore. Você pode compará-la com a soma de verificação que o Amazon Glacier retorna em resposta à sua solicitação de descrição de trabalho para verificar se todo o intervalo de bytes que você baixou é igual ao intervalo de bytes armazenado no Amazon Glacier. 

   

   Para obter um exemplo funcional, consulte [Exemplo 2: Recuperação de um arquivamento usando a API de baixo nível da saída AWS SDK para .NET—Download em partes](#creating-vaults-sdk-dotnet-example2).

### Exemplo 1: Recuperando um arquivo usando a API de baixo nível do AWS SDK para .NET
<a name="creating-vaults-sdk-dotnet-example-retrieve"></a>

O exemplo de código do C\$1 a seguir faz download de um arquivo do cofre especificado. Depois que o trabalho for concluído, o exemplo fará download de toda a saída em uma única chamada `GetJobOutput`. Para obter um exemplo de como fazer download de saída em blocos, consulte [Exemplo 2: Recuperação de um arquivamento usando a API de baixo nível da saída AWS SDK para .NET—Download em partes](#creating-vaults-sdk-dotnet-example2).

O exemplo realiza as seguintes tarefas:
+ Configure o tópico do Amazon Simple Notification Service (Amazon SNS) 

  O Amazon Glacier enviará uma notificação para esse tópico depois de concluir o trabalho. 
+ Configure a Fila do Amazon Simple Queue Service (Amazon SQS) 

  O exemplo anexa uma política à fila para permitir que o tópico do Amazon SNS publique mensagens. 
+ Inicia um trabalho para fazer download do arquivo especificado.

  Na solicitação de trabalho, o exemplo especifica o tópico do Amazon SNS, de maneira que o Amazon Glacier possa enviar uma mensagem depois de concluir o trabalho.
+ Verifica periodicamente a fila do Amazon SQS em busca de uma mensagem. 

  Se houver uma mensagem, analise o JSON e verifique se o trabalho foi concluído com êxito. Se for o caso, faça download do arquivo. O exemplo de código usa a biblioteca do JSON.NET (consulte [JSON.NET](http://json.codeplex.com/)) para analisar o JSON.
+ Limpa excluindo o tópico do Amazon SNS e a fila do Amazon SQS criada por ele.

```
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Amazon.Glacier;
using Amazon.Glacier.Model;
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 ArchiveDownloadLowLevelUsingSNSSQS
  {
    static string topicArn;
    static string queueUrl;
    static string queueArn;
    static string vaultName = "*** Provide vault name ***";
    static string archiveID = "*** Provide archive ID ***";
    static string fileName  = "*** Provide the file name and path to where to store downloaded archive ***";
    static AmazonSimpleNotificationServiceClient snsClient;
    static AmazonSQSClient sqsClient;
    const string SQS_POLICY =
        "{" +
        "    \"Version\" : \"2012-10-17\",&TCX5-2025-waiver;" +
        "    \"Statement\" : [" +
        "        {" +
        "            \"Sid\" : \"sns-rule\"," +
        "            \"Effect\" : \"Allow\"," +
        "            \"Principal\" : {\"Service\" : \"sns.amazonaws.com\" }," +
        "            \"Action\"    : \"sqs:SendMessage\"," +
        "            \"Resource\"  : \"{QueueArn}\"," +
        "            \"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("Retrieving...");
          RetrieveArchive(client);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      finally
      {
        // Delete SNS topic and SQS queue.
        snsClient.DeleteTopic(new DeleteTopicRequest() { TopicArn = topicArn });
        sqsClient.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queueUrl });
      }
    }

    static void SetupTopicAndQueue()
    {
      snsClient = new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.USWest2);
      sqsClient = new AmazonSQSClient(Amazon.RegionEndpoint.USWest2);

      long ticks = DateTime.Now.Ticks;
      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 policy to the queue so SNS can send messages to the queue.
      var policy = SQS_POLICY.Replace("{TopicArn}", topicArn).Replace("{QueueArn}", queueArn);

      sqsClient.SetQueueAttributes(new SetQueueAttributesRequest()
      {
          QueueUrl = queueUrl,
          Attributes = new Dictionary<string, string>
          {
              { QueueAttributeName.Policy, policy }
          }
      });
    }

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

      // Check queue for a message and if job completed successfully, download archive.
      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 archive.");

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

### Exemplo 2: Recuperação de um arquivamento usando a API de baixo nível da saída AWS SDK para .NET—Download em partes
<a name="creating-vaults-sdk-dotnet-example2"></a>

O exemplo de código do C\$1 a seguir recupera um arquivo do Amazon Glacier. O exemplo de código faz download da saída do trabalho em blocos especificando o intervalo de bytes em um objeto `GetJobOutputRequest`.

```
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;
using System.Collections.Specialized;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveDownloadLowLevelUsingSQLSNSOutputUsingRange
  {
    static string topicArn;
    static string queueUrl;
    static string queueArn;
    static string vaultName = "*** Provide vault name ***";
    static string archiveId = "*** Provide archive ID ***";
    static string fileName  = "*** Provide the file name and path to where to store downloaded archive ***";
    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("Download archive");
              DownloadAnArchive(archiveId, client);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      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 DownloadAnArchive(string archiveId, AmazonGlacierClient client)
    {
      // Initiate job.
      InitiateJobRequest initJobRequest = new InitiateJobRequest()
      {

        VaultName = vaultName,
        JobParameters = new JobParameters()
        {
          Type = "archive-retrieval",
          ArchiveId = archiveId,
          Description = "This job is to download the archive.",
          SNSTopic = topicArn,
        }
      };
      InitiateJobResponse initJobResponse = client.InitiateJob(initJobRequest);
      string jobId = initJobResponse.JobId;

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

    private static void ProcessQueue(string jobId, AmazonGlacierClient client)
    {
        var 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))
            {
                long archiveSize = Convert.ToInt64(fields["ArchiveSizeInBytes"]);
                Console.WriteLine("Downloading job output");
                DownloadOutput(jobId, archiveSize, client); // This where we 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 archive.");
            jobDone = true;
            sqsClient.DeleteMessage(new DeleteMessageRequest() { QueueUrl = queueUrl, ReceiptHandle = message.ReceiptHandle });
        }
    }               

    private static void DownloadOutput(string jobId, long archiveSize, AmazonGlacierClient client)
    {
      long partSize = 4 * (long)Math.Pow(2, 20);  // 4 MB.
      using (Stream fileToSave = new FileStream(fileName, FileMode.Create, FileAccess.Write))
      {

        long currentPosition = 0;
        do
        {
          GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
          {
            JobId = jobId,
            VaultName = vaultName
          };

          long endPosition = currentPosition + partSize - 1;
          if (endPosition > archiveSize)
            endPosition = archiveSize;

          getJobOutputRequest.SetRange(currentPosition, endPosition);
          GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest);

          using (Stream webStream = getJobOutputResponse.Body)
          {
            CopyStream(webStream, fileToSave);
          }
          currentPosition += partSize;
        } while (currentPosition < archiveSize);
      }
    }

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

# Baixando um arquivo grande usando processamento paralelo com Python
<a name="downloading-large-archive-parallel-python"></a>

Este tópico descreve como baixar um arquivo grande do Amazon S3 Glacier (S3 Glacier) usando processamento paralelo com Python. Essa abordagem permite que você baixe arquivos de qualquer tamanho de forma confiável, dividindo-os em partes menores que podem ser processadas de forma independente.

## Visão geral do
<a name="downloading-large-archive-python-overview"></a>

O script Python fornecido nesse exemplo realiza as seguintes tarefas:

1. Configura os AWS recursos necessários (tópico do Amazon SNS e filas do Amazon SQS) para notificações

1. Inicia um trabalho de recuperação de arquivo com o Amazon Glacier

1. Monitora uma fila do Amazon SQS em busca de notificações de conclusão de trabalho

1. Divide o grande arquivo em partes gerenciáveis

1. Baixa partes em paralelo usando vários threads de trabalho

1. Salva cada pedaço em disco para posterior remontagem

## Pré-requisitos
<a name="downloading-large-archive-python-prerequisites"></a>

Antes de começar, você deve ter o seguinte:
+ Python 3.6 ou superior instalado.
+ AWS SDK para Python (Boto3) instalado
+ AWS credenciais configuradas com as permissões apropriadas para Amazon Glacier, Amazon SNS e Amazon SQS
+ Espaço em disco suficiente para armazenar os pedaços de arquivo baixados

## Exemplo: baixando um arquivo usando processamento paralelo com Python
<a name="downloading-large-archive-python-code"></a>

O script Python a seguir demonstra como fazer o download de um grande arquivo do Amazon Glacier usando processamento paralelo:

```
import boto3
import time
import json
import jmespath
import re
import concurrent.futures
import os

output_file_path = "output_directory_path"
vault_name = "vault_name"

chunk_size = 1000000000 #1gb - size of chunks for parallel download.
notify_queue_name = 'GlacierJobCompleteNotifyQueue' # SQS queue for Glacier recall notification
chunk_download_queue_name='GlacierChunkReadyNotifyQueue' # SQS queue for chunks
sns_topic_name = 'GlacierRecallJobCompleted' # the SNS topic to be notified when Glacier archive is restored.
chunk_queue_visibility_timeout = 7200 # 2 hours - this may need to be adjusted.
region = 'us-east-1'
archive_id = "archive_id_to_restore"
retrieve_archive = True # set to false if you do not want to restore from Glacier - useful for restarting or parallel processing of the chunk queue.
workers = 12 # the number of parallel worker threads for downloading chunks. 

def setup_queues_and_topic():
    sqs = boto3.client('sqs')
    sns = boto3.client('sns')

    # Create the SNS topic
    topic_response = sns.create_topic(
        Name=sns_topic_name
    )
    topic_arn = topic_response['TopicArn']
    print("Creating the SNS topic " + topic_arn)

    # Create the notification queue
    notify_queue_response = sqs.create_queue(
        QueueName=notify_queue_name,
        Attributes={
            'VisibilityTimeout': '300',  # 5 minutes
            'ReceiveMessageWaitTimeSeconds': '20'  # Enable long polling
        }
    )
    notify_queue_url = notify_queue_response['QueueUrl']
    print("Creating the archive-retrieval notification queue " + notify_queue_url)

    # Create the chunk download queue
    chunk_queue_response = sqs.create_queue(
        QueueName=chunk_download_queue_name,
        Attributes={
            'VisibilityTimeout': str(chunk_queue_visibility_timeout),  # 5 minutes
            'ReceiveMessageWaitTimeSeconds': '0'
        }
    )
    chunk_queue_url = chunk_queue_response['QueueUrl']

    print("Creating the chunk ready notification queue " + chunk_queue_url)


   # Get the ARN for the notification queue
    notify_queue_attributes = sqs.get_queue_attributes(
        QueueUrl=notify_queue_url,
        AttributeNames=['QueueArn']
    )
    notify_queue_arn = notify_queue_attributes['Attributes']['QueueArn']

    # Set up the SNS topic policy on the notification queue
    queue_policy = {
        "Version": "2012-10-17",		 	 	 
        "Statement": [{
            "Sid": "allow-sns-messages",
            "Effect": "Allow",
            "Principal": {"AWS": "*"},
            "Action": "SQS:SendMessage",
            "Resource": notify_queue_arn,
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": topic_arn
                }
            }
        }]
    }

    # Set the queue policy
    sqs.set_queue_attributes(
        QueueUrl=notify_queue_url,
        Attributes={
            'Policy': json.dumps(queue_policy)
        }
    )

    # Subscribe the notification queue to the SNS topic
    sns.subscribe(
        TopicArn=topic_arn,
        Protocol='sqs',
        Endpoint=notify_queue_arn
    )

    return {
        'topic_arn': topic_arn,
        'notify_queue_url': notify_queue_url,
        'chunk_queue_url': chunk_queue_url
    }


def split_and_send_chunks(archive_size, job_id,chunk_queue_url):
    ranges = []
    current = 0
    chunk_number = 0

    while current < archive_size:
        chunk_number += 1
        next_range = min(current + chunk_size - 1, archive_size - 1)
        ranges.append((current, next_range, chunk_number))
        current = next_range + 1

    # Send messages to SQS queue
    for start, end, chunk_number in ranges:
        body = {"start": start, "end": end, "job_id": job_id, "chunk_number": chunk_number}
        body = json.dumps(body)
        print("Sending SQS message for range:" + str(body))
        response = sqs.send_message(
            QueueUrl=chunk_queue_url,
            MessageBody=str(body)
        )

def GetJobOutputChunks(job_id, byterange, chunk_number):
    glacier = boto3.client('glacier')
    response = glacier.get_job_output(
        vaultName=vault_name,
        jobId=job_id,
        range=byterange,

    )

    with open(os.path.join(output_file_path,str(chunk_number)+".chunk"), 'wb') as output_file:
        output_file.write(response['body'].read())

    return response

def ReceiveArchiveReadyMessages(notify_queue_url,chunk_queue_url):

    response = sqs.receive_message(
        QueueUrl=notify_queue_url,
        AttributeNames=['All'],
        MaxNumberOfMessages=1,
        WaitTimeSeconds=20,
        MessageAttributeNames=['Message']
    )
    print("Polling archive retrieval job ready queue...")
    # Checking that there is a Messages key before proceeding. No 'Messages' key likely means the queue is empty

    if 'Messages' in response:
        print("Received a message from the archive retrieval job queue")
        jsonresponse = response
        # Loading the string into JSON and checking that ArchiveSizeInBytes key is present before continuing.
        jsonresponse=json.loads(jsonresponse['Messages'][0]['Body'])
        jsonresponse=json.loads(jsonresponse['Message'])
        if 'ArchiveSizeInBytes' in jsonresponse:
            receipt_handle = response['Messages'][0]['ReceiptHandle']    
            if jsonresponse['ArchiveSizeInBytes']:
                archive_size = jsonresponse['ArchiveSizeInBytes']

                print(f'Received message: {response}')      
                if archive_size > chunk_size:
                    split_and_send_chunks(archive_size, jsonresponse['JobId'],chunk_queue_url)

                    sqs.delete_message(
                    QueueUrl=notify_queue_url,
                    ReceiptHandle=receipt_handle)

            else:
                print("No ArchiveSizeInBytes value found in message")
                print(response)

    else:
        print('No messages available in the queue at this time.')

    time.sleep(1)

def ReceiveArchiveChunkMessages(chunk_queue_url):
    response = sqs.receive_message(
        QueueUrl=chunk_queue_url,
        AttributeNames=['All'],
        MaxNumberOfMessages=1,
        WaitTimeSeconds=0,
        MessageAttributeNames=['Message']
    )
    print("Polling archive chunk queue...")
    print(response)
    # Checking that there is a Messages key before proceeding. No 'Messages' key likely means the queue is empty
    if 'Messages' in response:
        jsonresponse = response
        # Loading the string into JSON and checking that ArchiveSizeInBytes key is present before continuing.
        jsonresponse=json.loads(jsonresponse['Messages'][0]['Body'])
        if 'job_id' in jsonresponse: #checking that there is a job id before continuing
            job_id = jsonresponse['job_id']
            byterange = "bytes="+str(jsonresponse['start']) + '-' + str(jsonresponse['end'])
            chunk_number = jsonresponse['chunk_number']
            receipt_handle = response['Messages'][0]['ReceiptHandle']
            if jsonresponse['job_id']:
                print(f'Received message: {response}')
                GetJobOutputChunks(job_id,byterange,chunk_number)
                sqs.delete_message(
                QueueUrl=chunk_queue_url,
                ReceiptHandle=receipt_handle)
    else:
        print('No messages available in the chunk queue at this time.')

def initiate_archive_retrieval(archive_id, topic_arn):
    glacier = boto3.client('glacier')

    job_parameters = {
        "Type": "archive-retrieval",
        "ArchiveId": archive_id,
        "Description": "Archive retrieval job",
        "SNSTopic": topic_arn,
        "Tier": "Bulk"  # You can change this to "Standard" or "Expedited" based on your needs
    }

    try:
        response = glacier.initiate_job(
            vaultName=vault_name,
            jobParameters=job_parameters
        )

        print("Archive retrieval job initiated:")
        print(f"Job ID: {response['jobId']}")
        print(f"Job parameters: {job_parameters}")
        print(f"Complete response: {json.dumps(response, indent=2)}")

        return response['jobId']

    except Exception as e:
        print(f"Error initiating archive retrieval job: {str(e)}")
        raise

def run_async_tasks(chunk_queue_url, workers):
    max_workers = workers  # Set the desired maximum number of concurrent tasks
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        for _ in range(max_workers):
            executor.submit(ReceiveArchiveChunkMessages, chunk_queue_url)

# One time setup of the necessary queues and topics. 
queue_and_topic_atts = setup_queues_and_topic()

topic_arn = queue_and_topic_atts['topic_arn']
notify_queue_url = queue_and_topic_atts['notify_queue_url']
chunk_queue_url = queue_and_topic_atts['chunk_queue_url']

if retrieve_archive:
    print("Retrieving the defined archive... The topic arn we will notify when recalling the archive is: "+topic_arn)
    job_id = initiate_archive_retrieval(archive_id, topic_arn)
else:
    print("Retrieve archive is false, polling queues and downloading only.")

while True:
   ReceiveArchiveReadyMessages(notify_queue_url,chunk_queue_url)
   run_async_tasks(chunk_queue_url,workers)
```

## Uso de um script
<a name="downloading-large-archive-python-usage"></a>

Para usar esse script, siga estas etapas:

1. Substitua os valores de espaço reservado no script por suas informações específicas:
   + *output\$1file\$1path*: Diretório onde os arquivos fragmentados serão salvos
   + *vault\$1name*: Nome do seu cofre S3 Glacier
   + *notify\$1queue\$1name*: Nome da fila de notificação de trabalho
   + *chunk\$1download\$1queue\$1name*: Nome da fila de download do fragmento
   + *sns\$1topic\$1name*: Nome do tópico do SNS
   + *region*: AWS região onde seu cofre está localizado
   + *archive\$1id*: ID do arquivo a ser recuperado

1. Execute o script :

   ```
   python download_large_archive.py
   ```

1. Depois que todos os fragmentos forem baixados, você poderá combiná-los em um único arquivo usando um comando como:

   ```
   cat /path/to/chunks/*.chunk > complete_archive.file
   ```

## Considerações importantes
<a name="downloading-large-archive-python-considerations"></a>

Ao usar esse script, lembre-se do seguinte:
+ A recuperação de arquivo do S3 Glacier pode levar várias horas, dependendo do nível de recuperação selecionado.
+ O script é executado indefinidamente, pesquisando continuamente as filas. Você pode adicionar uma condição de enceramento com base em seus requisitos específicos.
+ Certifique-se de ter espaço em disco suficiente para armazenar todos os fragmentos do seu arquivo.
+ Se o script for interrompido, você poderá reiniciá-lo com `retrieve_archive=False` para continuar baixando fragmentos sem iniciar um novo trabalho de recuperação.
+ Ajuste os *workers* parâmetros *chunk\$1size* e com base na largura de banda da rede e nos recursos do sistema.
+  AWS As cobranças padrão se aplicam às recuperações do Amazon S3, ao uso do Amazon SNS e do Amazon SQS.

# Fazer download de um arquivo usando a API REST
<a name="downloading-an-archive-using-rest"></a>

**Para fazer download de um arquivo usando a API REST**

Fazer download de um arquivo é um processo de duas etapas.

1. Inicie um trabalho do tipo `archive-retrieval`. Para obter mais informações, consulte [Initiate Job (trabalhos POST)](api-initiate-job-post.md).

1. Depois que o trabalho for concluído, faça download dos dados de arquivo. Para obter mais informações, consulte [Get Job Output (GET output)](api-job-output-get.md).

# Baixando um arquivo no Amazon Glacier usando o AWS CLI
<a name="downloading-an-archive-using-cli"></a>

Você pode baixar arquivos no Amazon Glacier (Amazon Glacier) usando AWS Command Line Interface o ().AWS CLI

**Topics**
+ [

## (Pré-requisito) Configurando o AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## Exemplo: Baixe um arquivo usando o AWS CLI
](#Downloading-Archives-CLI-Implementation)

## (Pré-requisito) Configurando o AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Faça download e configure a AWS CLI. Para obter instruções, consulte os seguintes tópicos no *Guia do usuário do AWS Command Line Interface *: 

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

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

1. Verifique sua AWS CLI configuração inserindo os seguintes comandos no prompt de comando. Esses comandos não fornecem as credenciais explicitamente, de modo que as credenciais do perfil padrão são usadas.
   + Tente usar o comando de ajuda.

     ```
     aws help
     ```
   + Para obter uma lista dos cofres do Amazon Glacier na conta configurada, use o comando `list-vaults`. *123456789012*Substitua pelo seu Conta da AWS ID.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Para ver os dados de configuração atuais do AWS CLI, use o `aws configure list` comando.

     ```
     aws configure list
     ```

## Exemplo: Baixe um arquivo usando o AWS CLI
<a name="Downloading-Archives-CLI-Implementation"></a>
**nota**  
Para baixar seus arquivos, você deve saber seus IDs de arquivo. As etapas 1 a 4 recuperar seus IDs de arquivo. Se você já conhece os IDs de arquivo que deseja baixar, vá para a etapa 5.

1. Use o comando `initiate-job` para iniciar um trabalho de recuperação de inventário. O relatório de inventário listará seus IDs de arquivo.

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

    Saída esperada:

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

1. Use o comando `describe-job` para verificar o status do comando de trabalho `` anterior.

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

    Saída esperada:

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

1. Aguarde a conclusão do trabalho .

   Você deve aguardar até a saída do trabalho estar pronta para download. Se você definiu uma configuração de notificação no cofre ou especificou um tópico do Amazon Simple Notiﬁcation Service (Amazon SNS) ao iniciar o trabalho, o Amazon Glacier envia uma mensagem para o tópico depois de concluir o trabalho. 

   É possível definir a configuração de notificação para eventos específicos no cofre. Para obter mais informações, consulte [Configurar notificações do cofre no Amazon Glacier](configuring-notifications.md). O Amazon Glacier enviará uma mensagem para o tópico do SNS especificado sempre que o evento determinado ocorrer.

1. Quando estiver concluído, use o comando `get-job-output` para fazer download do trabalho de recuperação para o arquivo `output.json`. Esse arquivo conterá seus IDs de arquivo. 

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

   Esse comando produz um arquivo com os campos a seguir.

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

1. Use o comando `initiate-job` para iniciar o processo de recuperação de cada arquivo a partir de um cofre. Você precisará especificar o parâmetro do trabalho conforme a `archive-retrieval` mostrada abaixo.

   ```
   aws glacier initiate-job --vault-name awsexamplevault --account-id 111122223333 --job-parameters="{\"Type\":\"archive-retrieval\",\"ArchiveId\":\"*** archiveId ***\"}"
   ```

1. Aguarde a conclusão do trabalho `archive-retrieval`. Use o comando `describe-job` para verificar o status do trabalho de recuperação anterior.

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

1. Quando o trabalho acima estiver concluído, use o comando `get-job-output` para baixar seu arquivo.

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

# Excluir um arquivo no Amazon Glacier
<a name="deleting-an-archive"></a>

Você não pode excluir um arquivo usando o console de gerenciamento do Amazon Glacier. Para excluir um arquivo, você deve usar a AWS Command Line Interface (CLI) ou escrever código para fazer uma solicitação de exclusão usando diretamente a API REST ou as AWS SDK para Java bibliotecas wrapper e.NET. Os tópicos a seguir explicam como usar AWS SDK para Java as bibliotecas wrapper e.NET, a API REST e a. AWS CLI

**Topics**
+ [

# Excluir um arquivo no Amazon Glacier usando o AWS SDK para Java
](deleting-an-archive-using-java.md)
+ [

# Excluindo um arquivo no Amazon Glacier usando o AWS SDK para .NET
](deleting-an-archive-using-dot-net.md)
+ [

# Excluir um arquivo do Amazon Glacier usando a API REST
](deleting-an-archive-using-rest.md)
+ [

# Excluindo um arquivo no Amazon Glacier usando o AWS Command Line Interface
](deleting-an-archive-using-cli.md)

Você pode excluir um arquivo por vez de um cofre. Para excluir o arquivo, você deve fornecer o ID de arquivo na solicitação de exclusão. Você pode obter o ID de arquivo fazendo download do inventário do cofre que contém o arquivo. Para obter mais informações sobre como fazer download do inventário de cofre, consulte [Fazer download de um inventário de cofre no Amazon Glacier](vault-inventory.md). 

Depois de excluir um arquivo, você ainda poderá fazer uma solicitação bem-sucedida para iniciar um trabalho a fim de recuperar o arquivo excluído, mas o trabalho de recuperação de arquivo falhará. 

Recuperações de arquivo que estejam em andamento para um ID de arquivo quando você exclui o arquivo podem ser bem-sucedidas ou não, de acordo com os seguintes cenários:

 
+ Se o trabalho de recuperação de arquivo estiver preparando ativamente os dados para download quando o Amazon Glacier receber a solicitação de exclusão de arquivo, a operação de recuperação de arquivo poderá falhar. 
+ Se o trabalho de recuperação de arquivo tiver preparado com êxito o arquivo para download quando o Amazon Glacier receber a solicitação de exclusão de arquivo, você poderá fazer o download da saída. 

Para obter mais informações sobre recuperação de arquivo, consulte [Baixando um arquivo no Amazon Glacier](downloading-an-archive.md). 

Essa operação é idempotente. Excluir um arquivo já excluído não resulta em um erro. 

Depois de excluir um arquivo, se você fizer o download do inventário de cofre imediatamente, ele poderá incluir o arquivo excluído na lista porque o Amazon Glacier prepara o inventário de cofre somente uma vez por dia.

**nota**  
Para exclusão automática de arquivos do cofre, consulte [Exclusão automática dos arquivos do cofre no Amazon S3 Glacier](https://aws.amazon.com/solutions/guidance/automated-deletion-of-vault-archives-in-amazon-s3-glacier/).

# Excluir um arquivo no Amazon Glacier usando o AWS SDK para Java
<a name="deleting-an-archive-using-java"></a>

Estas são as etapas para excluir um arquivo usando a API de nível inferior do AWS SDK para Java.

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma região da AWS onde o arquivo que deseja excluir está armazenado. Todas as operações realizadas por você usando esse cliente se aplicam a essa regiãoAWS. 

1. Forneça informações sobre a solicitação criando uma instância da classe `DeleteArchiveRequest`.

   Você precisa fornecer um ID de arquivo, um nome de cofre e o ID da conta. Se você não fornecer um ID da conta, o ID da conta associado às credenciais fornecidas por você para assinar a solicitação será pressuposto. Para obter mais informações, consulte [Usando o AWS SDK para Java com o Amazon Glacier](using-aws-sdk-for-java.md).

1. Execute o método `deleteArchive` fornecendo o objeto de solicitação como um parâmetro. 

O trecho de código Java a seguir ilustra as etapas anteriores.

```
AmazonGlacierClient client;

DeleteArchiveRequest request = new DeleteArchiveRequest()
    .withVaultName("*** provide a vault name ***")
    .withArchiveId("*** provide an archive ID ***");

client.deleteArchive(request);
```

 

**nota**  
Para obter informações sobre a API REST subjacente, consulte [Delete Archive (DELETE archive)](api-archive-delete.md).

## Exemplo: excluir um arquivamento usando a AWS SDK para Java
<a name="deleting-an-archive-using-java-example"></a>

O exemplo de código do Java a seguir usa o AWS SDK para Java para excluir um arquivo. Para instruções detalhadas sobre como executar esse exemplo, consulte [Executar exemplos do Java para o Amazon Glacier usando o Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). Você precisa atualizar o código, conforme mostrado, com um nome de cofre e o ID do arquivo que deseja excluir.

**Example**  

```
import java.io.IOException;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.glacier.AmazonGlacierClient;
import com.amazonaws.services.glacier.model.DeleteArchiveRequest;

public class ArchiveDelete {

    public static String vaultName = "*** provide vault name ****";
    public static String archiveId = "*** provide archive ID***";
    public static AmazonGlacierClient client;
    
    public static void main(String[] args) throws IOException {
        
    	ProfileCredentialsProvider credentials = new ProfileCredentialsProvider();

        client = new AmazonGlacierClient(credentials);
        client.setEndpoint("https://glacier.us-east-1.amazonaws.com/");        

        try {

            // Delete the archive.
            client.deleteArchive(new DeleteArchiveRequest()
                .withVaultName(vaultName)
                .withArchiveId(archiveId));
            
            System.out.println("Deleted archive successfully.");
            
        } catch (Exception e) {
            System.err.println("Archive not deleted.");
            System.err.println(e);
        }
    }
}
```

# Excluindo um arquivo no Amazon Glacier usando o AWS SDK para .NET
<a name="deleting-an-archive-using-dot-net"></a>

Tanto o [alto quanto o baixo nível APIs](using-aws-sdk.md) fornecidos pelo Amazon SDK para .NET fornecem um método para excluir um arquivo.

**Topics**
+ [

## Excluindo um arquivo usando a API de alto nível do AWS SDK para .NET
](#delete-archive-using-dot-net-high-level)
+ [

## Excluindo um arquivo usando a API de baixo nível AWS SDK para .NET
](#delete-archive-using-dot-net-low-level)

## Excluindo um arquivo usando a API de alto nível do AWS SDK para .NET
<a name="delete-archive-using-dot-net-high-level"></a>

A classe `ArchiveTransferManager` da API de nível superior fornece o método `DeleteArchive` que você pode usar para excluir um arquivo. 

### Exemplo: excluir um arquivo usando a API de alto nível do AWS SDK para .NET
<a name="delete-archive-dot-net-high-level-example"></a>

O exemplo de código C\$1 a seguir usa a API de alto nível do AWS SDK para .NET para excluir um arquivo. Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). Você precisa atualizar o código conforme mostrado com o ID do arquivo que deseja excluir.

**Example**  

```
using System;
using Amazon.Glacier;
using Amazon.Glacier.Transfer;
using Amazon.Runtime; 

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveDeleteHighLevel
  {
    static string vaultName = "examplevault";
    static string archiveId = "*** Provide archive ID ***";

    public static void Main(string[] args)
    {
      try
      {
        var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.USWest2);
        manager.DeleteArchive(vaultName, archiveId);
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }
  }
}
```

## Excluindo um arquivo usando a API de baixo nível AWS SDK para .NET
<a name="delete-archive-using-dot-net-low-level"></a>

Veja a seguir as etapas para excluir um arquivo usando o AWS SDK para .NET.

 

1. Crie uma instância da classe `AmazonGlacierClient` (o cliente). 

   Você precisa especificar uma AWS região na qual o arquivo que você deseja excluir está armazenado. Todas as operações que você executa usando esse cliente se aplicam a essa AWS região. 

1. Forneça informações sobre a solicitação criando uma instância da classe `DeleteArchiveRequest`.

   Você precisa fornecer um ID de arquivo, um nome de cofre e o ID da conta. Se você não fornecer um ID da conta, o ID da conta associado às credenciais fornecidas por você para assinar a solicitação será pressuposto. Para obter mais informações, consulte [Usando o AWS SDKs com o Amazon Glacier](using-aws-sdk.md).

1. Execute o método `DeleteArchive` fornecendo o objeto de solicitação como um parâmetro. 

### Exemplo: excluir um arquivo usando a API de baixo nível do AWS SDK para .NET
<a name="delete-archive-dot-net-low-level-example"></a>

O exemplo do C\$1 a seguir ilustra as etapas anteriores. O exemplo usa a API de baixo nível do AWS SDK para .NET para excluir um arquivo.

**nota**  
Para obter informações sobre a API REST subjacente, consulte [Delete Archive (DELETE archive)](api-archive-delete.md).

 Para step-by-step obter instruções sobre como executar esse exemplo, consulte[Executar exemplos de código](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). Você precisa atualizar o código conforme mostrado com o ID do arquivo que deseja excluir.

**Example**  

```
using System;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Runtime;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveDeleteLowLevel
  {
    static string vaultName = "examplevault";
    static string archiveId = "*** Provide archive ID ***";

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      try
      {
        using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2))
        {
          Console.WriteLine("Deleting the archive");
          DeleteAnArchive(client);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }

    static void DeleteAnArchive(AmazonGlacierClient client)
    {
      DeleteArchiveRequest request = new DeleteArchiveRequest()
      {
        VaultName = vaultName,
        ArchiveId = archiveId
      };
      DeleteArchiveResponse response = client.DeleteArchive(request);
    }
  }
}
```

# Excluir um arquivo do Amazon Glacier usando a API REST
<a name="deleting-an-archive-using-rest"></a>

Você pode usar a API Delete Archive para excluir um arquivo. 
+ Para obter mais informações sobre a API Delete Archive, consulte [Delete Archive (DELETE archive)](api-archive-delete.md).
+ Para obter informações sobre como usar a API REST, consulte [Referência de API para Amazon Glacier](amazon-glacier-api.md). 

# Excluindo um arquivo no Amazon Glacier usando o AWS Command Line Interface
<a name="deleting-an-archive-using-cli"></a>

Você pode excluir arquivos no Amazon Glacier (Amazon Glacier) usando AWS Command Line Interface o ().AWS CLI

**Topics**
+ [

## (Pré-requisito) Configurando o AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## Exemplo: Excluindo um arquivo usando o AWS CLI
](#Deleting-Archives-CLI-Implementation)

## (Pré-requisito) Configurando o AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Faça download e configure a AWS CLI. Para obter instruções, consulte os seguintes tópicos no *Guia do usuário do AWS Command Line Interface *: 

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

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

1. Verifique sua AWS CLI configuração inserindo os seguintes comandos no prompt de comando. Esses comandos não fornecem as credenciais explicitamente, de modo que as credenciais do perfil padrão são usadas.
   + Tente usar o comando de ajuda.

     ```
     aws help
     ```
   + Para obter uma lista dos cofres do Amazon Glacier na conta configurada, use o comando `list-vaults`. *123456789012*Substitua pelo seu Conta da AWS ID.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Para ver os dados de configuração atuais do AWS CLI, use o `aws configure list` comando.

     ```
     aws configure list
     ```

## Exemplo: Excluindo um arquivo usando o AWS CLI
<a name="Deleting-Archives-CLI-Implementation"></a>

1. Use o comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-job.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-job.html) para iniciar um trabalho de recuperação de inventário.

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

    Saída esperada:

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

1. Use o comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-job.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-job.html) para verificar o status do trabalho de recuperação anterior.

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

    Saída esperada:

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

1. Aguarde a conclusão do trabalho .

   Você deve aguardar até a saída do trabalho estar pronta para download. Se você definiu uma configuração de notificação no cofre ou especificou um tópico do Amazon Simple Notiﬁcation Service (Amazon SNS) ao iniciar o trabalho, o Amazon Glacier envia uma mensagem para o tópico depois de concluir o trabalho. 

   É possível definir a configuração de notificação para eventos específicos no cofre. Para obter mais informações, consulte [Configurar notificações do cofre no Amazon Glacier](configuring-notifications.md). O Amazon Glacier enviará uma mensagem para o tópico do SNS especificado sempre que o evento determinado ocorrer.

1. Quando estiver concluído, use o comando [https://docs.aws.amazon.com/cli/latest/reference/glacier/get-job-output.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/get-job-output.html) para fazer download do trabalho de recuperação para o arquivo `output.json`.

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

   Esse comando produz um arquivo com os campos a seguir.

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

1. Use o comando `delete-archive` para excluir cada arquivamento de um cofre até que não haja mais nenhum.

   ```
   aws glacier delete-archive --vault-name awsexamplevault --account-id 111122223333 --archive-id *** archiveid ***
   ```