

 **Halaman ini hanya untuk pelanggan lama layanan Amazon Glacier menggunakan Vaults dan REST API asli dari 2012.**

Jika Anda mencari solusi penyimpanan arsip, sebaiknya gunakan kelas penyimpanan Amazon Glacier di Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval, dan S3 Glacier Deep Archive. Untuk mempelajari lebih lanjut tentang opsi penyimpanan ini, lihat kelas penyimpanan [Amazon Glacier](https://aws.amazon.com/s3/storage-classes/glacier/).

Amazon Glacier (layanan berbasis brankas mandiri asli) tidak lagi menerima pelanggan baru. Amazon Glacier adalah layanan mandiri dengan miliknya APIs sendiri yang menyimpan data di brankas dan berbeda dari Amazon S3 dan kelas penyimpanan Amazon S3 Glacier. Data Anda yang ada akan tetap aman dan dapat diakses di Amazon Glacier tanpa batas waktu. Tidak diperlukan migrasi. Untuk penyimpanan arsip jangka panjang berbiaya rendah, AWS rekomendasikan kelas [penyimpanan Amazon S3 Glacier](https://aws.amazon.com/s3/storage-classes/glacier/), yang memberikan pengalaman pelanggan yang unggul dengan APIs berbasis ember S3, ketersediaan penuh, biaya lebih rendah, Wilayah AWS dan integrasi layanan. AWS Jika Anda ingin meningkatkan kemampuan, pertimbangkan untuk bermigrasi ke kelas penyimpanan Amazon S3 Glacier dengan menggunakan [Panduan Solusi AWS kami untuk mentransfer data dari kubah Amazon Glacier ke kelas penyimpanan Amazon S3 Glacier](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/).

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Mengunduh Arsip di Amazon Glacier
<a name="downloading-an-archive"></a>

Amazon Glacier menyediakan konsol manajemen, yang dapat Anda gunakan untuk membuat dan menghapus brankas. Namun, Anda tidak dapat mengunduh arsip dari Amazon Glacier dengan menggunakan konsol manajemen. Untuk mengunduh data, seperti foto, video, dan dokumen lainnya, Anda harus menggunakan AWS Command Line Interface (AWS CLI) atau menulis kode untuk membuat permintaan, dengan menggunakan REST API secara langsung atau dengan menggunakan AWS SDKs. 

Untuk informasi tentang penggunaan Amazon Glacier dengan, lihat AWS CLI Referensi AWS CLI untuk [Amazon](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Glacier. Untuk menginstal AWS CLI, lihat [AWS Command Line Interface](https://aws.amazon.com/cli/). Topik berikut menjelaskan cara mengunduh arsip ke Amazon Glacier dengan menggunakan AWS SDK untuk Java, API REST Amazon Glacier, AWS SDK untuk .NET dan Amazon Glacier.

**Topics**
+ [Mengambil Arsip Amazon Glacier](downloading-an-archive-two-steps.md)
+ [Mengunduh Arsip di Amazon Glacier Menggunakan AWS SDK untuk Java](downloading-an-archive-using-java.md)
+ [Mengunduh Arsip di Amazon Glacier Menggunakan AWS SDK untuk .NET](downloading-an-archive-using-dotnet.md)
+ [Mengunduh Arsip Besar Menggunakan Pemrosesan Paralel dengan Python](downloading-large-archive-parallel-python.md)
+ [Mengunduh Arsip dengan Menggunakan REST API](downloading-an-archive-using-rest.md)
+ [Mengunduh Arsip di Amazon Glacier Menggunakan AWS CLI](downloading-an-archive-using-cli.md)

# Mengambil Arsip Amazon Glacier
<a name="downloading-an-archive-two-steps"></a>

Mengambil arsip dari Amazon Glacier adalah operasi asinkron di mana Anda pertama kali memulai pekerjaan, dan kemudian mengunduh output setelah pekerjaan selesai. Untuk memulai pekerjaan pengambilan arsip, Anda menggunakan operasi [Memulai Tugas (POST jobs)](api-initiate-job-post.md) REST API atau yang setara di AWS CLI, atau. AWS SDKs

**Topics**
+ [Opsi Pengambilan Arsip](#api-downloading-an-archive-two-steps-retrieval-options)
+ [Pengambilan Arsip Berkisar](#downloading-an-archive-range)

Mengambil arsip dari Amazon Glacier adalah proses dua langkah. Berikut ini adalah ikhtisar dari proses ini.

**Untuk mengambil arsip**

1. Mulai tugas pengambilan arsip.

   1. Dapatkan ID arsip yang ingin Anda ambil. Anda bisa mendapatkan ID arsip dari inventaris vault. Anda bisa mendapatkan ID arsip dengan REST API, AWS CLI, atau AWS SDKs. Untuk informasi selengkapnya, lihat [Mengunduh Inventaris Vault di Amazon Glacier](vault-inventory.md). 

   1. Memulai pekerjaan yang meminta Amazon Glacier untuk menyiapkan seluruh arsip atau sebagian arsip untuk diunduh berikutnya dengan menggunakan operasi. [Memulai Tugas (POST jobs)](api-initiate-job-post.md) 

   Saat Anda memulai pekerjaan, Amazon Glacier mengembalikan ID pekerjaan dalam respons dan menjalankan pekerjaan secara asinkron. (Anda tidak dapat mengunduh hasil pekerjaan sampai pekerjaan selesai, seperti yang dijelaskan pada Langkah 2.)
**penting**  
Hanya untuk pengambilan Standar, kebijakan pengambilan data dapat menyebabkan `Initiate Job` permintaan Anda gagal dengan pengecualian. `PolicyEnforcedException` Untuk informasi selengkapnya tentang kebijakan pengambilan data, lihat [Kebijakan Pengambilan Data Amazon Glacier](data-retrieval-policy.md). Untuk informasi selengkapnya tentang pengecualian `PolicyEnforcedException`, lihat [Respons Kesalahan](api-error-responses.md).

   Bila diperlukan, Anda dapat memulihkan segmen besar data yang disimpan di Amazon Glacier. Untuk informasi selengkapnya tentang memulihkan data dari kelas penyimpanan Amazon Glacier[, lihat Kelas Penyimpanan untuk Mengarsipkan Objek di Panduan Pengguna Layanan Penyimpanan]( https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier) *Sederhana Amazon*.

1. Setelah pekerjaan selesai, unduh byte dengan menggunakan [Mendapatkan Output Tugas (GET output)](api-job-output-get.md) operasi. 

   Anda dapat mengunduh semua byte atau menentukan rentang byte untuk hanya mengunduh sebagian output tugas. Untuk output yang lebih besar, mengunduh output dalam potongan membantu dalam hal kegagalan unduhan, seperti kegagalan jaringan. Jika Anda mendapatkan output tugas dalam satu permintaan dan terjadi kegagalan jaringan, Anda harus memulai ulang pengunduhan output dari awal. Namun, jika Anda mengunduh output dalam potongan, jika terjadi kegagalan apa pun, Anda hanya perlu memulai ulang unduhan bagian yang lebih kecil dan bukan keseluruhan output. 

Amazon Glacier harus menyelesaikan pekerjaan sebelum Anda bisa mendapatkan hasilnya. Setelah selesai, pekerjaan tidak kedaluwarsa setidaknya 24 jam, yang berarti Anda dapat mengunduh output dalam periode 24 jam setelah pekerjaan selesai. Pemulihan dapat kedaluwarsa kapan saja setelah 24 jam sejak selesainya pekerjaan. Untuk menentukan apakah tugas Anda selesai, periksa statusnya menggunakan salah satu opsi berikut:
+ **Tunggu pemberitahuan penyelesaian pekerjaan** - Anda dapat menentukan topik Amazon Simple Notification Service (Amazon SNS) tempat Amazon Glacier dapat memposting pemberitahuan setelah pekerjaan selesai. Amazon Glacier mengirimkan pemberitahuan hanya setelah menyelesaikan pekerjaan.

  Anda dapat menentukan topik Amazon SNS untuk tugas ketika Anda memulai tugas. Selain menentukan topik Amazon SNS dalam permintaan pekerjaan Anda, jika vault Anda memiliki pemberitahuan yang disetel untuk peristiwa pengambilan arsip, Amazon Glacier juga menerbitkan pemberitahuan ke topik SNS tersebut. Untuk informasi selengkapnya, lihat [Mengkonfigurasi Pemberitahuan Vault di Amazon Glacier](configuring-notifications.md).
+ **Meminta informasi pekerjaan secara eksplisit** — Anda juga dapat menggunakan operasi Amazon `Describe Job` Glacier API [Mendeskripsikan Tugas (GET JobID)](api-describe-job-get.md) () untuk melakukan polling secara berkala untuk informasi pekerjaan. Namun, sebaiknya gunakan notifikasi Amazon SNS.

**catatan**  
Informasi yang Anda dapatkan dengan menggunakan notifikasi Amazon SNS sama dengan apa yang Anda dapatkan dengan memanggil operasi `Describe Job` API. 

## Opsi Pengambilan Arsip
<a name="api-downloading-an-archive-two-steps-retrieval-options"></a>

Saat memulai pekerjaan untuk mengambil arsip, Anda dapat menentukan salah satu opsi pengambilan berikut, berdasarkan waktu akses dan persyaratan biaya Anda. Untuk informasi tentang harga pengambilan, lihat Harga [Amazon Glacier](https://aws.amazon.com/s3/glacier/pricing/).
+ Dipercepat - **Pengambilan** yang dipercepat memungkinkan Anda mengakses data dengan cepat yang disimpan di kelas penyimpanan S3 Glacier Flexible Retrieval atau tingkat Akses Arsip Tingkat Cerdas S3 ketika permintaan mendesak sesekali untuk memulihkan arsip diperlukan. Untuk semua kecuali arsip terbesar (lebih dari 250 MB), data yang diakses dengan menggunakan Expedited retrievals biasanya tersedia dalam 1-5 menit. Kapasitas yang disediakan memastikan bahwa kapasitas pengambilan untuk pengambilan yang dipercepat tersedia saat Anda membutuhkannya. Untuk informasi selengkapnya, lihat [Kapasitas yang Disediakan](#api-downloading-an-archive-two-steps-retrieval-expedited-capacity). 
+ **Standar** — Pengambilan standar memungkinkan Anda mengakses arsip Anda dalam beberapa jam. Pengambilan standar biasanya diselesaikan dalam waktu 3-5 jam. Standar adalah opsi default untuk permintaan pengambilan yang tidak menentukan opsi pengambilan.
+ **Massal** — Pengambilan massal adalah opsi pengambilan Amazon Glacier dengan biaya terendah, yang dapat Anda gunakan untuk mengambil data dalam jumlah besar, bahkan petabyte, dengan harga murah dalam sehari. Pengambilan massal biasanya diselesaikan dalam waktu 5-12 jam.

Tabel berikut merangkum opsi pengambilan arsip. Untuk informasi lebih lanjut tenngenai harga, lihat [harga Amazon Glacier](https://aws.amazon.com/s3/glacier/pricing/).


| Layanan | Expedited | Standard | Bulk | 
| --- | --- | --- | --- | 
|  Amazon Glacier  |  1–5 menit  |  3–5 jam  |  5–12 jam  | 

Untuk membuat`Expedited`,`Standard`, atau `Bulk` pengambilan, setel elemen `Tier` permintaan dalam permintaan operasi [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html)REST API ke opsi yang Anda inginkan, atau yang setara dalam AWS Command Line Interface (AWS CLI) atau AWS SDKs. Jika Anda sudah membeli kapasitas yang disediakan, semua pengambilan akan secara otomatis dilayani melalui kapasitas tersebut. 

### Kapasitas yang Disediakan
<a name="api-downloading-an-archive-two-steps-retrieval-expedited-capacity"></a>

Kapasitas yang disediakan membantu memastikan bahwa kapasitas pengambilan Anda untuk pengambilan yang Dipercepat tersedia saat Anda membutuhkannya. Setiap unit kapasitas menyediakan bahwa setidaknya tiga Expedited retrievals dapat dilakukan setiap 5 menit dan menyediakan hingga 150 megabyte per detik () throughput pengambilan. MBps

Jika beban kerja Anda memerlukan akses yang sangat andal dan dapat diprediksi ke subset data Anda dalam hitungan menit, sebaiknya Anda membeli kapasitas pengambilan yang disediakan. Tanpa kapasitas yang disediakan, pengambilan yang dipercepat biasanya diterima, kecuali untuk situasi langka dengan permintaan yang luar biasa tinggi. Namun, jika Anda memerlukan akses ke Pengambilan yang dipercepat dalam segala situasi, Anda harus membeli kapasitas pengambilan yang disediakan. 

#### Membeli Kapasitas yang Disediakan
<a name="downloading-an-archive-purchase-provisioned-capacity"></a>

Anda dapat membeli unit kapasitas yang disediakan dengan menggunakan konsol Amazon Glacier, operasi REST API, [Membeli Kapasitas yang Disediakan (GET provisioned-capacity)](api-PurchaseProvisionedCapacity.md) atau. AWS SDKs AWS CLI Untuk informasi harga kapasitas yang disediakan, lihat Harga Amazon [Glacier](https://aws.amazon.com/s3/glacier/pricing/). 

Unit kapasitas yang disediakan berlangsung selama satu bulan, mulai dari tanggal dan waktu pembelian.

Jika tanggal mulai adalah tanggal 31, tanggal kedaluwarsa adalah hari terakhir bulan berikutnya. Misalnya, jika tanggal mulai adalah 31 Agustus, tanggal kedaluwarsa adalah 30 September. Jika tanggal mulai 31 Januari, tanggal kedaluwarsa adalah 28 Februari.

**Untuk membeli kapasitas yang disediakan dengan menggunakan konsol Amazon Glacier**

1.  [Masuk ke Konsol Manajemen AWS dan buka konsol Amazon Glacier di rumah. https://console.aws.amazon.com/glacier/](https://console.aws.amazon.com/glacier/home)

1. Di panel navigasi kiri, pilih Pengaturan **pengambilan data**.

1. Di bawah **Unit kapasitas yang disediakan (PCUs)**, pilih **Beli** PCU. Kotak dialog **Pembelian PCU** muncul.

1. Jika Anda ingin membeli kapasitas yang disediakan, masukkan kotak **confirm** **Untuk mengonfirmasi pembelian**.

1.  Pilih **Beli PCU**. 

## Pengambilan Arsip Berkisar
<a name="downloading-an-archive-range"></a>

Ketika Anda mengambil arsip dari Amazon Glacier, Anda dapat secara opsional menentukan rentang, atau bagian, dari arsip yang diambil. Default-nya adalah mengambil seluruh arsip. Menentukan rentang byte dapat membantu ketika Anda ingin melakukan hal berikut:
+ **Kelola unduhan data Anda** — Amazon Glacier memungkinkan data yang diambil untuk diunduh selama 24 jam setelah permintaan pengambilan selesai. Oleh karena itu, Anda mungkin hanya ingin mengambil bagian dari arsip sehingga Anda dapat mengelola jadwal unduhan dalam jendela unduhan yang diberikan.
+ **Mengambil bagian yang ditargetkan dari arsip besar** – Sebagai contoh, misalkan Anda sebelumnya sudah mengumpulkan banyak file dan mengunggahnya sebagai arsip tunggal, dan sekarang Anda ingin mengambil beberapa file. Dalam hal ini, Anda dapat menentukan rentang arsip yang berisi file yang Anda minati dengan menggunakan satu permintaan pengambilan. Atau, Anda dapat memulai beberapa permintaan pengambilan, masing-masing dengan rentang untuk satu atau beberapa file.

Ketika memulai tugas pengambilan menggunakan pengambilan rentang, Anda harus memberikan rentang yang selaras dengan megabyte. Dengan kata lain, rentang byte dapat dimulai dari nol (awal arsip Anda), atau pada interval 1-MB sesudahnya (1 MB, 2 MB, 3 MB, dan seterusnya). 

Akhir rentang dapat menjadi akhir arsip Anda atau interval 1 MB lebih besar dari awal rentang Anda. Selanjutnya, jika Anda ingin mendapatkan nilai checksum saat mengunduh data (setelah pekerjaan pengambilan selesai), rentang yang Anda minta dalam inisiasi pekerjaan juga harus disejajarkan dengan hash pohon. Anda dapat menggunakan checksum untuk membantu memastikan bahwa data Anda tidak rusak selama transmisi. Untuk informasi selengkapnya tentang penyelarasan megabyte dan penyelarasan hash pohon, lihat[Menerima Checksum Saat Mengunduh Data](checksum-calculations-range.md). 

# Mengunduh Arsip di Amazon Glacier Menggunakan AWS SDK untuk Java
<a name="downloading-an-archive-using-java"></a>

Baik [tingkat tinggi dan tingkat rendah](using-aws-sdk.md) yang APIs disediakan oleh Amazon SDK for Java menyediakan metode untuk mengunduh arsip.

**Topics**
+ [Mengunduh Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java](#downloading-an-archive-using-java-highlevel-api)
+ [Mengunduh Arsip Menggunakan API Tingkat Rendah AWS SDK untuk Java](#downloading-an-archive-using-java-lowlevel-api)

## Mengunduh Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java
<a name="downloading-an-archive-using-java-highlevel-api"></a>

Kelas `ArchiveTransferManager` dari API tingkat tinggi menyediakan metode `download` yang dapat Anda gunakan untuk mengunduh arsip. 

**penting**  
Kelas `ArchiveTransferManager` membuat topik Amazon Simple Notification Service (Amazon SNS) dan antrean Amazon Simple Queue Service (Amazon SQS) yang berlangganan topik tersebut. Kelas tersebut selanjutnya memulai tugas pengambilan arsip dan melakukan polling antrean untuk arsip yang akan tersedia. Ketika arsip tersedia, unduhan dimulai. Untuk informasi tentang waktu pengambilan, lihat [Opsi Pengambilan Arsip](downloading-an-archive-two-steps.md#api-downloading-an-archive-two-steps-retrieval-options).

### Contoh: Mengunduh Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java
<a name="download-archives-java-highlevel-example"></a>

Contoh kode Java berikut mengunduh arsip dari vault (`examplevault`) di Wilayah US West (Oregon) (`us-west-2`).

Untuk step-by-step instruksi untuk menjalankan sampel ini, lihat[Menjalankan Contoh Java untuk Amazon Glacier Menggunakan Eclipse](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java). Anda perlu memperbarui kode seperti yang ditunjukkan dengan ID arsip yang ada dan jalur file lokal tempat Anda ingin menyimpan arsip yang diunduh.

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

## Mengunduh Arsip Menggunakan API Tingkat Rendah AWS SDK untuk Java
<a name="downloading-an-archive-using-java-lowlevel-api"></a>

Berikut adalah langkah-langkah untuk mengambil inventaris vault menggunakan API tingkat rendah AWS SDK untuk Java . 

 

1. Buat instans dari kelas `AmazonGlacierClient` (klien). 

   Anda perlu menentukan AWS Wilayah dari mana Anda ingin mengunduh arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Mulai tugas `archive-retrieval` dengan menjalankan metode `initiateJob`.

   Anda memberikan informasi pekerjaan, seperti ID arsip arsip yang ingin Anda unduh dan topik Amazon SNS opsional yang Anda inginkan Amazon Glacier (Amazon Glacier) untuk memposting pesan penyelesaian pekerjaan, dengan membuat instance kelas. `InitiateJobRequest` Amazon Glacier mengembalikan ID pekerjaan sebagai tanggapan. Respons tersedia dalam instans dari kelas `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();
   ```

   Anda dapat secara opsional menentukan rentang byte untuk meminta Amazon Glacier untuk menyiapkan hanya sebagian dari arsip. Misalnya, Anda dapat memperbarui permintaan sebelumnya dengan menambahkan pernyataan berikut untuk meminta Amazon Glacier untuk menyiapkan hanya 1 MB hingga 2 MB bagian arsip.

    

   ```
   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. Tunggu hingga tugas selesai.

   Anda harus menunggu hingga output tugas siap diunduh. Jika Anda telah menyetel konfigurasi notifikasi di vault yang mengidentifikasi topik Amazon Simple Notification Service (Amazon SNS) atau menetapkan topik Amazon SNS saat memulai pekerjaan, Amazon Glacier akan mengirimkan pesan ke topik tersebut setelah menyelesaikan pekerjaan. 

   Anda juga dapat melakukan polling Amazon Glacier dengan memanggil `describeJob` metode untuk menentukan status penyelesaian pekerjaan. Meskipun, menggunakan topik Amazon SNS untuk notifikasi adalah pendekatan yang disarankan.

1. Unduh output tugas (data arsip) dengan menjalankan metode `getJobOutput`.

   Anda memberikan informasi permintaan seperti ID tugas dan nama vault dengan membuat instans dari kelas `GetJobOutputRequest`. Output yang dikembalikan Amazon Glacier tersedia di objek. `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.
   ```

   Potongan kode sebelumnya mengunduh seluruh output tugas. Anda secara opsional dapat mengambil hanya sebagian output, atau mengunduh seluruh output dalam potongan yang lebih kecil dengan menentukan rentang byte di `GetJobOutputRequest` Anda. 

    

   ```
   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 ****");
   ```

   Menanggapi `GetJobOutput` panggilan Anda, Amazon Glacier mengembalikan checksum bagian data yang Anda unduh, jika kondisi tertentu terpenuhi. Untuk informasi selengkapnya, lihat [Menerima Checksum Saat Mengunduh Data](checksum-calculations-range.md).

   Untuk memverifikasi tidak ada kesalahan dalam unduhan, Anda kemudian dapat menghitung checksum di sisi klien dan membandingkannya dengan checksum Amazon Glacier yang dikirim dalam respons. 

   Untuk pekerjaan pengambilan arsip dengan rentang opsional yang ditentukan, ketika Anda mendapatkan deskripsi pekerjaan, itu termasuk checksum dari rentang yang Anda ambil (). SHA256 TreeHash Anda dapat menggunakan nilai ini untuk memverifikasi lebih lanjut akurasi seluruh rentang byte yang Anda unduh selanjutnya. Misalnya, jika Anda memulai tugas untuk mengambil rentang arsip hash pohon selaras, lalu mengunduh output dalam potongan sehingga masing-masing permintaan `GetJobOutput` Anda mengembalikan checksum, Anda dapat menghitung checksum setiap bagian yang Anda unduh di sisi klien, lalu menghitung hash pohon. Anda dapat membandingkannya dengan pengembalian Amazon Glacier checksum sebagai tanggapan atas permintaan pekerjaan deskripsikan Anda untuk memverifikasi bahwa seluruh rentang byte yang telah Anda unduh sama dengan rentang byte yang disimpan di Amazon Glacier. 

    Untuk contoh pekerjaan, lihat [Contoh 2: Mengambil Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk Java—Download Output in Chunks](#downloading-an-archive-with-range-using-java-example). 

### Contoh 1: Mengambil Arsip Menggunakan API Tingkat Rendah AWS SDK untuk Java
<a name="downloading-an-archive-using-java-example"></a>

Contoh kode Java berikut mengunduh arsip dari vault yang ditentukan. Setelah tugas selesai, contoh mengunduh seluruh output dalam satu panggilan `getJobOutput`. Untuk contoh mengunduh output dalam potongan, lihat [Contoh 2: Mengambil Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk Java—Download Output in Chunks](#downloading-an-archive-with-range-using-java-example).

Contoh tersebut melakukan tugas-tugas berikut:

 
+ Membuat topik Amazon Simple Notification Service (Amazon SNS).

  Amazon Glacier mengirimkan pemberitahuan ke topik ini setelah menyelesaikan pekerjaan. 
+ Membuat antrean Amazon Simple Queue Service (Amazon SQS).

  Contoh melampirkan kebijakan ke antrean untuk mengizinkan topik Amazon SNS mengirim pesan ke antrean.
+ Memulai tugas untuk mengunduh arsip yang ditentukan.

  Dalam permintaan pekerjaan, topik Amazon SNS yang dibuat ditentukan sehingga Amazon Glacier dapat mempublikasikan pemberitahuan ke topik setelah menyelesaikan pekerjaan.
+ Memeriksa antrean Amazon SQS secara berkala untuk pesan yang berisi ID tugas.

  Jika ada pesan, urai JSON dan periksa apakah tugas berhasil diselesaikan. Jika ya, unduh arsipnya. 
+ Membersihkan dengan menghapus topik Amazon SNS dan antrean Amazon SQS yang dibuat.

 

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

### Contoh 2: Mengambil Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk Java—Download Output in Chunks
<a name="downloading-an-archive-with-range-using-java-example"></a>

Contoh kode Java berikut mengambil arsip dari Amazon Glacier. Contoh kode mengunduh output tugas dalam potongan dengan menentukan rentang byte dalam objek `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));
    }
}
```

# Mengunduh Arsip di Amazon Glacier Menggunakan AWS SDK untuk .NET
<a name="downloading-an-archive-using-dotnet"></a>

Baik [tingkat tinggi dan tingkat rendah](using-aws-sdk.md) yang APIs disediakan oleh Amazon SDK untuk.NET menyediakan metode untuk mengunduh arsip.

**Topics**
+ [Mengunduh Arsip Menggunakan API Tingkat Tinggi dari AWS SDK untuk .NET](#downloading-an-archive-using-dotnet-highlevel-api)
+ [Mengunduh Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk .NET](#downloading-an-archive-using-dotnet-lowlevel-api)

## Mengunduh Arsip Menggunakan API Tingkat Tinggi dari AWS SDK untuk .NET
<a name="downloading-an-archive-using-dotnet-highlevel-api"></a>

Kelas `ArchiveTransferManager` dari API tingkat tinggi menyediakan metode `Download` yang dapat Anda gunakan untuk mengunduh arsip. 

**penting**  
Kelas `ArchiveTransferManager` membuat topik Amazon Simple Notification Service (Amazon SNS) dan antrean Amazon Simple Queue Service (Amazon SQS) yang berlangganan topik tersebut. Kelas tersebut selanjutnya memulai tugas pengambilan arsip dan melakukan polling antrean untuk arsip yang akan tersedia. Ketika arsip tersedia, unduhan dimulai. Untuk informasi tentang waktu pengambilan, lihat [Opsi Pengambilan Arsip](downloading-an-archive-two-steps.md#api-downloading-an-archive-two-steps-retrieval-options)

### Contoh: Mengunduh Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET
<a name="download-archives-dotnet-highlevel-example"></a>

Contoh kode C\$1 berikut mengunduh arsip dari vault (`examplevault`) di Wilayah US West (Oregon). 

Untuk step-by-step petunjuk tentang cara menjalankan contoh ini, lihat[Menjalankan Contoh Kode](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet). Anda perlu memperbarui kode seperti yang ditunjukkan dengan ID arsip yang ada dan jalur file lokal tempat Anda ingin menyimpan arsip yang diunduh.

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

namespace glacier.amazon.com.rproxy.govskope.us.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);
      }
    }
  }
}
```

## Mengunduh Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk .NET
<a name="downloading-an-archive-using-dotnet-lowlevel-api"></a>

Berikut ini adalah langkah-langkah untuk mengunduh arsip Amazon Glacier (Amazon Glacier) menggunakan API tingkat rendah. AWS SDK untuk .NET

1. Buat instans dari kelas `AmazonGlacierClient` (klien). 

   Anda perlu menentukan AWS Wilayah dari mana Anda ingin mengunduh arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut.

1. Mulai tugas `archive-retrieval` dengan menjalankan metode `InitiateJob`.

   Anda memberikan informasi pekerjaan, seperti ID arsip arsip yang ingin Anda unduh dan topik Amazon SNS opsional yang Anda inginkan Amazon Glacier untuk memposting pesan penyelesaian pekerjaan, dengan membuat instance kelas. `InitiateJobRequest` Amazon Glacier mengembalikan ID pekerjaan sebagai tanggapan. Respons tersedia dalam instans dari kelas `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;
   ```

   Anda dapat secara opsional menentukan rentang byte untuk meminta Amazon Glacier untuk menyiapkan hanya sebagian dari arsip seperti yang ditunjukkan dalam permintaan berikut. Permintaan menentukan Amazon Glacier untuk menyiapkan hanya 1 MB hingga 2 MB bagian arsip.

   ```
   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. Tunggu hingga tugas selesai.

   Anda harus menunggu hingga output tugas siap diunduh. Jika Anda telah menyetel konfigurasi notifikasi di vault yang mengidentifikasi topik Amazon Simple Notification Service (Amazon SNS) atau menetapkan topik Amazon SNS saat memulai pekerjaan, Amazon Glacier akan mengirimkan pesan ke topik tersebut setelah menyelesaikan pekerjaan. Contoh kode yang diberikan di bagian berikut menggunakan Amazon SNS untuk Amazon Glacier untuk mempublikasikan pesan.

   Anda juga dapat melakukan polling Amazon Glacier dengan memanggil `DescribeJob` metode untuk menentukan status penyelesaian pekerjaan. Meskipun, menggunakan topik Amazon SNS untuk notifikasi adalah pendekatan yang disarankan. 

1. Unduh output tugas (data arsip) dengan menjalankan metode `GetJobOutput`.

   Anda memberikan informasi permintaan seperti ID tugas dan nama vault dengan membuat instans dari kelas `GetJobOutputRequest`. Output yang dikembalikan Amazon Glacier tersedia di objek. `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);
     }
   }
   ```

   Potongan kode sebelumnya mengunduh seluruh output tugas. Anda secara opsional dapat mengambil hanya sebagian output, atau mengunduh seluruh output dalam potongan yang lebih kecil dengan menentukan rentang byte di `GetJobOutputRequest` Anda. 

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

   Menanggapi `GetJobOutput` panggilan Anda, Amazon Glacier mengembalikan checksum bagian data yang Anda unduh, jika kondisi tertentu terpenuhi. Untuk informasi selengkapnya, lihat [Menerima Checksum Saat Mengunduh Data](checksum-calculations-range.md).

   Untuk memverifikasi tidak ada kesalahan dalam unduhan, Anda kemudian dapat menghitung checksum di sisi klien dan membandingkannya dengan checksum Amazon Glacier yang dikirim dalam respons. 

   Untuk pekerjaan pengambilan arsip dengan rentang opsional yang ditentukan, ketika Anda mendapatkan deskripsi pekerjaan, itu termasuk checksum dari rentang yang Anda ambil (SHA256TreeHash) .Anda dapat menggunakan nilai ini untuk memverifikasi lebih lanjut keakuratan seluruh rentang byte yang kemudian Anda unduh. Misalnya, jika Anda memulai tugas untuk mengambil rentang arsip hash pohon selaras, lalu mengunduh output dalam potongan sehingga masing-masing permintaan `GetJobOutput` Anda mengembalikan checksum, Anda dapat menghitung checksum setiap bagian yang Anda unduh di sisi klien, lalu menghitung hash pohon. Anda dapat membandingkannya dengan pengembalian Amazon Glacier checksum sebagai tanggapan atas permintaan pekerjaan deskripsikan Anda untuk memverifikasi bahwa seluruh rentang byte yang telah Anda unduh sama dengan rentang byte yang disimpan di Amazon Glacier. 

   

   Untuk contoh pekerjaan, lihat [Contoh 2: Mengambil Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk .NET—Download Output in Chunks](#creating-vaults-sdk-dotnet-example2).

### Contoh 1: Mengambil Arsip Menggunakan API Tingkat Rendah AWS SDK untuk .NET
<a name="creating-vaults-sdk-dotnet-example-retrieve"></a>

Contoh kode C\$1 berikut mengunduh arsip dari vault yang ditentukan. Setelah tugas selesai, contoh mengunduh seluruh output dalam satu panggilan `GetJobOutput`. Untuk contoh mengunduh output dalam potongan, lihat [Contoh 2: Mengambil Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk .NET—Download Output in Chunks](#creating-vaults-sdk-dotnet-example2).

Contoh tersebut melakukan tugas-tugas berikut:
+ Menyiapkan topik Amazon Simple Notification Service (Amazon SNS) 

  Amazon Glacier mengirimkan pemberitahuan ke topik ini setelah menyelesaikan pekerjaan. 
+ Menyiapkan antrean Amazon Simple Queue Service (Amazon SQS). 

  Contoh melampirkan kebijakan ke antrean untuk mengizinkan topik Amazon SNS mengirim pesan. 
+ Memulai tugas untuk mengunduh arsip yang ditentukan.

  Dalam permintaan pekerjaan, contoh menentukan topik Amazon SNS sehingga Amazon Glacier dapat mengirim pesan setelah menyelesaikan pekerjaan.
+ Memeriksa antrean Amazon SQS secara berkala untuk pesan. 

  Jika ada pesan, urai JSON dan periksa apakah tugas berhasil diselesaikan. Jika ya, unduh arsipnya. Contoh kode menggunakan pustaka JSON.NET (lihat [JSON.NET](http://json.codeplex.com/)) untuk mengurai JSON.
+ Membersihkan dengan menghapus topik Amazon SNS dan antrean Amazon SQS yang dibuat.

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

### Contoh 2: Mengambil Arsip Menggunakan API Tingkat Rendah dari AWS SDK untuk .NET—Download Output in Chunks
<a name="creating-vaults-sdk-dotnet-example2"></a>

Contoh kode C \$1 berikut mengambil arsip dari Amazon Glacier. Contoh kode mengunduh output tugas dalam potongan dengan menentukan rentang byte dalam objek `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.us.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);
      }
    }
  }
}
```

# Mengunduh Arsip Besar Menggunakan Pemrosesan Paralel dengan Python
<a name="downloading-large-archive-parallel-python"></a>

Topik ini menjelaskan cara mengunduh arsip besar dari Amazon S3 Glacier (S3 Glacier) menggunakan pemrosesan paralel dengan Python. Pendekatan ini memungkinkan Anda mengunduh arsip dengan ukuran berapa pun dengan memecahnya menjadi potongan-potongan kecil yang dapat diproses secara independen.

## Ikhtisar
<a name="downloading-large-archive-python-overview"></a>

Skrip Python yang disediakan dalam contoh ini melakukan tugas-tugas berikut:

1. Menetapkan AWS sumber daya yang diperlukan (topik Amazon SNS dan antrian Amazon SQS) untuk pemberitahuan

1. Memulai pekerjaan pengambilan arsip dengan Amazon Glacier

1. Memantau antrian Amazon SQS untuk pemberitahuan penyelesaian pekerjaan

1. Membagi arsip besar menjadi potongan-potongan yang dapat dikelola

1. Mengunduh potongan secara paralel menggunakan beberapa utas pekerja

1. Menyimpan setiap potongan ke disk untuk dipasang kembali nanti

## Prasyarat
<a name="downloading-large-archive-python-prerequisites"></a>

Sebelum memulai, pastikan Anda memiliki:
+ Python 3.6 atau yang lebih baru diinstal
+ AWS SDK untuk Python (Boto3) diinstal
+ AWS kredensional yang dikonfigurasi dengan izin yang sesuai untuk Amazon Glacier, Amazon SNS, dan Amazon SQS
+ Ruang disk yang cukup untuk menyimpan potongan arsip yang diunduh

## Contoh: Mengunduh Arsip Menggunakan Pemrosesan Paralel dengan Python
<a name="downloading-large-archive-python-code"></a>

Skrip Python berikut menunjukkan cara mengunduh arsip besar dari Amazon Glacier menggunakan pemrosesan paralel:

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

## Menggunakan Script
<a name="downloading-large-archive-python-usage"></a>

Untuk menggunakan skrip ini, ikuti langkah-langkah berikut:

1. Ganti nilai placeholder dalam skrip dengan informasi spesifik Anda:
   + *output\$1file\$1path*: Direktori tempat file chunk akan disimpan
   + *vault\$1name*: Nama lemari besi S3 Glacier Anda
   + *notify\$1queue\$1name*: Nama untuk antrian pemberitahuan pekerjaan
   + *chunk\$1download\$1queue\$1name*: Nama untuk antrian unduhan potongan
   + *sns\$1topic\$1name*: Nama untuk topik SNS
   + *region*: AWS wilayah tempat lemari besi Anda berada
   + *archive\$1id*: ID arsip untuk mengambil

1. Jalankan skrip .

   ```
   python download_large_archive.py
   ```

1. Setelah semua potongan diunduh, Anda dapat menggabungkannya menjadi satu file menggunakan perintah seperti:

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

## Pertimbangan Penting
<a name="downloading-large-archive-python-considerations"></a>

Saat menggunakan skrip ini, ingatlah hal berikut:
+ Pengambilan arsip dari S3 Glacier dapat memakan waktu beberapa jam untuk diselesaikan, tergantung pada tingkat pengambilan yang dipilih.
+ Skrip berjalan tanpa batas waktu, terus melakukan polling antrian. Anda mungkin ingin menambahkan kondisi penghentian berdasarkan persyaratan spesifik Anda.
+ Pastikan Anda memiliki ruang disk yang cukup untuk menyimpan semua potongan arsip Anda.
+ Jika skrip terputus, Anda dapat memulai ulang dengan `retrieve_archive=False` untuk terus mengunduh potongan tanpa memulai pekerjaan pengambilan baru.
+ Sesuaikan *chunk\$1size* dan *workers* parameter berdasarkan bandwidth jaringan dan sumber daya sistem Anda.
+  AWS Biaya standar berlaku untuk pengambilan Amazon S3, Amazon SNS, dan penggunaan Amazon SQS.

# Mengunduh Arsip dengan Menggunakan REST API
<a name="downloading-an-archive-using-rest"></a>

**Untuk mengunduh arsip menggunakan REST API**

Mengunduh arsip adalah proses dua langkah.

1. Mulai tugas dari tipe `archive-retrieval`. Untuk informasi selengkapnya, lihat [Memulai Tugas (POST jobs)](api-initiate-job-post.md).

1. Setelah pekerjaan selesai, unduh data arsip. Lihat informasi yang lebih lengkap di [Mendapatkan Output Tugas (GET output)](api-job-output-get.md).

# Mengunduh Arsip di Amazon Glacier Menggunakan AWS CLI
<a name="downloading-an-archive-using-cli"></a>

Anda dapat mengunduh arsip di Amazon Glacier (Amazon Glacier) menggunakan (). AWS Command Line Interface AWS CLI

**Topics**
+ [(Prasyarat) Menyiapkan AWS CLI](#Creating-Vaults-CLI-Setup)
+ [Contoh: Unduh Arsip Menggunakan AWS CLI](#Downloading-Archives-CLI-Implementation)

## (Prasyarat) Menyiapkan AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1. Unduh dan konfigurasikan AWS CLI. Untuk melakukannya, lihat topik berikut di *Panduan Pengguna AWS Command Line Interface *: 

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

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

1. Verifikasi AWS CLI pengaturan Anda dengan memasukkan perintah berikut pada prompt perintah. Perintah ini tidak memberikan kredensial secara eksplisit, sehingga kredensial profil default digunakan.
   + Coba gunakan perintah bantuan.

     ```
     aws help
     ```
   + Untuk mendapatkan daftar brankas Amazon Glacier pada akun yang dikonfigurasi, gunakan perintah. `list-vaults` Ganti *123456789012* dengan Akun AWS ID Anda.

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + Untuk melihat data konfigurasi saat ini untuk AWS CLI, gunakan `aws configure list` perintah.

     ```
     aws configure list
     ```

## Contoh: Unduh Arsip Menggunakan AWS CLI
<a name="Downloading-Archives-CLI-Implementation"></a>
**catatan**  
Untuk mengunduh arsip Anda, Anda harus mengetahui id arsip Anda. Langkah 1-4 akan mengambil id arsip Anda. Jika Anda sudah mengetahui id arsip yang ingin Anda unduh, lewati ke langkah 5.

1. Gunakan `initiate-job` perintah untuk memulai pekerjaan pengambilan inventaris. Laporan inventaris akan mencantumkan id arsip Anda.

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

    Keluaran yang diharapkan

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

1. Gunakan `describe-job` perintah untuk memeriksa status perintah `` pekerjaan sebelumnya.

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

    Keluaran yang diharapkan

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

1. Tunggu hingga tugas selesai.

   Anda harus menunggu hingga output tugas siap diunduh. Jika Anda menyetel konfigurasi notifikasi di vault atau menetapkan topik Simple Notification Service Amazon (Amazon SNS) saat memulai pekerjaan, Amazon Glacier akan mengirimkan pesan ke topik tersebut setelah menyelesaikan pekerjaan. 

   Anda dapat menetapkan konfigurasi notifikasi untuk peristiwa tertentu di vault. Untuk informasi selengkapnya, lihat [Mengkonfigurasi Pemberitahuan Vault di Amazon Glacier](configuring-notifications.md). Amazon Glacier mengirim pesan ke topik SNS yang ditentukan kapan saja peristiwa tertentu terjadi.

1. Setelah selesai, gunakan perintah `get-job-output` untuk mengunduh tugas pengambilan ke file `output.json`. File ini akan berisi id arsip Anda. 

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

   Perintah ini menghasilkan file dengan bidang berikut.

   ```
   {
   "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. Gunakan `initiate-job` perintah untuk memulai proses pengambilan setiap arsip dari brankas. Anda harus menentukan parameter pekerjaan `archive-retrieval` seperti yang terlihat di bawah ini.

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

1. Tunggu sampai `archive-retrieval` pekerjaan selesai. Gunakan `describe-job` perintah untuk memeriksa status perintah sebelumnya.

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

1. Ketika pekerjaan di atas selesai gunakan `get-job-output` perintah untuk men-download arsip Anda.

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