

 **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.

# Bekerja dengan Arsip di Amazon Glacier
<a name="working-with-archives"></a>

Arsip adalah objek apa pun, seperti foto, video, atau dokumen yang Anda simpan di vault. Ini adalah unit dasar penyimpanan di Amazon Glacier (Amazon Glacier). Setiap arsip memiliki ID unik dan deskripsi opsional. Saat Anda mengunggah arsip, Amazon Glacier menampilkan respons yang menyertakan ID arsip. ID arsip ini unik di AWS Wilayah tempat arsip disimpan. Berikut adalah contoh ID arsip. 

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

 Arsip IDs memiliki panjang 138 byte. Saat mengunggah arsip, Anda dapat memberikan deskripsi opsional. Anda dapat mengambil arsip menggunakan ID-nya, tetapi tidak deskripsinya.

 

**penting**  
Amazon Glacier menyediakan konsol manajemen. Anda dapat menggunakan konsol untuk membuat dan menghapus vault. Namun, semua interaksi lain dengan Amazon Glacier mengharuskan Anda menggunakan AWS Command Line Interface (CLI) atau menulis kode. Misalnya, untuk mengunggah data, seperti foto, video, dan dokumen lainnya, Anda harus menggunakan AWS CLI atau menulis kode untuk membuat permintaan, baik menggunakan REST API secara langsung atau dengan menggunakan Amazon SDKs. Untuk informasi lebih lanjut tentang menggunakan Amazon Glacier dengan AWS CLI, buka Referensi [AWS CLI untuk Amazon](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Glacier. Untuk menginstal AWS CLI, pergi ke [AWS Command Line Interface](https://aws.amazon.com/cli/).

**Topics**
+ [Arsip Operasi di Amazon Glacier](#archive-operations-quick-intro)
+ [Mempertahankan Metadata Arsip Sisi Klien](#client-side-key-map-concept)
+ [Mengunggah Arsip di Amazon Glacier](uploading-an-archive.md)
+ [Mengunduh Arsip di Amazon Glacier](downloading-an-archive.md)
+ [Menghapus Arsip di Amazon Glacier](deleting-an-archive.md)

## Arsip Operasi di Amazon Glacier
<a name="archive-operations-quick-intro"></a>

Amazon Glacier mendukung operasi arsip dasar berikut: unggah, unduh, dan hapus. Mengunduh arsip adalah operasi asinkron. 

### Mengunggah Arsip di Amazon Glacier
<a name="uploading-an-archive-quick-intro"></a>

Anda dapat mengunggah arsip dalam satu operasi atau mengunggahnya dalam beberapa bagian. Panggilan API yang Anda gunakan untuk mengunggah arsip dalam beberapa bagian disebut sebagai Unggahan Multipart. Untuk informasi selengkapnya, lihat [Mengunggah Arsip di Amazon Glacier](uploading-an-archive.md).

 

**penting**  
Amazon Glacier menyediakan konsol manajemen. Anda dapat menggunakan konsol untuk membuat dan menghapus vault. Namun, semua interaksi lain dengan Amazon Glacier mengharuskan Anda menggunakan AWS Command Line Interface (CLI) atau menulis kode. Misalnya, untuk mengunggah data, seperti foto, video, dan dokumen lainnya, Anda harus menggunakan AWS CLI atau menulis kode untuk membuat permintaan, baik menggunakan REST API secara langsung atau dengan menggunakan Amazon SDKs. Untuk informasi lebih lanjut tentang menggunakan Amazon Glacier dengan AWS CLI, buka Referensi [AWS CLI untuk Amazon](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html) Glacier. Untuk menginstal AWS CLI, pergi ke [AWS Command Line Interface](https://aws.amazon.com/cli/).

### Menemukan ID Arsip di Amazon Glacier
<a name="finding-an-archive-id-quick-intro"></a>

Anda bisa mendapatkan ID arsip dengan mengunduh inventaris vault untuk vault yang berisi arsip. Untuk informasi selengkapnya tentang mengunduh inventaris vault, lihat [Mengunduh Inventaris Vault di Amazon Glacier](vault-inventory.md).

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

Mengunduh arsip adalah operasi asinkron. Anda pertama-tama harus memulai tugas untuk mengunduh arsip tertentu. Setelah menerima permintaan pekerjaan, Amazon Glacier menyiapkan arsip Anda untuk diunduh. Setelah tugas selesai, Anda dapat mengunduh data arsip. Karena sifat pekerjaan yang tidak sinkron, Anda dapat meminta Amazon Glacier untuk mengirim pemberitahuan ke topik Simple Notification Service Amazon (Amazon SNS) saat pekerjaan selesai. Anda dapat menentukan topik SNS untuk setiap permintaan tugas individu atau mengonfigurasi vault Anda untuk mengirim notifikasi ketika peristiwa tertentu terjadi. Untuk informasi selengkapnya tentang mengunduh arsip, lihat [Mengunduh Arsip di Amazon Glacier](downloading-an-archive.md).

### Menghapus Arsip di Amazon Glacier
<a name="deleting-an-archive-quick-intro"></a>

Amazon Glacier menyediakan panggilan API yang dapat Anda gunakan untuk menghapus satu arsip sekaligus. Untuk informasi selengkapnya, lihat [Menghapus Arsip di Amazon Glacier](deleting-an-archive.md).

### Memperbarui Arsip di Amazon Glacier
<a name="updating-an-archive-quick-intro"></a>

Setelah mengunggah arsip, Anda tidak dapat memperbarui konten atau deskripsinya. Satu-satunya cara agar Anda dapat memperbarui konten arsip atau deskripsinya adalah dengan menghapus arsip dan mengunggah arsip lain. Perhatikan bahwa setiap kali Anda mengunggah arsip, Amazon Glacier mengembalikan ID arsip unik kepada Anda.

## Mempertahankan Metadata Arsip Sisi Klien
<a name="client-side-key-map-concept"></a>

Kecuali untuk deskripsi arsip opsional, Amazon Glacier tidak mendukung metadata tambahan apa pun untuk arsip. Saat Anda mengunggah arsip Amazon Glacier memberikan ID, urutan karakter buram, yang darinya Anda tidak dapat menyimpulkan arti apa pun tentang arsip tersebut. Anda dapat mempertahankan metadata tentang arsip di sisi klien. Metadata dapat mencakup nama arsip dan beberapa informasi bermakna lainnya tentang arsip. 

**catatan**  
Jika Anda adalah pelanggan Amazon Simple Storage Service (Amazon S3), Anda tahu bahwa ketika Anda mengunggah objek ke bucket, Anda dapat menetapkan objek kunci untuk objek seperti `MyDocument.txt` atau `SomePhoto.jpg`. Di Amazon Glacier, Anda tidak dapat menetapkan kunci objek ke arsip yang Anda unggah. 

Jika Anda mempertahankan metadata arsip sisi klien, perhatikan bahwa Amazon Glacier menyimpan inventaris vault yang menyertakan arsip IDs dan deskripsi apa pun yang Anda berikan selama unggahan arsip. Anda terkadang dapat mengunduh inventaris vault untuk menyelesaikan masalah di basis data sisi klien yang Anda pertahankan untuk metadata arsip. Namun, Amazon Glacier mengambil inventaris lemari besi kira-kira setiap hari. Saat Anda meminta inventaris brankas, Amazon Glacier mengembalikan inventaris terakhir yang disiapkan, snapshot titik waktu.

# Mengunggah Arsip di Amazon Glacier
<a name="uploading-an-archive"></a>

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

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

**Topics**
+ [Opsi untuk Mengunggah Arsip ke Amazon Glacier](#uploading-an-archive-overview)
+ [Mengunggah Arsip dalam Satu Operasi](uploading-archive-single-operation.md)
+ [Mengunggah Arsip Besar dalam Beberapa Bagian (Unggahan Multipart)](uploading-archive-mpu.md)

## Opsi untuk Mengunggah Arsip ke Amazon Glacier
<a name="uploading-an-archive-overview"></a>

Bergantung pada ukuran data yang Anda unggah, Amazon Glacier menawarkan opsi berikut: 
+ **Unggah arsip dalam satu operasi** – Dalam satu operasi, Anda dapat mengunggah arsip berukuran mulai dari 1 byte hingga 4 GB. Namun, kami mendorong pelanggan Amazon Glacier untuk menggunakan unggahan multipart untuk mengunggah arsip lebih dari 100 MB. Untuk informasi selengkapnya, lihat [Mengunggah Arsip dalam Satu Operasi](uploading-archive-single-operation.md).
+ **Unggah arsip dalam beberapa bagian** – Dengan menggunakan API unggahan multipart, Anda dapat mengunggah arsip besar, hingga sekitar 40.000 GB (10.000 \$1 4 GB). 

  Panggilan API unggahan multipart dirancang untuk meningkatkan pengalaman unggah untuk arsip yang lebih besar. Anda dapat mengunggah arsip dalam beberapa bagian. Bagian-bagian ini dapat diunggah secara independen, dalam urutan apa pun, dan secara paralel. Jika satu bagian gagal diunggah, Anda hanya perlu mengunggah kembali bagian tersebut dan bukan seluruh arsip. Anda dapat menggunakan unggahan multipart untuk arsip berukuran mulai dari 1 byte hingga sekitar 40.000 GB. Untuk informasi selengkapnya, lihat [Mengunggah Arsip Besar dalam Beberapa Bagian (Unggahan Multipart)](uploading-archive-mpu.md).

**penting**  
Inventaris lemari besi Amazon Glacier hanya diperbarui sekali sehari. Saat mengunggah arsip, Anda tidak akan segera melihat arsip baru yang ditambahkan ke vault Anda (di konsol atau di daftar inventaris vault yang diunduh) hingga inventaris vault diperbarui.

### Menggunakan AWS Snowball Edge Layanan
<a name="using-import-export-service-for-glacier"></a>

AWS Snowball Edge mempercepat pemindahan sejumlah besar data masuk dan keluar AWS menggunakan perangkat milik Amazon, melewati internet. Untuk informasi selengkapnya, lihat halaman detail [AWS Snowball Edge](https://aws.amazon.com/snowball). 

Untuk mengunggah data yang ada ke Amazon Glacier (Amazon Glacier), Anda dapat mempertimbangkan untuk menggunakan salah satu jenis AWS Snowball Edge perangkat untuk mengimpor data ke Amazon S3, lalu memindahkannya ke kelas penyimpanan Amazon Glacier untuk arsip menggunakan aturan siklus hidup. Saat Anda mentransisikan objek Amazon S3 ke kelas penyimpanan Amazon Glacier, Amazon S3 secara internal menggunakan Amazon Glacier untuk penyimpanan tahan lama dengan biaya lebih rendah. Meskipun objek disimpan di Amazon Glacier, mereka tetap menjadi objek Amazon S3 yang Anda kelola di Amazon S3, dan Anda tidak dapat mengaksesnya langsung melalui Amazon Glacier.

[*Untuk informasi selengkapnya tentang konfigurasi siklus hidup Amazon S3 dan objek transisi ke kelas penyimpanan Amazon Glacier, lihat Objek [Manajemen dan Transisi Siklus Hidup](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)* Objek di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html)

# Mengunggah Arsip dalam Satu Operasi
<a name="uploading-archive-single-operation"></a>

Seperti yang dijelaskan di [Mengunggah Arsip di Amazon Glacier](uploading-an-archive.md), Anda dapat mengunggah arsip yang lebih kecil dalam satu operasi. Namun, kami mendorong pelanggan Amazon Glacier (Amazon Glacier) untuk menggunakan Unggahan Multipart untuk mengunggah arsip lebih dari 100 MB. 

**Topics**
+ [Mengunggah Arsip dalam Satu Operasi Menggunakan AWS Command Line Interface](uploading-an-archive-single-op-using-cli.md)
+ [Mengunggah Arsip dalam Satu Operasi Menggunakan AWS SDK untuk Java](uploading-an-archive-single-op-using-java.md)
+ [Mengunggah Arsip dalam Satu Operasi Menggunakan Amazon Glacier AWS SDK untuk .NET di Amazon](uploading-an-archive-single-op-using-dotnet.md)
+ [Mengunggah Arsip dalam Satu Operasi Menggunakan REST API](uploading-an-archive-single-op-using-rest.md)

# Mengunggah Arsip dalam Satu Operasi Menggunakan AWS Command Line Interface
<a name="uploading-an-archive-single-op-using-cli"></a>

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

**Topics**
+ [(Prasyarat) Menyiapkan AWS CLI](#Creating-Vaults-CLI-Setup)
+ [Contoh: Unggah Arsip Menggunakan AWS CLI](#Uploading-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 *: 

    [Instalasi 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: Unggah Arsip Menggunakan AWS CLI
<a name="Uploading-Archives-CLI-Implementation"></a>

Untuk mengunggah arsip, Anda harus membuat brankas. Untuk informasi selengkapnya tentang membuat brankas, lihat. [Membuat Vault di Amazon Glacier](creating-vaults.md)

1. Gunakan `upload-archive` perintah untuk menambahkan arsip ke brankas yang ada. Pada contoh di bawah ini ganti `vault name` dan`account ID`. Untuk `body` parameter tentukan jalur ke file yang ingin Anda unggah.

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

1.  Keluaran yang diharapkan

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

   Setelah selesai perintah akan menampilkan ID arsip, checksum, dan lokasi di Amazon Glacier. *Untuk informasi selengkapnya tentang perintah upload-archive, lihat [upload-archive](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-archive.html) di Command Reference.AWS CLI *

# Mengunggah Arsip dalam Satu Operasi Menggunakan AWS SDK untuk Java
<a name="uploading-an-archive-single-op-using-java"></a>

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

**Topics**
+ [Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java](#uploading-an-archive-single-op-high-level-using-java)
+ [Mengunggah Arsip dalam Satu Operasi Menggunakan API Tingkat Rendah AWS SDK untuk Java](#uploading-an-archive-single-op-low-level-using-java)

## Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java
<a name="uploading-an-archive-single-op-high-level-using-java"></a>

Kelas `ArchiveTransferManager` dari API tingkat tinggi menyediakan metode `upload`, yang dapat Anda gunakan untuk mengunggah arsip ke vault.

 

**catatan**  
Anda dapat menggunakan metode `upload` untuk mengunggah arsip kecil atau besar. Bergantung pada ukuran arsip yang Anda unggah, metode ini menentukan apakah akan mengunggahnya dalam satu operasi atau menggunakan API unggahan multipart untuk mengunggah arsip dalam beberapa bagian.

### Contoh: Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java
<a name="upload-archive-high-level-java-example"></a>

Contoh kode Java berikut mengunggah arsip ke vault (`examplevault`) di Wilayah US West (Oregon) (`us-west-2`). Untuk daftar AWS Wilayah dan titik akhir yang didukung, lihat[Mengakses Amazon Glacier](amazon-glacier-accessing.md). 

Untuk step-by-step petunjuk tentang cara menjalankan contoh 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 nama vault yang ingin Anda unggah dan nama file yang ingin Anda unggah.

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

## Mengunggah Arsip dalam Satu Operasi Menggunakan API Tingkat Rendah AWS SDK untuk Java
<a name="uploading-an-archive-single-op-low-level-using-java"></a>

API tingkat rendah menyediakan metode untuk semua operasi arsip. Berikut adalah langkah-langkah untuk mengunggah arsip menggunakan AWS SDK untuk Java.

 

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

   Anda perlu menentukan AWS Wilayah tempat Anda ingin mengunggah arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Berikan informasi permintaan dengan membuat instans kelas `UploadArchiveRequest`.

   Selain data yang ingin Anda unggah, Anda perlu menyediakan checksum (hash pohon SHA-256) dari muatan, nama vault, panjang konten data, dan ID akun Anda. 

   Jika Anda tidak memberikan ID akun, ID akun yang terkait dengan kredensial yang Anda berikan untuk menandatangani permintaan diambil. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDK untuk Java dengan Amazon Glacier](using-aws-sdk-for-java.md). 

1. Jalankan metode `uploadArchive` dengan menyediakan objek permintaan sebagai parameter. 

   Sebagai tanggapan, Amazon Glacier (Amazon Glacier) mengembalikan ID arsip dari arsip yang baru diunggah. 

Potongan kode Java berikut menggambarkan langkah-langkah sebelumnya. 

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

### Contoh: Mengunggah Arsip dalam Operasi Tunggal Menggunakan API Tingkat Rendah AWS SDK untuk Java
<a name="uploding-single-archive-using-java-example"></a>

Contoh kode Java berikut menggunakan AWS SDK untuk Java untuk mengunggah arsip ke vault (`examplevault`). Untuk step-by-step petunjuk tentang cara menjalankan contoh 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 nama vault yang ingin Anda unggah dan nama file yang ingin Anda unggah.

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

# Mengunggah Arsip dalam Satu Operasi Menggunakan Amazon Glacier AWS SDK untuk .NET di Amazon
<a name="uploading-an-archive-single-op-using-dotnet"></a>

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

**Topics**
+ [Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET](#uploading-an-archive-single-op-highlevel-using-dotnet)
+ [Mengunggah Arsip dalam Operasi Tunggal Menggunakan API Tingkat Rendah AWS SDK untuk .NET](#uploading-an-archive-single-op-lowlevel-using-dotnet)

## Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET
<a name="uploading-an-archive-single-op-highlevel-using-dotnet"></a>

Kelas `ArchiveTransferManager` dari API tingkat tinggi menyediakan metode `Upload` yang dapat Anda gunakan untuk mengunggah arsip ke vault. 

**catatan**  
Anda dapat menggunakan metode `Upload` untuk mengunggah file kecil atau besar. Bergantung pada ukuran file yang Anda unggah, metode ini menentukan apakah akan mengunggahnya dalam satu operasi atau menggunakan API unggahan multipart untuk mengunggah file dalam beberapa bagian.

### Contoh: Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET
<a name="upload-archive-highlevel-any-size-dotnet"></a>

Contoh kode C\$1 berikut mengunggah arsip ke 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 nama file yang ingin Anda unggah.

**Example**  

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

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

## Mengunggah Arsip dalam Operasi Tunggal Menggunakan API Tingkat Rendah AWS SDK untuk .NET
<a name="uploading-an-archive-single-op-lowlevel-using-dotnet"></a>

API tingkat rendah menyediakan metode untuk semua operasi arsip. Berikut adalah langkah-langkah untuk mengunggah arsip menggunakan AWS SDK untuk .NET.

 

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

   Anda perlu menentukan AWS Wilayah tempat Anda ingin mengunggah arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Berikan informasi permintaan dengan membuat instans kelas `UploadArchiveRequest`.

   Selain data yang ingin Anda unggah, Anda perlu menyediakan checksum (hash pohon SHA-256) dari muatan, nama vault, dan ID akun Anda. 

   Jika Anda tidak memberikan ID akun, ID akun yang terkait dengan kredensial yang Anda berikan untuk menandatangani permintaan akan diambil. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDK untuk .NET dengan Amazon Glacier](using-aws-sdk-for-dot-net.md). 

1. Jalankan metode `UploadArchive` dengan menyediakan objek permintaan sebagai parameter. 

   Sebagai tanggapan, Amazon Glacier mengembalikan ID arsip dari arsip yang baru diunggah. 

### Contoh: Mengunggah Arsip dalam Operasi Tunggal Menggunakan API Tingkat Rendah AWS SDK untuk .NET
<a name="upload-archive-single-op-lowlevel-dotnet"></a>

Contoh kode \$1C berikut menjelaskan langkah sebelumnya. Contoh menggunakan file AWS SDK untuk .NET untuk mengunggah arsip ke vault (`examplevault`). 

**catatan**  
Untuk informasi tentang REST API yang mendasarinya guna mengunggah arsip dalam satu permintaan, lihat [Mengunggah Arsip (POST archive)](api-archive-post.md).

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 nama file yang ingin Anda unggah.

**Example**  

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

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

# Mengunggah Arsip dalam Satu Operasi Menggunakan REST API
<a name="uploading-an-archive-single-op-using-rest"></a>

Anda dapat menggunakan panggilan API Unggah Arsip untuk mengunggah arsip dalam satu operasi. Lihat informasi yang lebih lengkap di [Mengunggah Arsip (POST archive)](api-archive-post.md).

# Mengunggah Arsip Besar dalam Beberapa Bagian (Unggahan Multipart)
<a name="uploading-archive-mpu"></a>

**Topics**
+ [Proses Unggahan Multipart](#MPUprocess)
+ [Fakta Cepat](#qfacts)
+ [Mengunggah Arsip Besar dengan Menggunakan AWS CLI](uploading-an-archive-mpu-using-cli.md)
+ [Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan Amazon SDK for Java](uploading-an-archive-mpu-using-java.md)
+ [Mengunggah Arsip Besar Menggunakan AWS SDK untuk .NET](uploading-an-archive-mpu-using-dotnet.md)
+ [Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan REST API](uploading-an-archive-mpu-using-rest.md)

## Proses Unggahan Multipart
<a name="MPUprocess"></a>

Seperti dijelaskan dalam[Mengunggah Arsip di Amazon Glacier](uploading-an-archive.md), kami mendorong pelanggan Amazon Glacier (Amazon Glacier) untuk menggunakan Multipart Upload untuk mengunggah arsip lebih dari 100 mebibytes (MiB). 

1. **Mulai Unggahan Multibagian** 

   Saat Anda mengirim permintaan untuk memulai unggahan multipart, Amazon Glacier mengembalikan ID unggahan multipart, yang merupakan pengenal unik untuk unggahan multipart Anda. Operasi unggahan multipart berikutnya memerlukan ID ini. ID ini tidak kedaluwarsa setidaknya 24 jam setelah Amazon Glacier menyelesaikan pekerjaan. 

   Dalam permintaan Anda untuk memulai unggahan multipart, tentukan ukuran bagian dalam jumlah byte. Setiap bagian yang Anda unggah, kecuali bagian terakhir, harus seukuran ini.
**catatan**  
Anda tidak perlu mengetahui ukuran arsip secara keseluruhan saat menggunakan unggahan multipart. Ini berarti Anda dapat menggunakan unggahan multipart jika Anda tidak mengetahui ukuran arsip ketika Anda mulai mengunggah arsip. Anda hanya perlu memutuskan ukuran bagian pada saat Anda memulai unggahan multipart.

   Dalam permintaan mulai unggahan multipart, Anda juga dapat memberikan deskripsi arsip opsional. 

1. **Unggah Bagian**

   Untuk setiap permintaan unggah bagian, Anda harus menyertakan ID unggahan multipart yang Anda peroleh pada langkah 1. Dalam permintaan tersebut, Anda juga harus menentukan rentang konten, dalam byte, yang mengidentifikasi posisi bagian dalam arsip final. Amazon Glacier kemudian menggunakan informasi rentang konten untuk mengumpulkan arsip dalam urutan yang tepat. Karena Anda menyediakan berbagai konten untuk setiap bagian yang Anda unggah, hal ini akan menentukan posisi bagian dalam penggabungan akhir final, dan karena itu, Anda dapat mengunggah bagian dalam urutan apa pun. Anda juga dapat mengunggah bagian secara paralel. Jika Anda mengunggah bagian baru menggunakan rentang konten yang sama dengan bagian yang diunggah sebelumnya, bagian yang diunggah sebelumnya akan ditimpa. 

1. **Selesaikan (atau hentikan) Unggahan Multipart**

   Setelah mengunggah semua bagian arsip, Anda menggunakan operasi selesaikan. Sekali lagi, Anda harus menentukan ID unggahan dalam permintaan Anda. Amazon Glacier membuat arsip dengan menggabungkan bagian-bagian dalam urutan menaik berdasarkan rentang konten yang Anda berikan. Respons Amazon Glacier terhadap permintaan Unggahan Multibagian Lengkap menyertakan ID arsip untuk arsip yang baru dibuat. Jika Anda memberikan deskripsi arsip opsional dalam permintaan Inisiate Multipart Upload, Amazon Glacier mengaitkannya dengan arsip rakitan. Setelah Anda berhasil menyelesaikan unggahan multipart, Anda tidak dapat merujuk ke ID unggahan multipart. Itu berarti Anda tidak dapat mengakses bagian yang terkait dengan ID unggahan multipart.

   Setelah menghentikan unggahan multipart, Anda tidak dapat mengunggah bagian apa pun menggunakan ID unggahan multipart tersebut. Semua penyimpanan yang digunakan oleh setiap bagian yang terkait dengan unggahan multipart yang dihentikan akan dikosongkan. Jika ada unggahan bagian yang sedang berlangsung, unggahan masih dapat berhasil atau gagal meskipun sudah Anda hentikan.

### Operasi Unggahan Multipart Tambahan
<a name="additional-mpu-operations"></a>

Amazon Glacier (Amazon Glacier) menyediakan panggilan API unggahan multibagian tambahan berikut.

 
+ **Cantumkan Bagian**—Dengan menggunakan operasi ini, Anda dapat mencantumkan bagian-bagian dari unggahan multipart tertentu. Operasi ini mengembalikan informasi bagian yang sudah Anda unggah untuk unggahan multipart. Untuk setiap permintaan bagian daftar, Amazon Glacier mengembalikan informasi hingga 1.000 bagian. Jika ada lebih banyak bagian yang dicantumkan untuk unggahan multipart, hasilnya adalah pemberian nomor halaman dan penanda dikembalikan dalam respons di tempat daftar dilanjutkan. Anda perlu mengirim permintaan tambahan untuk mengambil bagian berikutnya. Perhatikan bahwa daftar bagian yang telah ditampilkan tidak akan mencakup bagian yang belum selesai diunggah.
+ **Cantumkan Unggahan Multipart**—Dengan menggunakan operasi ini, Anda bisa mendapatkan daftar unggahan multipart yang sedang diproses. Unggahan multipart yang sedang berlangsung adalah unggahan yang telah Anda mulai, tetapi belum selesai atau dihentikan. Untuk setiap permintaan unggahan multipart daftar, Amazon Glacier mengembalikan hingga 1.000 unggahan multipart. Jika ada lebih banyak unggahan multipart yang dicantumkan, hasilnya adalah pemberian nomor halaman dan penanda dikembalikan dalam respons di tempat daftar dilanjutkan. Anda harus mengirim permintaan tambahan untuk mengambil unggahan multipart yang tersisa.

## Fakta Cepat
<a name="qfacts"></a>

Tabel berikut menyediakan spesifikasi inti unggahan multipart.


| Item | Spesifikasi | 
| --- | --- | 
| Ukuran arsip maksimum | 10.000 x 4 gibibyte (GiB)  | 
| Jumlah maksimum bagian per unggahan | 10.000 | 
| Ukuran bagian | 1 MiB sampai 4 GiB, bagian terakhir bisa < 1 MiB. Anda menentukan nilai ukuran dalam byte. Ukuran bagian harus mebibyte (1024 kibibytes [KiB]) dikalikan dengan kekuatan 2. Misalnya, `1048576` (1 MiB), `2097152` (2 MiB), (`4194304`4 MiB), (8 MiB). `8388608`   | 
| Jumlah maksimum bagian yang ditampilkan untuk permintaan daftar bagian | 1.000  | 
| Jumlah maksimum unggahan multipart yang ditampilkan dalam sebuah permintaan daftar unggahan multipart | 1.000  | 

# Mengunggah Arsip Besar dengan Menggunakan AWS CLI
<a name="uploading-an-archive-mpu-using-cli"></a>

Anda dapat mengunggah arsip di Amazon Glacier (Amazon Glacier) dengan menggunakan (). AWS Command Line Interface AWS CLI Untuk meningkatkan pengalaman mengunggah arsip yang lebih besar, Amazon Glacier menyediakan beberapa operasi API untuk mendukung unggahan multipart. Dengan menggunakan operasi API ini, Anda dapat mengunggah arsip di beberapa bagian. Bagian-bagian ini dapat diunggah secara independen, dalam urutan apa pun, dan secara paralel. Jika unggahan bagian gagal, Anda hanya perlu mengunggah bagian itu lagi, bukan seluruh arsip. Anda dapat menggunakan unggahan multipart untuk arsip dari 1 byte hingga sekitar 40.000 gibibytes (GiB) dalam ukuran. 

Untuk informasi selengkapnya tentang unggahan multipart Amazon Glacier, lihat. [Mengunggah Arsip Besar dalam Beberapa Bagian (Unggahan Multipart)](uploading-archive-mpu.md)

**Topics**
+ [(Prasyarat) Menyiapkan AWS CLI](#Creating-Vaults-CLI-Setup)
+ [(Prasyarat) Instal Python](#Uploading-Archives-mpu-CLI-Install-Python)
+ [(Prasyarat) Buat Amazon Glacier Vault](#Uploading-Archives-mpu-CLI-Create-Vault)
+ [Contoh: Mengunggah Arsip Besar di Bagian dengan Menggunakan AWS CLI](#Uploading-Archives-mpu-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 *: 

    [Instalasi 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
     ```

## (Prasyarat) Instal Python
<a name="Uploading-Archives-mpu-CLI-Install-Python"></a>

Untuk menyelesaikan unggahan multipart, Anda harus menghitung hash SHA256 pohon dari arsip yang Anda unggah. Melakukannya berbeda dengan menghitung hash SHA256 pohon dari file yang ingin Anda unggah. Untuk menghitung hash SHA256 pohon dari arsip yang Anda unggah, Anda dapat menggunakanJava, C\$1 (dengan.NET), atau. Python Dalam contoh ini, Anda akan menggunakanPython. Untuk petunjuk tentang penggunaan Java atau C \$1, lihat[Checksum Komputasi](checksum-calculations.md). 

Untuk informasi selengkapnya tentang menginstalPython, lihat [Menginstal atau memperbarui Python](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation) di Panduan *Pengembang Boto3*.

## (Prasyarat) Buat Amazon Glacier Vault
<a name="Uploading-Archives-mpu-CLI-Create-Vault"></a>

Untuk menggunakan contoh berikut, Anda harus memiliki setidaknya satu lemari besi Amazon Glacier yang dibuat. Untuk informasi selengkapnya tentang membuat brankas, lihat. [Membuat Vault di Amazon Glacier](creating-vaults.md)

## Contoh: Mengunggah Arsip Besar di Bagian dengan Menggunakan AWS CLI
<a name="Uploading-Archives-mpu-CLI-Implementation"></a>

Dalam contoh ini, Anda akan membuat file dan menggunakan operasi API unggahan multibagian untuk mengunggah file ini, sebagian, ke Amazon Glacier.
**penting**  
Sebelum memulai prosedur ini, pastikan Anda telah melakukan semua langkah prasyarat. Untuk mengunggah arsip, Anda harus memiliki vault yang dibuat, AWS CLI dikonfigurasi, dan siap untuk menggunakanJava, C \$1, atau Python untuk menghitung hash SHA256 pohon.

Prosedur berikut menggunakan`initiate-multipart-upload`,`upload-multipart-part`, dan `complete-multipart-upload` AWS CLI perintah. 

Untuk informasi lebih rinci tentang masing-masing perintah ini, lihat, [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), dan [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)di *AWS CLI Command Reference*.

1. Gunakan [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)perintah untuk membuat sumber daya unggahan multibagian. Dalam permintaan Anda, tentukan ukuran bagian dalam jumlah byte. Setiap bagian yang Anda unggah, kecuali bagian terakhir, akan berukuran ini. Anda tidak perlu mengetahui ukuran arsip keseluruhan saat memulai unggahan. Namun, Anda akan memerlukan ukuran total, dalam byte, dari setiap bagian saat menyelesaikan unggahan pada langkah terakhir.

   Dalam perintah berikut, ganti nilai untuk `--account-ID` parameter `--vault-name` dan dengan informasi Anda sendiri. Perintah ini menentukan bahwa Anda akan mengunggah arsip dengan ukuran bagian 1 mebibyte (MiB) (1024 x 1024 byte) per file. Ganti nilai `--part-size` parameter ini jika diperlukan. 

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

   Keluaran yang diharapkan

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

   Setelah selesai, perintah akan menampilkan ID unggahan dan lokasi sumber daya unggahan multibagian di Amazon Glacier. Anda akan menggunakan ID unggahan ini pada langkah selanjutnya.

1. Untuk contoh ini, Anda dapat menggunakan perintah berikut untuk membuat file 4.4 MiB, membaginya menjadi potongan 1 MiB, dan mengunggah setiap potongan. Untuk mengunggah file Anda sendiri, Anda dapat mengikuti prosedur serupa untuk membagi data Anda menjadi beberapa bagian dan mengunggah setiap bagian. 

   

**Linux atau macOS**  
Perintah berikut membuat file 4.4 MiB, bernama`file_to_upload`, di Linux atau macOS.

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

**Windows**  
Perintah berikut membuat file 4.4 MiB, bernama`file_to_upload`, pada Windows.

   ```
   fsutil file createnew file_to_upload 4608000
   ```

1. Selanjutnya, Anda akan membagi file ini menjadi potongan 1 MiB. 

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

   Anda sekarang memiliki lima potongan berikut. Empat yang pertama adalah 1 MiB, dan yang terakhir adalah sekitar 400 kibibytes (KiB). 

   ```
   chunkaa
   chunkab
   chunkac
   chunkad
   chunkae
   ```

1. Gunakan [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)perintah untuk mengunggah bagian dari arsip. Anda dapat mengunggah bagian arsip dalam urutan apa pun. Anda juga dapat mengunggahnya secara paralel. Anda dapat mengunggah hingga 10.000 bagian untuk unggahan multipart.

   Dalam perintah berikut, ganti nilai untuk`--vault-name`,`--account-ID`, dan `--upload-id` parameter. ID upload harus cocok dengan ID yang diberikan sebagai output dari `initiate-multipart-upload` perintah. `--range`Parameter menentukan bahwa Anda akan mengunggah bagian dengan ukuran 1 MiB (1024 x 1024 byte). Ukuran ini harus sesuai dengan apa yang Anda tentukan dalam `initiate-multipart-upload` perintah. Sesuaikan nilai ukuran ini jika diperlukan. `--body`Parameter menentukan nama bagian yang Anda upload.

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

   Jika berhasil, perintah akan menghasilkan output yang berisi checksum untuk bagian yang diunggah.

1. Jalankan `upload-multipart-part` perintah lagi untuk mengunggah bagian yang tersisa dari unggahan multipart Anda. Perbarui nilai `--range` dan `–-body` parameter untuk setiap perintah agar sesuai dengan bagian yang Anda unggah. 

   ```
   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
   ```
**catatan**  
Nilai `--range` parameter perintah akhir lebih kecil karena bagian akhir dari unggahan kami kurang dari 1 MiB. Jika berhasil, setiap perintah akan menghasilkan output yang berisi checksum untuk setiap bagian yang diunggah.

1. Selanjutnya, Anda akan merakit arsip dan menyelesaikan unggahan. Anda harus menyertakan ukuran total dan hash SHA256 pohon arsip.

   Untuk menghitung hash SHA256 pohon arsip, Anda dapat menggunakanJava, C \$1, atau. Python Dalam contoh ini, Anda akan menggunakanPython. Untuk petunjuk tentang penggunaan Java atau C \$1, lihat[Checksum Komputasi](checksum-calculations.md).

   Buat Python file `checksum.py` dan masukkan kode berikut. Jika perlu, ganti nama file asli.

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

1. Jalankan `checksum.py` untuk menghitung hash SHA256 pohon. Hash berikut mungkin tidak cocok dengan output Anda.

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

1. Gunakan [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)perintah untuk menyelesaikan unggahan arsip. Ganti nilai untuk`--vault-name`,`--account-ID`,`--upload-ID`, dan `--checksum` parameter. Nilai `--archive` parameter menentukan ukuran total, dalam byte, dari arsip. Nilai ini harus merupakan jumlah dari semua ukuran masing-masing bagian yang Anda unggah. Ganti nilai ini jika diperlukan. 

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

   Setelah selesai, perintah akan menampilkan ID arsip, checksum, dan lokasi di Amazon Glacier. 

# Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan Amazon SDK for Java
<a name="uploading-an-archive-mpu-using-java"></a>

Baik [tingkat tinggi maupun tingkat rendah](using-aws-sdk.md) yang APIs disediakan oleh Amazon SDK for Java menyediakan metode untuk mengunggah arsip besar (lihat). [Mengunggah Arsip di Amazon Glacier](uploading-an-archive.md) 

 
+ API tingkat tinggi menyediakan metode yang dapat Anda gunakan untuk mengunggah arsip dalam ukuran apa pun. Bergantung pada file yang Anda unggah, metode ini mengunggah arsip dalam satu operasi atau menggunakan dukungan unggahan multibagian di Amazon Glacier (Amazon Glacier) untuk mengunggah arsip menjadi beberapa bagian.
+ API tingkat rendah hampir memetakan ke implementasi REST yang mendasarinya. Dengan demikian, ini menyediakan metode untuk mengunggah arsip yang lebih kecil dalam satu operasi dan grup metode yang mendukung unggahan multipart untuk arsip yang lebih besar. Bagian ini menjelaskan mengunggah arsip besar dalam beberapa bagian menggunakan API tingkat rendah.

Untuk informasi lebih lanjut tentang tingkat tinggi dan tingkat rendah APIs, lihat. [Menggunakan AWS SDK untuk Java dengan Amazon Glacier](using-aws-sdk-for-java.md)

**Topics**
+ [Mengunggah Arsip Besar di Bagian Menggunakan API Tingkat Tinggi AWS SDK untuk Java](#uploading-an-archive-in-parts-highlevel-using-java)
+ [Unggah Arsip Besar di Bagian Menggunakan API Tingkat Rendah AWS SDK untuk Java](#uploading-an-archive-mpu-using-java-lowlevel)

## Mengunggah Arsip Besar di Bagian Menggunakan API Tingkat Tinggi AWS SDK untuk Java
<a name="uploading-an-archive-in-parts-highlevel-using-java"></a>

Anda menggunakan metode API tingkat tinggi yang sama untuk mengunggah arsip kecil atau besar. Berdasarkan ukuran arsip, metode API tingkat tinggi memutuskan apakah akan mengunggah arsip dalam satu operasi atau menggunakan API unggahan multibagian yang disediakan oleh Amazon Glacier. Untuk informasi selengkapnya, lihat [Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk Java](uploading-an-archive-single-op-using-java.md#uploading-an-archive-single-op-high-level-using-java).

## Unggah Arsip Besar di Bagian Menggunakan API Tingkat Rendah AWS SDK untuk Java
<a name="uploading-an-archive-mpu-using-java-lowlevel"></a>

Untuk kontrol unggahan granular, Anda dapat menggunakan API tingkat rendah tempat Anda dapat mengonfigurasi permintaan dan memproses respons. Berikut adalah langkah-langkah untuk mengunggah arsip besar dalam beberapa bagian menggunakan AWS SDK untuk Java.

 

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

   Anda perlu menentukan AWS Wilayah tempat Anda ingin menyimpan arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Mulai unggahan multipart dengan memanggil metode `initiateMultipartUpload`.

   Anda perlu memberi nama vault tempat Anda ingin mengunggah arsip, ukuran bagian yang ingin Anda gunakan untuk mengunggah bagian arsip, dan deskripsi opsional. Anda memberikan informasi ini dengan membuat instans kelas `InitiateMultipartUploadRequest`. Sebagai tanggapan, Amazon Glacier mengembalikan ID unggahan.

1. Unggah bagian dengan memanggil metode `uploadMultipartPart`. 

   Untuk setiap bagian yang Anda unggah, Anda perlu memberi nama vault, rentang byte dalam gabungan arsip final yang akan diunggah di bagian ini, checksum dari data bagian, dan ID unggahan. 

1. Selesaikan unggahan multipart dengan memanggil metode `completeMultipartUpload`.

   Anda perlu memberikan ID unggahan, checksum dari seluruh arsip, ukuran arsip (ukuran gabungan dari semua bagian yang Anda unggah), dan nama vault. Amazon Glacier membuat arsip dari bagian yang diunggah dan mengembalikan ID arsip.

### Contoh: Mengunggah Arsip Besar di Bagian Menggunakan AWS SDK untuk Java
<a name="upload-archive-mpu-java-example"></a>

Contoh kode Java berikut menggunakan AWS SDK untuk Java untuk meng-upload arsip ke vault (`examplevault`). Untuk step-by-step petunjuk tentang cara menjalankan contoh 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 nama file yang ingin Anda unggah.

 

**catatan**  
Contoh ini berlaku untuk ukuran bagian mulai dari 1 MB hingga 1 GB. Namun, Amazon Glacier mendukung ukuran bagian hingga 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();
    }
}
```

# Mengunggah Arsip Besar Menggunakan AWS SDK untuk .NET
<a name="uploading-an-archive-mpu-using-dotnet"></a>

Baik [tingkat tinggi maupun tingkat rendah](using-aws-sdk.md) yang APIs disediakan oleh Amazon SDK for .NET menyediakan metode untuk mengunggah arsip besar di beberapa bagian (lihat). [Mengunggah Arsip di Amazon Glacier](uploading-an-archive.md) 

 
+ API tingkat tinggi menyediakan metode yang dapat Anda gunakan untuk mengunggah arsip dalam ukuran apa pun. Bergantung pada file yang Anda unggah, metode ini mengunggah arsip dalam satu operasi atau menggunakan dukungan unggahan multibagian di Amazon Glacier (Amazon Glacier) untuk mengunggah arsip menjadi beberapa bagian.
+ API tingkat rendah hampir memetakan ke implementasi REST yang mendasarinya. Dengan demikian, ini menyediakan metode untuk mengunggah arsip yang lebih kecil dalam satu operasi dan grup metode yang mendukung unggahan multipart untuk arsip yang lebih besar. Bagian ini menjelaskan mengunggah arsip besar dalam beberapa bagian menggunakan API tingkat rendah.

Untuk informasi lebih lanjut tentang tingkat tinggi dan tingkat rendah APIs, lihat. [Menggunakan AWS SDK untuk .NET dengan Amazon Glacier](using-aws-sdk-for-dot-net.md)

**Topics**
+ [Mengunggah Arsip Besar di Bagian Menggunakan API Tingkat Tinggi AWS SDK untuk .NET](#uploading-an-archive-in-parts-highlevel-using-dotnet)
+ [Mengunggah Arsip Besar di Bagian Menggunakan API Tingkat Rendah AWS SDK untuk .NET](#uploading-an-archive-in-parts-lowlevel-using-dotnet)

## Mengunggah Arsip Besar di Bagian Menggunakan API Tingkat Tinggi AWS SDK untuk .NET
<a name="uploading-an-archive-in-parts-highlevel-using-dotnet"></a>

Anda menggunakan metode API tingkat tinggi yang sama untuk mengunggah arsip kecil atau besar. Berdasarkan ukuran arsip, metode API tingkat tinggi memutuskan apakah akan mengunggah arsip dalam satu operasi atau menggunakan API unggahan multibagian yang disediakan oleh Amazon Glacier. Untuk informasi selengkapnya, lihat [Mengunggah Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET](uploading-an-archive-single-op-using-dotnet.md#uploading-an-archive-single-op-highlevel-using-dotnet).

## Mengunggah Arsip Besar di Bagian Menggunakan API Tingkat Rendah AWS SDK untuk .NET
<a name="uploading-an-archive-in-parts-lowlevel-using-dotnet"></a>

Untuk kontrol unggahan granular, Anda dapat menggunakan API tingkat rendah, tempat Anda dapat mengonfigurasi permintaan dan memproses respons. Berikut adalah langkah-langkah untuk mengunggah arsip besar dalam beberapa bagian menggunakan AWS SDK untuk .NET.

 

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

   Anda perlu menentukan AWS Wilayah tempat Anda ingin menyimpan arsip. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Mulai unggahan multipart dengan memanggil metode `InitiateMultipartUpload`.

   Anda perlu memberi nama vault tempat Anda ingin mengunggah arsip, ukuran bagian yang ingin Anda gunakan untuk mengunggah bagian arsip, dan deskripsi opsional. Anda memberikan informasi ini dengan membuat instans kelas `InitiateMultipartUploadRequest`. Sebagai tanggapan, Amazon Glacier mengembalikan ID unggahan.

1. Unggah bagian dengan memanggil metode `UploadMultipartPart`. 

   Untuk setiap bagian yang Anda unggah, Anda perlu memberi nama vault, rentang byte dalam gabungan arsip final yang akan diunggah di bagian ini, checksum dari data bagian, dan ID unggahan. 

1. Selesaikan unggahan multipart dengan memanggil metode `CompleteMultipartUpload`.

   Anda perlu memberikan ID unggahan, checksum dari seluruh arsip, ukuran arsip (ukuran gabungan dari semua bagian yang Anda unggah), dan nama vault. Amazon Glacier membuat arsip dari bagian yang diunggah dan mengembalikan ID arsip.

### Contoh: Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan Amazon SDK for .NET
<a name="upload-archive-mpu-dotnet-example"></a>

Contoh kode C \$1 berikut menggunakan AWS SDK untuk .NET untuk mengunggah arsip ke vault ()`examplevault`. 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 nama file yang ingin Anda unggah.

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

# Mengunggah Arsip Besar dalam Beberapa Bagian Menggunakan REST API
<a name="uploading-an-archive-mpu-using-rest"></a>

Seperti yang dijelaskan dalam [Mengunggah Arsip Besar dalam Beberapa Bagian (Unggahan Multipart)](uploading-archive-mpu.md), unggahan multipart mengacu pada serangkaian operasi yang memungkinkan Anda mengunggah arsip dalam beberapa bagian dan melakukan operasi terkait. Untuk informasi selengkapnya tentang operasi ini, lihat topik referensi API berikut:

 
+ [Memulai Unggahan Multipart (POST multipart-uploads)](api-multipart-initiate-upload.md)
+ [Mengunggah Bagian (PUT UploadID)](api-upload-part.md)
+ [Menyelesaikan Unggahan Multipart (POST uploadID)](api-multipart-complete-upload.md)
+ [Membatalkan Unggahan Multipart (DELETE uploadID)](api-multipart-abort-upload.md)
+ [Mencantumkan Bagian (GET uploadID)](api-multipart-list-parts.md)
+ [Mencantumkan Unggahan Multipart (GET multipart-uploads)](api-multipart-list-uploads.md)

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

# Menghapus Arsip di Amazon Glacier
<a name="deleting-an-archive"></a>

Anda tidak dapat menghapus arsip menggunakan konsol manajemen Amazon Glacier (Amazon Glacier). Untuk menghapus arsip, Anda harus menggunakan AWS Command Line Interface (CLI) atau menulis kode untuk membuat permintaan penghapusan menggunakan REST API secara langsung atau pustaka pembungkus AWS SDK untuk Java dan .NET. Topik berikut menjelaskan cara menggunakan library wrapper AWS SDK untuk Java dan .NET, REST API, dan. AWS CLI

**Topics**
+ [Menghapus Arsip di Amazon Glacier Menggunakan AWS SDK untuk Java](deleting-an-archive-using-java.md)
+ [Menghapus Arsip di Amazon Glacier Menggunakan AWS SDK untuk .NET](deleting-an-archive-using-dot-net.md)
+ [Menghapus Arsip Amazon Glacier Menggunakan REST API](deleting-an-archive-using-rest.md)
+ [Menghapus Arsip di Amazon Glacier Menggunakan AWS Command Line Interface](deleting-an-archive-using-cli.md)

Anda dapat menghapus satu arsip sekaligus dari vault. Untuk menghapus arsip, Anda harus memberikan ID arsip dalam permintaan hapus Anda. Anda bisa mendapatkan ID arsip dengan mengunduh inventaris vault untuk vault yang berisi arsip. Untuk informasi selengkapnya tentang mengunduh inventaris vault, lihat [Mengunduh Inventaris Vault di Amazon Glacier](vault-inventory.md). 

Setelah menghapus arsip, Anda mungkin masih dapat membuat permintaan yang sukses untuk memulai tugas guna mengambil arsip yang dihapus, tetapi tugas pengambilan arsip akan gagal. 

Pengambilan arsip yang sedang berlangsung untuk ID arsip ketika Anda menghapus arsip mungkin atau mungkin tidak berhasil menurut skenario berikut:

 
+ Jika tugas pengambilan arsip secara aktif menyiapkan data untuk diunduh saat Amazon Glacier menerima permintaan hapus arsip, maka operasi pengambilan arsip mungkin gagal. 
+ Jika pekerjaan pengambilan arsip telah berhasil menyiapkan arsip untuk diunduh saat Amazon Glacier menerima permintaan arsip hapus, maka Anda akan dapat mengunduh hasilnya. 

Untuk informasi selengkapnya tentang pengambilan arsip, lihat [Mengunduh Arsip di Amazon Glacier](downloading-an-archive.md). 

Operasi ini bersifat idempoten. Menghapus arsip yang sudah dihapus tidak mengakibatkan kesalahan. 

Setelah Anda menghapus arsip, jika Anda segera mengunduh inventaris vault, mungkin akan menyertakan arsip yang dihapus dalam daftar karena Amazon Glacier menyiapkan inventaris vault hanya sekitar sekali sehari.

**catatan**  
Untuk penghapusan otomatis arsip vault, lihat [Penghapusan otomatis arsip vault di Amazon S3 Glacier](https://aws.amazon.com/solutions/guidance/automated-deletion-of-vault-archives-in-amazon-s3-glacier/).

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

Berikut ini adalah langkah-langkah untuk menghapus arsip menggunakan API AWS SDK untuk Java tingkat rendah.

 

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

   Anda perlu menentukan AWS Wilayah tempat arsip yang ingin Anda hapus disimpan. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Berikan informasi permintaan dengan membuat instans kelas `DeleteArchiveRequest`.

   Anda harus memberikan ID arsip, nama vault, dan ID akun Anda. Jika Anda tidak memberikan ID akun, ID akun yang terkait dengan kredensial yang Anda berikan untuk menandatangani permintaan akan diambil. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDK untuk Java dengan Amazon Glacier](using-aws-sdk-for-java.md).

1. Jalankan metode `deleteArchive` dengan menyediakan objek permintaan sebagai parameter. 

Potongan kode Java berikut menggambarkan langkah-langkah sebelumnya.

```
AmazonGlacierClient client;

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

client.deleteArchive(request);
```

 

**catatan**  
Untuk informasi tentang REST API yang mendasarinya, lihat [Menghapus Arsip (DELETE archive)](api-archive-delete.md).

## Contoh: Menghapus Arsip Menggunakan AWS SDK untuk Java
<a name="deleting-an-archive-using-java-example"></a>

Contoh kode Java berikut menggunakan AWS SDK untuk Java untuk menghapus arsip. Untuk step-by-step petunjuk tentang cara menjalankan contoh 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 nama vault dan ID arsip dari arsip yang ingin Anda hapus.

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

# Menghapus Arsip di Amazon Glacier Menggunakan AWS SDK untuk .NET
<a name="deleting-an-archive-using-dot-net"></a>

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

**Topics**
+ [Menghapus Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET](#delete-archive-using-dot-net-high-level)
+ [Menghapus Arsip Menggunakan API Tingkat Rendah AWS SDK untuk .NET](#delete-archive-using-dot-net-low-level)

## Menghapus Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET
<a name="delete-archive-using-dot-net-high-level"></a>

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

### Contoh: Menghapus Arsip Menggunakan API Tingkat Tinggi AWS SDK untuk .NET
<a name="delete-archive-dot-net-high-level-example"></a>

Contoh kode C \$1 berikut menggunakan API tingkat tinggi AWS SDK untuk .NET untuk menghapus arsip. 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 dari arsip yang ingin Anda hapus.

**Example**  

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

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

## Menghapus Arsip Menggunakan API Tingkat Rendah AWS SDK untuk .NET
<a name="delete-archive-using-dot-net-low-level"></a>

Berikut adalah langkah-langkah untuk menghapus menggunakan AWS SDK untuk .NET.

 

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

   Anda perlu menentukan AWS Wilayah tempat arsip yang ingin Anda hapus disimpan. Semua operasi yang Anda lakukan menggunakan klien ini berlaku untuk AWS Wilayah tersebut. 

1. Berikan informasi permintaan dengan membuat instans kelas `DeleteArchiveRequest`.

   Anda harus memberikan ID arsip, nama vault, dan ID akun Anda. Jika Anda tidak memberikan ID akun, ID akun yang terkait dengan kredensial yang Anda berikan untuk menandatangani permintaan akan diambil. Untuk informasi selengkapnya, lihat [Menggunakan AWS SDKs dengan Amazon Glacier](using-aws-sdk.md).

1. Jalankan metode `DeleteArchive` dengan menyediakan objek permintaan sebagai parameter. 

### Contoh: Menghapus Arsip Menggunakan API Tingkat Rendah AWS SDK untuk .NET
<a name="delete-archive-dot-net-low-level-example"></a>

Contoh C\$1 berikut menjelaskan langkah sebelumnya. Contoh menggunakan API tingkat rendah AWS SDK untuk .NET untuk menghapus arsip.

**catatan**  
Untuk informasi tentang REST API yang mendasarinya, lihat [Menghapus Arsip (DELETE archive)](api-archive-delete.md).

 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 dari arsip yang ingin Anda hapus.

**Example**  

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

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

# Menghapus Arsip Amazon Glacier Menggunakan REST API
<a name="deleting-an-archive-using-rest"></a>

Anda dapat menggunakan API Hapus Arsip untuk menghapus arsip. 
+ Untuk informasi tentang API Hapus Arsip, lihat [Menghapus Arsip (DELETE archive)](api-archive-delete.md).
+ Untuk informasi selengkapnya tentang menggunakan REST API, lihat [Referensi API untuk Amazon Glacier](amazon-glacier-api.md). 

# Menghapus Arsip di Amazon Glacier Menggunakan AWS Command Line Interface
<a name="deleting-an-archive-using-cli"></a>

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

**Topics**
+ [(Prasyarat) Menyiapkan AWS CLI](#Creating-Vaults-CLI-Setup)
+ [Contoh: Menghapus Arsip Menggunakan AWS CLI](#Deleting-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 *: 

    [Instalasi 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: Menghapus Arsip Menggunakan AWS CLI
<a name="Deleting-Archives-CLI-Implementation"></a>

1. Gunakan perintah [https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-job.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-job.html) untuk memulai tugas pengambilan inventaris.

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

    Output yang diharapkan:

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

1. Gunakan perintah [https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-job.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-job.html) untuk memeriksa status tugas pengambilan sebelumnya.

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

    Output 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 [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) untuk mengunduh tugas pengambilan ke file `output.json`.

   ```
   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 perintah `delete-archive` untuk menghapus setiap arsip dari vault sampai tidak ada yang tersisa.

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