

 **このページは、ボールトと 2012 年リリース当時の REST API を使用する、Amazon Glacier サービスの既存のお客様のみを対象としています。**

アーカイブストレージソリューションをお探しの場合は、Amazon S3 の Amazon Glacier ストレージクラス (S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive) を使用することをお勧めします。これらのストレージオプションの詳細については、「[Amazon Glacier ストレージクラス](https://aws.amazon.com/s3/storage-classes/glacier/)」を参照してください。

Amazon Glacier (元のスタンドアロンボールトベースのサービス) は、新規顧客を受け入れなくなりました。Amazon Glacier は、ボールトにデータを保存する独自の API を備えたスタンドアロンサービスであり、Amazon S3 および Amazon S3 Glacier ストレージクラスとは異なります。既存のデータは Amazon Glacier で無期限に安全性が確保され、引き続きアクセス可能です。移行は必要ありません。低コストの長期アーカイブストレージの場合、 は [Amazon S3 Glacier ストレージクラス](https://aws.amazon.com/s3/storage-classes/glacier/) AWS を推奨します。これにより、S3 バケットベースの APIs、低コスト、 AWS サービス統合で優れたカスタマーエクスペリエンスを実現できます。 AWS リージョン 拡張機能が必要な場合は、[Amazon Glacier ボールトから Amazon S3 Glacier ストレージクラスにデータを転送するためのAWS ソリューションガイダンス](https://aws.amazon.com/solutions/guidance/data-transfer-from-amazon-s3-glacier-vaults-to-amazon-s3/)を使用して、Amazon S3 Glacier ストレージクラスへの移行を検討してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Glacier でアーカイブを使用する
<a name="working-with-archives"></a>

アーカイブとは、写真、動画、ドキュメントなど、ボールトに格納するオブジェクトを指します。これは、Amazon Glacier (Amazon Glacier) のストレージの基本単位です。各アーカイブには一意の ID とオプションの説明が割り当てられます。アーカイブをアップロードすると、Amazon Glacier はアーカイブ ID を含むレスポンスを返します。このアーカイブ ID は、アーカイブが保存されている AWS リージョンで一意です。アーカイブ ID の例を次に示します。

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

 アーカイブ ID は 138 バイトです。アーカイブをアップロードする際に、オプションの説明を指定できます。ID を使用してアーカイブを取得することはできますが、説明を使用してアーカイブを取得することはできません。

 

**重要**  
Amazon Glacier は管理コンソールを提供します。コンソール​を使用して、ボールトの作成および削除を行うことができます。ただし、それ以外の Amazon Glacier の操作には、 AWS Command Line Interface (CLI) の使用またはコードの記述が必要になります。たとえば、写真、動画、その他のドキュメントなどのデータをアップロードするには、 を使用するか、REST API を直接使用する AWS CLI か、Amazon SDKs を使用して、コードを記述してリクエストを行う必要があります。で Amazon Glacier を使用する方法の詳細については AWS CLI、[AWS CLI Amazon Glacier のリファレンス](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)」を参照してください。をインストールするには AWS CLI、「」を参照してください[AWS Command Line Interface](https://aws.amazon.com/cli/)。

**Topics**
+ [

## Amazon Glacier でのアーカイブオペレーション
](#archive-operations-quick-intro)
+ [

## クライアント側でのアーカイブのメタデータの管理
](#client-side-key-map-concept)
+ [

# Amazon Glacier へのアーカイブのアップロード
](uploading-an-archive.md)
+ [

# Amazon Glacier でのアーカイブのダウンロード
](downloading-an-archive.md)
+ [

# Amazon Glacier でのアーカイブの削除
](deleting-an-archive.md)

## Amazon Glacier でのアーカイブオペレーション
<a name="archive-operations-quick-intro"></a>

Amazon Glacier では、基本的なアーカイブオペレーション (アップロード、ダウンロード、および削除) をサポートしています。アーカイブのダウンロードは、非同期オペレーションです。

### Amazon Glacier へのアーカイブのアップロード
<a name="uploading-an-archive-quick-intro"></a>

アーカイブは、1 回のオペレーションまたはパート単位でアップロードできます。アーカイブをパート単位でアップロードするために使用する API 呼び出しはマルチパートアップロードと呼ばれます。詳細については、「[Amazon Glacier へのアーカイブのアップロード](uploading-an-archive.md)」を参照してください。

 

**重要**  
Amazon Glacier は管理コンソールを提供します。コンソール​を使用して、ボールトの作成および削除を行うことができます。ただし、Amazon Glacier との他のすべてのやり取りでは、 AWS Command Line Interface (CLI) を使用するか、コードを記述する必要があります。たとえば、写真、動画、その他のドキュメントなどのデータをアップロードするには、 を使用するか、REST API を直接使用する AWS CLI か、Amazon SDKs を使用して、コードを記述してリクエストを行う必要があります。で Amazon Glacier を使用する方法の詳細については AWS CLI、[AWS CLI Amazon Glacier のリファレンス](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)」を参照してください。をインストールするには AWS CLI、「」を参照してください[AWS Command Line Interface](https://aws.amazon.com/cli/)。

### Amazon Glacier でのアーカイブ ID の検索
<a name="finding-an-archive-id-quick-intro"></a>

アーカイブ ID は、そのアーカイブを含むボールトのボールトインベントリをダウンロードすることで取得できます。ボールトインベントリのダウンロードの詳細については、「[Amazon Glacier でボールトインベントリをダウンロードする](vault-inventory.md)」を参照してください。

### Amazon Glacier でのアーカイブのダウンロード
<a name="downloading-an-archive-quick-intro"></a>

アーカイブのダウンロードは、非同期オペレーションです。まず、特定のアーカイブをダウンロードするためのジョブを開始する必要があります。Amazon Glacier はジョブのリクエストを受け取った後で、ダウンロードするアーカイブを準備します。ジョブが完了すると、アーカイブデータをダウンロードできます。このジョブは非同期であるため、ジョブの完了時に Amazon Simple Notification Service (Amazon SNS) トピックに通知を送信するように Amazon Glacier にリクエストすることができます。個々のジョブリクエストごとに SNS トピックを指定することや、特定のイベントが発生したときに通知を送信するようにボールトを設定することができます。アーカイブのダウンロードの詳細については、「[Amazon Glacier でのアーカイブのダウンロード](downloading-an-archive.md)」を参照してください。

### Amazon Glacier でのアーカイブの削除
<a name="deleting-an-archive-quick-intro"></a>

Amazon Glacier に用意されている API コールを使用して削除できるアーカイブは一度に 1 つです。詳細については、「[Amazon Glacier でのアーカイブの削除](deleting-an-archive.md)」を参照してください。

### Amazon Glacier でのアーカイブの更新
<a name="updating-an-archive-quick-intro"></a>

アーカイブをアップロードした後で、アーカイブのコンテンツや説明を更新することはできません。アーカイブのコンテンツや説明を更新する唯一の方法は、アーカイブを削除し、新しくアーカイブをアップロードすることです。アーカイブをアップロードするたびに、Amazon Glacier により一意のアーカイブ ID が返されることに注意してください。

## クライアント側でのアーカイブのメタデータの管理
<a name="client-side-key-map-concept"></a>

オプションのアーカイブの説明以外に、Amazon Glacier ではアーカイブに対してどのような追加のメタデータもサポートしていません。アーカイブのアップロード時に、Amazon Glacier により ID が割り当てられます。ID はアーカイブに関するどのような情報も推察することができないように、意味のない文字列になっています。クライアント側でアーカイブに関するメタデータを管理することもできます。メタデータには、アーカイブ名と、アーカイブに関するその他の有益な情報を含めることができます。

**注記**  
Amazon Simple Storage Service (Amazon S3) のユーザーなら、バケットにオブジェクトをアップロードすると、そのオブジェクトに `MyDocument.txt` や `SomePhoto.jpg` などのオブジェクトキーを割り当てることができることをご存知だと思います。Amazon Glacier では、アップロードしたアーカイブにオブジェクトキーを割り当てることはできません。

クライアント側でアーカイブのメタデータを管理する場合、アーカイブのアップロード時に指定したアーカイブの説明とアーカイブ ID を含むボールトインベントリを Amazon Glacier が管理していることに注意してください。アーカイブのメタデータを管理するクライアント側のデータベースの問題を調整するために、ボールトインベントリをダウンロードすることもできます。ただし、Amazon Glacier はほぼ毎日、ボールトインベントリを更新します。ボールトインベントリをリクエストすると、Amazon Glacier は用意した最新のインベントリ (ポイントインタイムのスナップショット) を返します。

# Amazon Glacier へのアーカイブのアップロード
<a name="uploading-an-archive"></a>

Amazon Glacier (Amazon Glacier) が備えている管理コンソールを使用して、ボールトの作成と削除を実行できます。ただし、管理コンソールを使用して Amazon Glacier にアーカイブをアップロードすることはできません。写真、動画、その他のドキュメントなどのデータをアップロードするには、REST API を直接使用する AWS CLI か、Amazon SDKs を使用して、 を使用するか、コードを記述してリクエストを行う必要があります。

で Amazon Glacier を使用する方法については AWS CLI、[AWS CLI Amazon Glacier のリファレンス](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)」を参照してください。をインストールするには AWS CLI、「」を参照してください[AWS Command Line Interface](https://aws.amazon.com/cli/)。以下の**「アップロード」**トピックでは、Amazon SDK for Java、Amazon SDK for .NET、REST API を使用して、アーカイブを Amazon Glacier にアップロードする方法を説明します。

**Topics**
+ [

## Amazon Glacier にアーカイブをアップロードするためのオプション
](#uploading-an-archive-overview)
+ [

# 1 回のオペレーションでアーカイブをアップロードする
](uploading-archive-single-operation.md)
+ [

# パート単位での大きなアーカイブのアップロード (マルチパートアップロード)
](uploading-archive-mpu.md)

## Amazon Glacier にアーカイブをアップロードするためのオプション
<a name="uploading-an-archive-overview"></a>

Amazon Glacier には、アップロードするデータのサイズに応じた以下のオプションが用意されています。
+ **単一操作によりアーカイブをアップロードする** - 1 回のアップロードオペレーションでは、1 バイトから最大 4 GB までのサイズのアーカイブをアップロードできます。ただし、Amazon Glacier のユーザーには 100 MB を超えるサイズのアーカイブをアップロードする際には、マルチパートアップロードを使用することをお勧めします。詳細については、「[1 回のオペレーションでアーカイブをアップロードする](uploading-archive-single-operation.md)」を参照してください。
+ **複数のパートに分けてアーカイブをアップロードする** - マルチパートアップロード API を使用すると、最大約 40,000 GB (10,000 x 4 GB) の大きなアーカイブをアップロードすることができます。

  マルチパートアップロード API 呼び出しは、大容量のアーカイブのアップロードを効率良く行えるように設計されています。アーカイブをいくつかのパートに分けてアップロードできます。パートは、任意の順序で独立かつ並列にアップロードされます。パートのアップロードが失敗した場合、アーカイブ全体ではなく、失敗したパートのみを再度アップロードするだけで済みます。マルチパートアップロードは、1 バイトから約 40,000 GB までのサイズのアーカイブに対して使用できます。詳細については、「[パート単位での大きなアーカイブのアップロード (マルチパートアップロード)](uploading-archive-mpu.md)」を参照してください。

**重要**  
Amazon Glacier ボールトインベントリは 1 日 1 回のみ更新されます。アーカイブをアップロードしても、ボールトに追加された新しいアーカイブはすぐには、コンソールやダウンロード済みボールトインベントリのリストに表示されません。表示されるのは、ボールトインベントリが更新されてからになります。

### AWS Snowball Edge サービスの使用
<a name="using-import-export-service-for-glacier"></a>

AWS Snowball Edge は、インターネットをバイパスして、Amazon 所有のデバイス AWS の使用との間で大量のデータの移動を高速化します。詳細については、[AWS Snowball Edge](https://aws.amazon.com/snowball) の詳細ページを参照してください。

既存のデータを Amazon Glacier (Amazon Glacier) にアップロードするには、いずれかの AWS Snowball Edge デバイスタイプを使用して Amazon S3 にデータをインポートしてから、ライフサイクルルールを使用してアーカイブのために Amazon Glacier ストレージクラスに移行することを検討できます。Amazon S3 オブジェクトを Amazon Glacier ストレージクラスに移行する際に、Amazon S3 は内部的に Amazon Glacier を使用して、堅牢なストレージをより低コストで実現します。オブジェクトは Amazon Glacier に保存されますが、引き続き Amazon S3 で管理する Amazon S3 オブジェクトであり、Amazon Glacier を介して直接アクセスすることはできません。

Amazon S3 ライフサイクル設定と Amazon Glacier ストレージクラスへのオブジェクト移行の詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[オブジェクトのライフサイクル 管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)」と「[オブジェクトの移行](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html)」を参照してください。

# 1 回のオペレーションでアーカイブをアップロードする
<a name="uploading-archive-single-operation"></a>

「[Amazon Glacier へのアーカイブのアップロード](uploading-an-archive.md)」で説明しているように、1 回のオペレーションで小さいサイズのアーカイブをアップロードできます。ただし、Amazon Glacier (Amazon Glacier) のユーザーには 100 MB を超えるサイズのアーカイブをアップロードする際には、マルチパートアップロードを使用することをお勧めします。

**Topics**
+ [

# を使用した 1 回のオペレーションでのアーカイブのアップロード AWS Command Line Interface
](uploading-an-archive-single-op-using-cli.md)
+ [

# を使用した 1 回のオペレーションでのアーカイブのアップロード AWS SDK for Java
](uploading-an-archive-single-op-using-java.md)
+ [

# Amazon Glacier の を使用して 1 回のオペレーション AWS SDK for .NET でアーカイブをアップロードする
](uploading-an-archive-single-op-using-dotnet.md)
+ [

# REST API を使用して 1 回のオペレーションでアーカイブをアップロードする
](uploading-an-archive-single-op-using-rest.md)

# を使用した 1 回のオペレーションでのアーカイブのアップロード AWS Command Line Interface
<a name="uploading-an-archive-single-op-using-cli"></a>

 AWS Command Line Interface () を使用して Amazon Glacier (Amazon Glacier) にアーカイブをアップロードできますAWS CLI。

**Topics**
+ [

## (前提条件) のセットアップ AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## 例: を使用してアーカイブをアップロードする AWS CLI
](#Uploading-Archives-CLI-Implementation)

## (前提条件) のセットアップ AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1.  AWS CLIをダウンロードして設定します。手順については、*「AWS Command Line Interface ユーザーガイド」*の次のトピックを参照してください。

    [のインストール AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

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

1. コマンドプロンプトで次のコマンドを入力して、 AWS CLI セットアップを確認します。これらのコマンドは、いずれも認証情報を明示的に提供しないため、デフォルトプロファイルの認証情報が使用されます。
   + help コマンドを使用してください。

     ```
     aws help
     ```
   + 設定したアカウントの Amazon Glacier ボールトのリストを取得するには、`list-vaults` コマンドを使用します。*123456789012* を AWS アカウント ID に置き換えます。

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + の現在の設定データを表示するには AWS CLI、 `aws configure list` コマンドを使用します。

     ```
     aws configure list
     ```

## 例: を使用してアーカイブをアップロードする AWS CLI
<a name="Uploading-Archives-CLI-Implementation"></a>

アーカイブをアップロードするには、ボールトを作成している必要があります。ボールトの作成方法の詳細については、「[Amazon Glacier でボールトを作成する](creating-vaults.md)」を参照してください。

1. `upload-archive` コマンドを使用して、既存のボールトにアーカイブを追加します。以下の例では、`vault name` を `account ID` と置き換えます。`body` パラメータには、アップロードするファイルへのパスを指定します。

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

1.  正常な出力:

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

   終了すると、コマンドはアーカイブ ID、チェックサム、Amazon Glacier 内の場所を出力します。upload-archive コマンドの詳細については、「AWS CLI コマンドリファレンス」の「[upload-archive](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-archive.html)」を参照してください。**

# を使用した 1 回のオペレーションでのアーカイブのアップロード AWS SDK for Java
<a name="uploading-an-archive-single-op-using-java"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md)Amazon SDK for Java で提供されており、アーカイブをアップロードする方法を提供します。

**Topics**
+ [

## の高レベル API を使用したアーカイブのアップロード AWS SDK for Java
](#uploading-an-archive-single-op-high-level-using-java)
+ [

## の低レベル API を使用した 1 回のオペレーションでのアーカイブのアップロード AWS SDK for Java
](#uploading-an-archive-single-op-low-level-using-java)

## の高レベル API を使用したアーカイブのアップロード AWS SDK for Java
<a name="uploading-an-archive-single-op-high-level-using-java"></a>

高レベル API の `ArchiveTransferManager` クラスには、ボールトへのアーカイブのアップロードに使用できる `upload` メソッドが用意されています。

 

**注記**  
`upload` メソッドを使用して、小さなアーカイブや大きなアーカイブをアップロードできます。このメソッドでは、アップロードするアーカイブのサイズに応じて、1 回のオペレーションでアップロードするか、マルチパートアップロード API を使用してアーカイブをパート単位でアップロードするかを決定します。

### 例: の高レベル API を使用したアーカイブのアップロード AWS SDK for Java
<a name="upload-archive-high-level-java-example"></a>

次の Java コード例では、米国西部（オレゴン リージョン (`us-west-2`)のボールト (`examplevault`) にアーカイブをアップロードします。サポートされている AWS リージョンとエンドポイントのリストについては、「」を参照してください[Amazon Glacier へのアクセス](amazon-glacier-accessing.md)。

この例を実行するための詳しい手順については、「[Eclipse を使用した Amazon Glacier の Java 実行例](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java)」を参照してください。ここに示したコードは、アップロードするボールトの名前とファイルの名前で更新する必要があります。

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

## の低レベル API を使用した 1 回のオペレーションでのアーカイブのアップロード AWS SDK for Java
<a name="uploading-an-archive-single-op-low-level-using-java"></a>

低レベル API には、アーカイブに関するあらゆるオペレーションのメソッドが用意されています。以下では、 AWS SDK for Javaを使用してアーカイブをアップロードするステップを説明します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   アーカイブをアップロードする AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `UploadArchiveRequest` クラスのインスタンスを作成することにより、リクエスト情報を指定します。

   アップロードするデータのほかにも、ペイロードのチェックサム (SHA-256 木構造ハッシュ)、ボールト名、データのコンテンツの長さ、およびアカウント ID を指定する必要があります。

   アカウント ID を指定しなかった場合には、リクエストに署名する際に使用した認証情報に関連付けられているアカウント ID が使用されます。詳細については、「[Amazon Glacier AWS SDK for Java での の使用](using-aws-sdk-for-java.md)」を参照してください。

1. リクエストオブジェクトをパラメータとして指定して、`uploadArchive` メソッドを実行します。

   レスポンスでは、Amazon Glacier (Amazon Glacier) によって新しくアップロードされたアーカイブのアーカイブ ID が返されます。

以下の Java コードスニペットは、前述の手順を示しています。

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

### 例: の低レベル API を使用して 1 回のオペレーションでアーカイブをアップロードする AWS SDK for Java
<a name="uploding-single-archive-using-java-example"></a>

次の Java コード例では、 AWS SDK for Java を使用してアーカイブをボールト () にアップロードします`examplevault`。この例を実行するための詳しい手順については、「[Eclipse を使用した Amazon Glacier の Java 実行例](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java)」を参照してください。ここに示したコードは、アップロードするボールトの名前とファイルの名前で更新する必要があります。

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

# Amazon Glacier の を使用して 1 回のオペレーション AWS SDK for .NET でアーカイブをアップロードする
<a name="uploading-an-archive-single-op-using-dotnet"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md).NET 用の Amazon SDK で提供されているには、1 回のオペレーションでアーカイブをアップロードすることができます。

**Topics**
+ [

## の高レベル API を使用したアーカイブのアップロード AWS SDK for .NET
](#uploading-an-archive-single-op-highlevel-using-dotnet)
+ [

## の低レベル API を使用した 1 回のオペレーションでのアーカイブのアップロード AWS SDK for .NET
](#uploading-an-archive-single-op-lowlevel-using-dotnet)

## の高レベル API を使用したアーカイブのアップロード AWS SDK for .NET
<a name="uploading-an-archive-single-op-highlevel-using-dotnet"></a>

高レベル API の `ArchiveTransferManager` クラスには、ボールトへのアーカイブのアップロードに使用できる `Upload` メソッドが用意されています。

**注記**  
`Upload` メソッドを使用して、小さなファイルや大きなファイルをアップロードできます。このメソッドでは、アップロードするファイルのサイズに応じて、1 回のオペレーションでアップロードするか、マルチパートアップロード API を使用してファイルをパート単位でアップロードするかを決定します。

### 例: の高レベル API を使用したアーカイブのアップロード AWS SDK for .NET
<a name="upload-archive-highlevel-any-size-dotnet"></a>

次の C\$1 コード例では、米国西部（オレゴン リージョン のボールト (`examplevault`) にアーカイブをアップロードします。

この例を実行するための詳しい手順については、「[コード例の実行](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)」を参照してください。ここに示したコードは、アップロードするファイルの名前で更新する必要があります。

**Example**  

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

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

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

## の低レベル API を使用した 1 回のオペレーションでのアーカイブのアップロード AWS SDK for .NET
<a name="uploading-an-archive-single-op-lowlevel-using-dotnet"></a>

低レベル API には、アーカイブに関するあらゆるオペレーションのメソッドが用意されています。以下では、 AWS SDK for .NETを使用してアーカイブをアップロードするステップを説明します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   アーカイブをアップロードする AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `UploadArchiveRequest` クラスのインスタンスを作成することにより、リクエスト情報を指定します。

   アップロードするデータのほかにも、ペイロードのチェックサム (SHA-256 木構造ハッシュ)、ボールト名、およびアカウント ID を指定する必要があります。

   アカウント ID を指定しなかった場合には、リクエストに署名する際に使用した認証情報に関連付けられているアカウント ID が使用されます。詳細については、「[Amazon Glacier でのAWS SDK for .NET の使用](using-aws-sdk-for-dot-net.md)」を参照してください。

1. リクエストオブジェクトをパラメータとして指定して、`UploadArchive` メソッドを実行します。

   レスポンスでは、Amazon Glacier によって新しくアップロードされたアーカイブのアーカイブ ID が返されます。

### 例: の低レベル API を使用して 1 回のオペレーションでアーカイブをアップロードする AWS SDK for .NET
<a name="upload-archive-single-op-lowlevel-dotnet"></a>

以下の C\$1 コードの例は、前述の手順を示しています。この例では、 AWS SDK for .NET を使用してアーカイブをボールト () にアップロードします`examplevault`。

**注記**  
1 回のリクエストでアーカイブをアップロードする際に基盤となる REST API については、「[アーカイブのアップロード (POST archive)](api-archive-post.md)」を参照してください。

この例を実行するための詳しい手順については、「[コード例の実行](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)」を参照してください。ここに示したコードは、アップロードするファイルの名前で更新する必要があります。

**Example**  

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

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

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

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

# REST API を使用して 1 回のオペレーションでアーカイブをアップロードする
<a name="uploading-an-archive-single-op-using-rest"></a>

アーカイブのアップロード API コールを使用して、1 回のオペレーションでアーカイブをアップロードすることができます。詳細については、「[アーカイブのアップロード (POST archive)](api-archive-post.md)」を参照してください。

# パート単位での大きなアーカイブのアップロード (マルチパートアップロード)
<a name="uploading-archive-mpu"></a>

**Topics**
+ [

## マルチパートアップロードのプロセス
](#MPUprocess)
+ [

## 基本情報
](#qfacts)
+ [

# を使用した大きなアーカイブのアップロード AWS CLI
](uploading-an-archive-mpu-using-cli.md)
+ [

# Amazon SDK for Java を使用してパート単位で大きなアーカイブをアップロードする
](uploading-an-archive-mpu-using-java.md)
+ [

# を使用した大きなアーカイブのアップロード AWS SDK for .NET
](uploading-an-archive-mpu-using-dotnet.md)
+ [

# REST API を使用してパート単位で大きなアーカイブをアップロードする
](uploading-an-archive-mpu-using-rest.md)

## マルチパートアップロードのプロセス
<a name="MPUprocess"></a>

「[Amazon Glacier へのアーカイブのアップロード](uploading-an-archive.md)」で説明しているように、Amazon Glacier (Amazon Glacier) をご利用のお客様には、100 メビバイト (MiB) を超えるサイズのアーカイブをアップロードする際にはマルチパートアップロードを使用することをお勧めします。

1. **Initiate Multipart Upload** 

   マルチパートアップロードを開始するリクエストを送信すると、マルチパートアップロード ID が Amazon Glacier から返されます。アップロード ID はマルチパートアップロードの一意の識別子です。後続のマルチパートアップロードオペレーションには、この ID が必要です。この ID は、Amazon Glacier がジョブを完了してから少なくとも 24 時間は有効です。

   マルチパートアップロードの開始リクエストで、パートサイズをバイト数で指定します。アップロードするパートは、最後のパートを除き、すべてこのサイズになります。
**注記**  
マルチパートアップロードを使用する際にアーカイブ全体のサイズを把握している必要はありません。つまり、アーカイブのアップロードを開始するときにアーカイブのサイズがわからない場合でも、マルチパートアップロードを使用できます。パートサイズを決定する必要があるのは、マルチパートアップロードの開始時のみです。

   マルチパートアップロードの開始リクエストでは、オプションでアーカイブの説明を指定することもできます。

1. **パートのアップロード**

   パートのアップロードの各リクエストに、ステップ 1 で取得したマルチパートアップロード ID を含める必要があります。リクエストには、最終的なアーカイブ内でのパートの位置を特定するコンテンツ範囲をバイト単位で指定する必要もあります。Amazon Glacier は後でコンテンツ範囲情報を使用して、アーカイブを適切な順序で組み立てます。アップロードする各パートのコンテンツ範囲を指定するため、&GL; は最終的にアセンブルされたアーカイブ内でのパートの位置を特定できます。そのため、任意の順序でパートをアップロードできます。このほか、複数のパートを並行してアップロードすることもできます。以前にアップロードしたパートと同じコンテンツ範囲を使って新しいパートをアップロードした場合、以前のパートは上書きされます。

1. **マルチパートアップロードの完了 (または中止)**

   アーカイブのパートをすべてアップロードしたら、完了オペレーションを使用します。ここでも、リクエストでアップロード ID を指定する必要があります。Amazon Glacier は、指定したコンテンツ範囲に基づいて昇順に連結されたアーカイブを作成します。マルチパートアップロードの完了リクエストに対する Amazon Glacier レスポンスには、新しく作成されたアーカイブのアーカイブ ID が含まれます。マルチパートアップロードの開始リクエストでオプションのアーカイブの説明を指定した場合は、Amazon Glacier により、アセンブルされたアーカイブにそのアーカイブの説明が関連付けられます。マルチパートアップロードが正常に完了すると、マルチパートアップロード ID を参照できなくなります。つまり、マルチパートアップロード ID に関連付けられているパートにアクセスできなくなります。

   マルチパートアップロードを中止すると、そのマルチパートアップロード ID を使用してパートをアップロードできなくなります。中止されたマルチパートアップロードに関連付けられているパートによって消費されているストレージはすべて解放されます。パートのアップロードが進行しているときにマルチパートアップロードを停止した場合は、停止後もそのパートのアップロードは成功または失敗する可能性があります。

### その他のマルチパートアップロードオペレーション
<a name="additional-mpu-operations"></a>

Amazon Glacier (Amazon Glacier) には、次のマルチパートアップロード API コールが追加で用意されています。

 
+ **パートのリスト** - このオペレーションを使用すると、特定のマルチパートアップロードのパートのリストを表示できます。マルチパートアップロードでアップロードしたパートに関する情報が返されます。パートのリストのリクエストごとに、Amazon Glacier により最大 1,000 個のパートの情報が返されます。表示するマルチパートアップロードのパートがさらにある場合、結果がページ分割され、レスポンスにはリストの続きを表示するためのマーカーが返されます。後続のパートを取得するには、追加のリクエストを送信する必要があります。返されるパートのリストには、アップロードが完了していないパートは含まれていないことにご留意ください。
+ **マルチパートアップロードのリスト** - このオペレーションを使用すると、進行中のマルチパートアップロードのリストを取得できます。進行中のマルチパートアップロードとは、開始されているものの、まだ完了または停止されていないアップロードを意味します。マルチパートアップロードのリストのリクエストごとに、最大 1,000 個のマルチパートアップロードが返されます。表示するマルチパートアップロードがさらにある場合、結果がページ分割され、レスポンスにはリストの続きを表示するためのマーカーが返されます。残りのマルチパートアップロードを取得するには、追加のリクエストを送信する必要があります。

## 基本情報
<a name="qfacts"></a>

次の表は、マルチパートアップロードの主な仕様をまとめたものです。


| 項目 | 仕様 | 
| --- | --- | 
| アーカイブの最大サイズ | 10,000 x 4 ギビバイト (GiB)  | 
| アップロードあたりの最大パート数 | 10,000 | 
| パートサイズ | 1 MiB～4 GiB、最後の部分は 1 MiB 未満にすることができます。サイズの値をバイト単位で指定します。 パートサイズは、メビバイト (1024 キビバイト [KiB]) に 2 の累乗を掛けた値でなければなりません。たとえば、`1048576` (1 MiB)、`2097152` (2 MiB)、`4194304` (4 MiB)、`8388608` (8 MiB) です。  | 
| パートのリストリクエストで返されるパートの最大数 | 1,000  | 
| マルチパートアップロードのリストリクエストで返されるマルチパートアップロードの最大数 | 1,000  | 

# を使用した大きなアーカイブのアップロード AWS CLI
<a name="uploading-an-archive-mpu-using-cli"></a>

 AWS Command Line Interface () を使用して、Amazon Glacier (Amazon Glacier) にアーカイブをアップロードできますAWS CLI。大きなアーカイブのアップロードエクスペリエンスを向上させるために、Amazon Glacier にはマルチパートアップロードをサポートするいくつかの API オペレーションが用意されています。これらの API オペレーションを使用すると、アーカイブを分割してアップロードできます。パートは、任意の順序で独立かつ並列にアップロードされます。パートのアップロードが失敗した場合、アーカイブ全体ではなく、失敗したパートのみを再度アップロードするだけで済みます。マルチパートアップロードは、1 バイトから約 40,000 ギビバイト (GiB) までのサイズのアーカイブに対して使用できます。

Amazon Glacier マルチパートアップロードの詳細については、「[パート単位での大きなアーカイブのアップロード (マルチパートアップロード)](uploading-archive-mpu.md)」を参照してください。

**Topics**
+ [

## (前提条件) のセットアップ AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## (前提条件) Python のインストール
](#Uploading-Archives-mpu-CLI-Install-Python)
+ [

## (前提条件) Amazon Glacier ボールトの作成
](#Uploading-Archives-mpu-CLI-Create-Vault)
+ [

## 例: を使用してパート単位で大きなアーカイブをアップロードする AWS CLI
](#Uploading-Archives-mpu-CLI-Implementation)

## (前提条件) のセットアップ AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1.  AWS CLIをダウンロードして設定します。手順については、*「AWS Command Line Interface ユーザーガイド」*の次のトピックを参照してください。

    [のインストール AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

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

1. コマンドプロンプトで次のコマンドを入力して、 AWS CLI セットアップを確認します。これらのコマンドは、いずれも認証情報を明示的に提供しないため、デフォルトプロファイルの認証情報が使用されます。
   + help コマンドを使用してください。

     ```
     aws help
     ```
   + 設定したアカウントの Amazon Glacier ボールトのリストを取得するには、`list-vaults` コマンドを使用します。*123456789012* を AWS アカウント ID に置き換えます。

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + の現在の設定データを表示するには AWS CLI、 `aws configure list` コマンドを使用します。

     ```
     aws configure list
     ```

## (前提条件) Python のインストール
<a name="Uploading-Archives-mpu-CLI-Install-Python"></a>

マルチパートアップロードを完了するには、アップロードするアーカイブの SHA256 木構造ハッシュを計算する必要があります。これは、アップロードするファイルの SHA256 木構造ハッシュを計算することとは異なります。アップロードするアーカイブの SHA256 木構造ハッシュを計算するには、Java、C\$1 (.NET を使用)、または Python を使用できます。この例では、Python を使用します。Java または C\$1 を使用する手順については、「[チェックサムの計算](checksum-calculations.md)」を参照してください。

Python のインストールの詳細については、「Boto3 デベロッパーガイド」の「[Python のインストールまたは更新](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation)」を参照してください。**

## (前提条件) Amazon Glacier ボールトの作成
<a name="Uploading-Archives-mpu-CLI-Create-Vault"></a>

次の例を使用するには、Amazon Glacier ボールを少なくとも 1 つ作成しておく必要があります。ボールトの作成方法の詳細については、「[Amazon Glacier でボールトを作成する](creating-vaults.md)」を参照してください。

## 例: を使用してパート単位で大きなアーカイブをアップロードする AWS CLI
<a name="Uploading-Archives-mpu-CLI-Implementation"></a>

この例では、ファイルを作成し、マルチパートアップロード API オペレーションを使用してそのファイルをパート単位で Amazon Glacierにアップロードします。
**重要**  
この手順を開始する前に、前提条件となる手順をすべて実行しておくようにしてください。アーカイブをアップロードするには、ボールトを作成して AWS CLI を設定し、Java、C\$1、または Python を使用して SHA256 木構造ハッシュを計算できるように準備しておく必要があります。

次の手順では、`initiate-multipart-upload`、、`upload-multipart-part`および `complete-multipart-upload` AWS CLI コマンドを使用します。

これらのコマンドそれぞれの詳細については、「AWS CLI コマンドリファレンス」の「[https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html)」、「[https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html)」、「[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)」を参照してください。**

1. [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) コマンドを使用して、マルチパートアップロードリソースを作成します。リクエストで、パートサイズをバイト数で指定します。アップロードする各パートは、最後のパートを除き、すべてこのサイズになります。アップロードを開始する際にアーカイブ全体のサイズを把握している必要はありません。ただし、最後の手順でアップロードを完了するときには、各パートの合計サイズ (バイト単位) が必要になります。

   次のコマンドで、`--vault-name` パラメータと `--account-ID` パラメータの値を独自の情報に置き換えます。このコマンドは、ファイルごとに 1 メビバイト (MiB) (1024 x 1024 バイト) のパートサイズのアーカイブをアップロードするよう指定します。必要に応じてこの `--part-size` パラメータ値を置き換えます。

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

   正常な出力:

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

   終了すると、コマンドはマルチパートアップロードリソースのアップロード ID と Amazon Glacier 内の場所を出力します。後の手順で、このアップロード ID を使用します。

1. この例では、次のコマンドを使用して 4.4 MiB のファイルを作成し、1 MiB のチャンクに分割して、各チャンクをアップロードできます。独自のファイルをアップロードするには、データをチャンクに分割し、各パートをアップロードする、同様の手順に従います。

   

**Linux または macOS**  
次のコマンドは、Linux または macOS 上に `file_to_upload` という名前の 4.4 MiB ファイルを作成します。

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

**Server**  
次のコマンドは、Windows 上に `file_to_upload` という名前の 4.4 MiB ファイルを作成します。

   ```
   fsutil file createnew file_to_upload 4608000
   ```

1. 次に、このファイルを 1 MiB のチャンクに分割します。

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

   これで、次の 5 つのチャンクができます。最初の 4 つは 1 MiB で、最後の 1 つは約 400 キビバイト (KiB) です。

   ```
   chunkaa
   chunkab
   chunkac
   chunkad
   chunkae
   ```

1. [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) コマンドを使用して、アーカイブの一部をアップロードします。アーカイブのパートは任意の順序でアップロードできます。パートを並行してアップロードすることもできます。マルチパートアップロードでは、最大 10,000 パートをアップロードできます。

   次のコマンドで、`--vault-name`、`--account-ID`、`--upload-id` のパラメータの値を置き換えます。アップロード ID は、`initiate-multipart-upload` コマンドの出力として指定された ID と一致する必要があります。`--range` パラメータは、サイズが 1 MiB (1024 x 1024 バイト) のパートをアップロードするよう指定します。このサイズは、`initiate-multipart-upload` コマンドで指定したサイズと一致する必要があります。必要に応じてこのサイズ値を調整します。`--body` パラメーターは、アップロードするパーﾄの名前を指定します。

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

   正常にアップロードできると、コマンドはアップロードされたパートのチェックサムを含む出力を生成します。

1. `upload-multipart-part` コマンドをもう一度実行して、マルチパートアップロードの残りのパートをアップロードします。アップロードするパートと一致するように、各コマンドの `--range` パラメータと `–-body` パラメータの値を更新します。

   ```
   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
   ```
**注記**  
アップロードの最後のパートが 1 MiB 未満なので、最後のコマンドの `--range` パラメータ値は小さくなります。正常にアップロードできると、それぞれのコマンドはアップロードされた各パートのチェックサムを含む出力を生成します。

1. 次に、アーカイブを組み立てて、アップロードを終了します。アーカイブの合計サイズと SHA256 木構造ハッシュを含める必要があります。

   アーカイブの SHA256 木構造ハッシュを計算するには、Java、C\$1、または Python を使用できます。この例では、Python を使用します。Java または C\$1 を使用する手順については、「[チェックサムの計算](checksum-calculations.md)」を参照してください。

   Python ファイル `checksum.py` を作成し、次のコードを挿入します。必要に応じて、元のファイルの名前を置き換えます。

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

1. `checksum.py` を実行して SHA256 木構造ハッシュを計算します。次のハッシュは出力と一致しないことがあります。

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

1. [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) コマンドを使用してアーカイブのアップロードを終了します。`--vault-name`、`--account-ID`、`--upload-ID`、`--checksum` のパラメータの値を置き換えます。`--archive` パラメータ値は、アーカイブの合計サイズをバイト単位で指定します。この値には、アップロードした個々のパートのすべてのサイズの合計値を指定する必要があります。必要に応じてこの値を置き換えます。

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

   終了すると、コマンドはアーカイブの ID、チェックサム、Amazon Glacier 内の場所を出力します。

# Amazon SDK for Java を使用してパート単位で大きなアーカイブをアップロードする
<a name="uploading-an-archive-mpu-using-java"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md)Java 版 Amazon SDK for Java で提供されている、大きなアーカイブをアップロードするためのメソッドがあります (「」[Amazon Glacier へのアーカイブのアップロード](uploading-an-archive.md))。

 
+ 高レベル API には、どのサイズのアーカイブのアップロードにも使用できるメソッドが用意されています。このメソッドは、アップロードするファイルに応じて、単一オペレーションでアーカイブをアップロードするか、Amazon Glacier (Amazon Glacier) のマルチパートアップロードのサポートを使用してパート単位でアーカイブをアップロードします。
+ 低レベル API は、基本となる REST 実装にほぼ対応しています。つまり、1 回のオペレーションで小さいアーカイブをアップロードするメソッド、および大きなアーカイブに対してマルチパートアップロードをサポートするメソッドのグループが用意されています。このセクションでは、低レベル API を使用してパート単位で大きなアーカイブをアップロードする方法について説明します。

高レベル API と低レベル API の詳細については、「[Amazon Glacier AWS SDK for Java での の使用](using-aws-sdk-for-java.md)」を参照してください。

**Topics**
+ [

## の高レベル API を使用したパート単位での大規模なアーカイブのアップロード AWS SDK for Java
](#uploading-an-archive-in-parts-highlevel-using-java)
+ [

## の低レベル API を使用して大規模なアーカイブをパート単位でアップロードする AWS SDK for Java
](#uploading-an-archive-mpu-using-java-lowlevel)

## の高レベル API を使用したパート単位での大規模なアーカイブのアップロード AWS SDK for Java
<a name="uploading-an-archive-in-parts-highlevel-using-java"></a>

高レベル API の同じメソッドを使用して、小さいアーカイブまたは大きなアーカイブをアップロードします。高レベル API メソッドでは、アーカイブのサイズに基づいて、アーカイブを 1 回のオペレーションでアップロードするか、Amazon Glacier に用意されているマルチパートアップロード API を使用するかを決定します。詳細については、「[の高レベル API を使用したアーカイブのアップロード AWS SDK for Java](uploading-an-archive-single-op-using-java.md#uploading-an-archive-single-op-high-level-using-java)」を参照してください。

## の低レベル API を使用して大規模なアーカイブをパート単位でアップロードする AWS SDK for Java
<a name="uploading-an-archive-mpu-using-java-lowlevel"></a>

アップロードを細かく制御するために、低レベル API を使用して、リクエストの設定やレスポンスの処理を行うことができます。以下に、 AWS SDK for Javaを使用してパート単位で大きなアーカイブをアップロードする手順を示します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   アーカイブを保存する AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `initiateMultipartUpload` メソッドを呼び出し、マルチパートアップロードを開始します。

   アーカイブのアップロード先となるボールト名、アーカイブのパートをアップロードするために使用するパートサイズ、およびオプションの説明を指定する必要があります。この情報は、`InitiateMultipartUploadRequest` クラスのインスタンスを作成することによって指定します。Amazon Glacier により、レスポンスとしてアップロード ID が返されます。

1. `uploadMultipartPart` メソッドを呼び出し、パートをアップロードします。

   アップロードするパートごとに、ボールト名、このパートでアップロードされる最終的にアセンブルされたアーカイブ内のバイト範囲、パートデータのチェックサム、およびアップロード ID を指定する必要があります。

1. `completeMultipartUpload` メソッドを呼び出し、マルチパートアップロードを完了します。

   アップロード ID、アーカイブ全体のチェックサム、アーカイブのサイズ (アップロードしたすべてのパートを組み合わせたサイズ)、およびボールト名を指定する必要があります。Amazon Glacier は、アップロードされたパートからアーカイブを構築し、アーカイブ ID を返します。

### 例: を使用してパートに大きなアーカイブをアップロードする AWS SDK for Java
<a name="upload-archive-mpu-java-example"></a>

次の Java コード例では、 AWS SDK for Java を使用してアーカイブをボールト () にアップロードします`examplevault`。この例を実行するための詳しい手順については、「[Eclipse を使用した Amazon Glacier の Java 実行例](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java)」を参照してください。ここに示したコードは、アップロードするファイルの名前で更新する必要があります。

 

**注記**  
この例は、1 MB～1 GB のパートサイズに対して有効です。ただし、Amazon Glacier では 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();
    }
}
```

# を使用した大きなアーカイブのアップロード AWS SDK for .NET
<a name="uploading-an-archive-mpu-using-dotnet"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md).NET 用の Amazon SDK で提供されているには、大きなアーカイブを部分的にアップロードするためのメソッドがあります (「」[Amazon Glacier へのアーカイブのアップロード](uploading-an-archive.md))。

 
+ 高レベル API には、どのサイズのアーカイブのアップロードにも使用できるメソッドが用意されています。このメソッドは、アップロードするファイルに応じて、単一オペレーションでアーカイブをアップロードするか、Amazon Glacier (Amazon Glacier) のマルチパートアップロードのサポートを使用してパート単位でアーカイブをアップロードします。
+ 低レベル API は、基本となる REST 実装にほぼ対応しています。つまり、1 回のオペレーションで小さいアーカイブをアップロードするメソッド、および大きなアーカイブに対してマルチパートアップロードをサポートするメソッドのグループが用意されています。このセクションでは、低レベル API を使用してパート単位で大きなアーカイブをアップロードする方法について説明します。

高レベル API と低レベル API の詳細については、「[Amazon Glacier でのAWS SDK for .NET の使用](using-aws-sdk-for-dot-net.md)」を参照してください。

**Topics**
+ [

## の高レベル API を使用したパート単位での大規模なアーカイブのアップロード AWS SDK for .NET
](#uploading-an-archive-in-parts-highlevel-using-dotnet)
+ [

## の低レベル API を使用したパート単位での大きなアーカイブのアップロード AWS SDK for .NET
](#uploading-an-archive-in-parts-lowlevel-using-dotnet)

## の高レベル API を使用したパート単位での大規模なアーカイブのアップロード AWS SDK for .NET
<a name="uploading-an-archive-in-parts-highlevel-using-dotnet"></a>

高レベル API の同じメソッドを使用して、小さいアーカイブまたは大きなアーカイブをアップロードします。高レベル API メソッドでは、アーカイブのサイズに基づいて、アーカイブを 1 回のオペレーションでアップロードするか、Amazon Glacier に用意されているマルチパートアップロード API を使用するかを決定します。詳細については、「[の高レベル API を使用したアーカイブのアップロード AWS SDK for .NET](uploading-an-archive-single-op-using-dotnet.md#uploading-an-archive-single-op-highlevel-using-dotnet)」を参照してください。

## の低レベル API を使用したパート単位での大きなアーカイブのアップロード AWS SDK for .NET
<a name="uploading-an-archive-in-parts-lowlevel-using-dotnet"></a>

アップロードを細かくコントロールするために、低レベル API を使用して、リクエストの設定やレスポンスの処理を行うことができます。以下に、 AWS SDK for .NETを使用してパート単位で大きなアーカイブをアップロードする手順を示します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   アーカイブを保存する AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `InitiateMultipartUpload` メソッドを呼び出し、マルチパートアップロードを開始します。

   アーカイブのアップロード先となるボールト名、アーカイブのパートをアップロードするために使用するパートサイズ、およびオプションの説明を指定する必要があります。この情報は、`InitiateMultipartUploadRequest` クラスのインスタンスを作成することによって指定します。Amazon Glacier により、レスポンスとしてアップロード ID が返されます。

1. `UploadMultipartPart` メソッドを呼び出し、パートをアップロードします。

   アップロードするパートごとに、ボールト名、このパートでアップロードされる最終的にアセンブルされたアーカイブ内のバイト範囲、パートデータのチェックサム、およびアップロード ID を指定する必要があります。

1. `CompleteMultipartUpload` メソッドを呼び出し、マルチパートアップロードを完了します。

   アップロード ID、アーカイブ全体のチェックサム、アーカイブのサイズ (アップロードしたすべてのパートを組み合わせたサイズ)、およびボールト名を指定する必要があります。Amazon Glacier は、アップロードされたパートからアーカイブを構築し、アーカイブ ID を返します。

### 例: .Amazon SDK for .NET を使用してパート単位で大きなアーカイブをアップロードする
<a name="upload-archive-mpu-dotnet-example"></a>

次の C\$1 コード例では AWS SDK for .NET 、 を使用してアーカイブをボールト () にアップロードします`examplevault`。この例を実行するための詳しい手順については、「[コード例の実行](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)」を参照してください。ここに示したコードは、アップロードするファイルの名前で更新する必要があります。

**Example**  

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

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

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

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

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

      InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest);

      return initiateMPUresponse.UploadId;
    }

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

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

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

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

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

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

# REST API を使用してパート単位で大きなアーカイブをアップロードする
<a name="uploading-an-archive-mpu-using-rest"></a>

「[パート単位での大きなアーカイブのアップロード (マルチパートアップロード)](uploading-archive-mpu.md)」で説明しているように、マルチパートアップロードとは、アーカイブをパート単位でアップロードし、関連オペレーションを実行できる一連のオペレーションを指しています。これらのオペレーションの詳細については、次の API リファレンスのトピックを参照してください。

 
+ [マルチパートアップロードの開始 (POST multipart-uploads)](api-multipart-initiate-upload.md)
+ [パートのアップロード (PUT uploadID)](api-upload-part.md)
+ [マルチパートアップロードの完了 (POST uploadID)](api-multipart-complete-upload.md)
+ [マルチパートアップロードの中止 (DELETE uploadID)](api-multipart-abort-upload.md)
+ [パートのリスト (GET uploadID)](api-multipart-list-parts.md)
+ [マルチパートアップロードのリスト (GET multipart-uploads)](api-multipart-list-uploads.md)

# Amazon Glacier でのアーカイブのダウンロード
<a name="downloading-an-archive"></a>

Amazon Glacier が備えている管理コンソールを使用して、ボールトの作成と削除を実行できます。ただし、管理コンソールを使用して Amazon Glacier からアーカイブをダウンロードすることはできません。写真、動画、その他のドキュメントなどのデータをダウンロードするには、REST API を直接使用するか、 AWS SDKs を使用して、 AWS Command Line Interface (AWS CLI) を使用するか、コードを記述してリクエストを行う必要があります。

で Amazon Glacier を使用する方法については AWS CLI、[AWS CLI Amazon Glacier のリファレンス](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)」を参照してください。をインストールするには AWS CLI、「」を参照してください[AWS Command Line Interface](https://aws.amazon.com/cli/)。以下のトピックでは、 AWS SDK for Java、、 AWS SDK for .NETおよび Amazon Glacier REST API を使用して Amazon Glacier にアーカイブをダウンロードする方法について説明します。

**Topics**
+ [

# Amazon Glacier アーカイブの取得
](downloading-an-archive-two-steps.md)
+ [

# を使用した Amazon Glacier でのアーカイブのダウンロード AWS SDK for Java
](downloading-an-archive-using-java.md)
+ [

# を使用した Amazon Glacier でのアーカイブのダウンロード AWS SDK for .NET
](downloading-an-archive-using-dotnet.md)
+ [

# Python での並列処理を使用した大きなアーカイブのダウンロード
](downloading-large-archive-parallel-python.md)
+ [

# REST API を使用したアーカイブのダウンロード
](downloading-an-archive-using-rest.md)
+ [

# を使用した Amazon Glacier でのアーカイブのダウンロード AWS CLI
](downloading-an-archive-using-cli.md)

# Amazon Glacier アーカイブの取得
<a name="downloading-an-archive-two-steps"></a>

Amazon Glacier からアーカイブから取り出すのは非同期オペレーションであり、最初にジョブを開始し、次にジョブが完了した後で出力をダウンロードします。アーカイブの取得ジョブを開始するには、、、または AWS SDKs [ジョブの開始 (ジョブの POST)](api-initiate-job-post.md) で REST API オペレーション AWS CLIまたは同等の を使用します。

**Topics**
+ [

## アーカイブの取り出しオプション
](#api-downloading-an-archive-two-steps-retrieval-options)
+ [

## アーカイブの取得範囲
](#downloading-an-archive-range)

Amazon Glacier からアーカイブを取り出すプロセスは、2 つのステップに分かれます。次はプロセスの概要です。

**アーカイブを取り出すには**

1. アーカイブの取得ジョブを開始します。

   1. 取得するアーカイブの ID を入手します。アーカイブ ID は、ボールトのインベントリから取得できます。アーカイブ ID は、REST API、 AWS CLI、または AWS SDKs を使用して取得できます。詳細については、「[Amazon Glacier でボールトインベントリをダウンロードする](vault-inventory.md)」を参照してください。

   1. [ジョブの開始 (ジョブの POST)](api-initiate-job-post.md) オペレーションを使用して、アーカイブの全体または一部を後にダウンロードするための準備を Amazon Glacier にリクエストするジョブを開始します。

   ジョブを開始すると、Amazon Glacier ではレスポンスでジョブ ID を返し、ジョブを非同期的に実行します (ステップ 2 で説明したように、ジョブが完了するまではジョブの出力をダウンロードできません)。
**重要**  
標準取り出しの場合のみ、データ取り出しポリシーにより、`PolicyEnforcedException` 例外が発生して、`Initiate Job` リクエストが失敗することがあります。データ取り出しポリシーの詳細については、「[Amazon Glacier のデータ取り出しポリシー](data-retrieval-policy.md)」を参照してください。`PolicyEnforcedException` 例外の詳細については、「[エラーレスポンス](api-error-responses.md)」を参照してください。

   必要に応じて、Amazon Glacier に保存されたデータの大きなセグメントを復元できます。Amazon Glacier ストレージクラスからデータを復元する方法の詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[オブジェクトのアーカイブに適したストレージクラス]( https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier)」を参照してください。

1. ジョブが完了したら、[ジョブの出力の取得 (GET output)](api-job-output-get.md) オペレーションを使用してバイトをダウンロードします。

   全バイトをダウンロードすることも、バイト範囲を指定してジョブの出力の一部だけをダウンロードすることもできます。出力が大きい場合には、出力をチャンクに分けてダウンロードすると、ネットワーク障害など、ダウンロードに関する障害が発生したときに便利です。1 回のリクエストでジョブの出力を取得する場合に、ネットワーク障害が発生すると、最初から出力のダウンロードをやり直さなければならなくなります。これに対して、出力をチャンクに分けてダウンロードしていれば、障害が発生した場合でも、全体ではなく、出力の一部のダウンロードをやり直せば済みます。

Amazon Glacier では、出力を取得する前にジョブを完了している必要があります。ジョブは、完了から少なくとも 24 時間は有効です。つまり、ジョブが完了してから 24 時間は出力をダウンロードできます。復元の有効期限は、ジョブの完了から 24 時間 です。ジョブが完了しているかどうかを判断するには、以下のオプションの 1 つを使用してジョブのステータスを確認します。
+ **ジョブの完了通知を待つ** – ジョブの完了後に Amazon Glacier が通知を投稿する Amazon Simple Notification Service (Amazon SNS) トピックを指定できます。Amazon Glacier は、ジョブの完了後にのみ通知を送信します。

  ジョブを開始する際に、Amazon SNS トピックを指定できます。ジョブのリクエストで指定された Amazon SNS トピックのほか、ボールトにアーカイブの取り出しイベントに関する通知の設定がある場合には、Amazon Glacier からその SNS トピックにも通知が発行されます。詳細については、「[Amazon Glacier でボールト通知を設定する](configuring-notifications.md)」を参照してください。
+ **明示的にジョブ情報をリクエストする** - Amazon Glacier `Describe Job` API オペレーション ([ジョブの説明 (GET JobID)](api-describe-job-get.md)) を使用して、ジョブの情報を定期的にポーリングすることもできます。ただし、Amazon SNS 通知を使用することをお勧めします。

**注記**  
Amazon SNS 通知を使用して取得する情報は、`Describe Job` API オペレーションを呼び出して取得する情報と同じです。

## アーカイブの取り出しオプション
<a name="api-downloading-an-archive-two-steps-retrieval-options"></a>

アーカイブの取り出しジョブを開始するときは、アクセス時間とコスト要件に基づいて、以下のいずれかの取り出しオプションを指定できます。取り出し料金については、「[Amazon Glacier の料金](https://aws.amazon.com/s3/glacier/pricing/)」を参照してください。
+ **迅速** – 迅速取り出しを使用すると、アーカイブの復元に関する緊急のリクエストが臨時で必要になったときに、S3 Glacier Flexible Retrieval ストレージクラスまたは S3 Intelligent-Tiering Archive アクセス階層に保存されているデータにすばやくアクセスできます。最大規模のアーカイブ (250 MB 超) を除くすべてのアーカイブについては、迅速取り出しを使用してアクセスしたデータは通常 1〜5 分以内で使用可能になります。プロビジョンドキャパシティーは、迅速取り出しの取得容量を必要なときに利用できることを保証します。詳細については、「[プロビジョンドキャパシティー](#api-downloading-an-archive-two-steps-retrieval-expedited-capacity)」を参照してください。
+ **標準** - 標準取り出しでは、数時間以内にすべてのアーカイブにアクセスできます。通常、標準取り出しは 3〜5 時間で完了します。標準は、取り出しオプションを指定しないで取り出しリクエストを行った場合にデフォルトで適用されます。
+ **大容量** - 大容量取り出しは、Amazon Glacier の最も安価な取り出しオプションであり、これを使用して大量のデータ (ペタバイトのデータを含む) を 1 日以内に低コストで取得できます。通常、大容量取り出しは 5〜12 時間で完了します。

次の表は、アーカイブの取り出しオプションをまとめたものです。料金については、「[Amazon Glacier の料金](https://aws.amazon.com/s3/glacier/pricing/)」を参照してください。


| サービス | 迅速 | Standard | 大容量 | 
| --- | --- | --- | --- | 
|  Amazon Glacier  |  1～5 分  |  3～5 時間  |  5～12 時間  | 

`Expedited`、、`Standard`または `Bulk`の取得を行うには、REST API [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html) オペレーション`Tier`リクエストのリクエスト要素を必要なオプション、または AWS Command Line Interface (AWS CLI) または AWS SDKs の同等の に設定します。プロビジョンドキャパシティーを購入すると、すべての Expedited 取り出しはプロビジョンドキャパシティーを通じて自動的に提供されます。

### プロビジョンドキャパシティー
<a name="api-downloading-an-archive-two-steps-retrieval-expedited-capacity"></a>

プロビジョニングされたキャパシティーは、迅速取り出しの取得容量を必要なときに利用できることを保証します。容量の各単位について 5 分ごとに 3 回以上の迅速取り出しを提供し、1 秒あたり最大 150 メガバイト (MBps) の取り出しスループットを提供します。

ワークロードからデータのサブセットにアクセスする際に非常に高い信頼性と予測可能性が求められる場合は、プロビジョニングされた取得容量を購入することをお勧めします。プロビジョンドキャパシティーがなくても、需要が異常に高い例外的な場合を除いては、通常は迅速取り出しが受け入れられます。ただし、環境を問わず、どのような場合でも迅速取り出しにアクセスするには、プロビジョニングされた取得容量を購入してください。

#### プロビジョニングされた容量の購入
<a name="downloading-an-archive-purchase-provisioned-capacity"></a>

プロビジョニングされたキャパシティユニットは、Amazon Glacier コンソール、REST API [プロビジョニングされた容量の購入 (POST provisioned-capacity)](api-PurchaseProvisionedCapacity.md) オペレーション、 AWS SDKs、または を使用して購入できます AWS CLI。プロビジョニングされた容量の料金情報については、「[Amazon Glacier の料金](https://aws.amazon.com/s3/glacier/pricing/)」を参照してください。

プロビジョニングされた容量単位は、購入日時から 1 か月間有効です。

開始日が 31 日の場合、有効期限は翌月の最終日となります。たとえば、開始日が 8 月 31 日の場合、有効期限は 9 月 30 日です。開始日が 1 月 31 日の場合、有効期限は 2 月 28 日です。

**Amazon Glacier コンソールを使用してプロビジョニングされたキャパシティーを購入する方法**

1.  にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/glacier/home](https://console.aws.amazon.com/glacier/home) で Amazon Glacier コンソールを開きます。

1. 左側のナビゲーションペインで、**[データ取り出し設定]** を選択します。

1. **[プロビジョニングされたキャパシティユニット (PCU)]** で **[PCU の購入]** を選択します。**[PCU の購入]** ダイアログボックスが表示されます。

1. プロビジョニングされたキャパシティーを購入する場合は、**[購入を確認するには]** ボックスに **confirm** と入力します。

1.  **[PCU の購入]** を選択します。

## アーカイブの取得範囲
<a name="downloading-an-archive-range"></a>

Amazon Glacier からアーカイブを取得する場合は、取得するアーカイブの範囲 (部分) をオプションで指定することもできます。デフォルトでは、アーカイブ全体が取得されます。バイト範囲を指定すると、以下のことを行う場合に便利です。
+ **データのダウンロードの管理** - Amazon Glacier では、取り出しリクエストが完了してから 24 時間、取得したデータをダウンロードできます。このため、アーカイブの一部だけを取得することによって、特定のダウンロード期間内のダウンロードのスケジュールを管理できます。
+ **サイズの大きなアーカイブの特定の一部のみ取得** - たとえば、以前に多くのファイルをまとめ、1 つのアーカイブとしてアップロードしたものの、その後、ファイルの一部のみを取得する必要が生じたとします。このような場合には、取得リクエストを 1 回使用して、必要なファイルが含まれるアーカイブから一定の範囲を指定できます。このほか、取得リクエストを複数回、1 回ごとに 1 つまたは複数のファイルから成る範囲を指定して送信する方法もあります。

範囲取得を使用して取得ジョブを開始した場合には、メガバイト単位に調整した範囲を指定する必要があります。つまり、バイト範囲の始点はゼロ (アーカイブの先頭) またはその後 1 MB 間隔 (1 MB、2 MB、3 MB など) の点を指定することができます。

レンジの終わりの値には、アーカイブの末尾、またはレンジの開始値より大きな任意の 1 MB 間隔の数値のいずれかを指定できます。このほか、(取得ジョブが完了した後で) データをダウンロードする際にチェックサムの値を取得する場合には、ジョブの開始時にリクエストする範囲が木構造ハッシュ可能になっている必要があります。チェックサムを使用すると、データが送信中に破損しなかったかどうか確認できます。メガバイト単位への調整と木構造ハッシュを可能にするための調整については、「[データをダウンロードするときのチェックサムの受信](checksum-calculations-range.md)」を参照してください。

# を使用した Amazon Glacier でのアーカイブのダウンロード AWS SDK for Java
<a name="downloading-an-archive-using-java"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md)Amazon SDK for Java で提供されているアーカイブをダウンロードする方法を提供します。

**Topics**
+ [

## の高レベル API を使用したアーカイブのダウンロード AWS SDK for Java
](#downloading-an-archive-using-java-highlevel-api)
+ [

## の低レベル API を使用したアーカイブのダウンロード AWS SDK for Java
](#downloading-an-archive-using-java-lowlevel-api)

## の高レベル API を使用したアーカイブのダウンロード AWS SDK for Java
<a name="downloading-an-archive-using-java-highlevel-api"></a>

高レベル API の `ArchiveTransferManager` クラスには、アーカイブのダウンロードに使用できる `download` メソッドが用意されています。

**重要**  
-`ArchiveTransferManager`クラスは、Amazon Simple Notification Service (Amazon SNS) トピックと、そのトピックにサブスクライブされている Amazon Simple Queue Service (Amazon SQS) キューを作成します。その後、アーカイブの取り出しジョブを開始し、使用可能にするアーカイブを探してキューをポーリングします。アーカイブが使用可能になると、ダウンロードが開始されます。取得時間に関する詳細については、「[アーカイブの取り出しオプション](downloading-an-archive-two-steps.md#api-downloading-an-archive-two-steps-retrieval-options)」を参照してください。

### 例: の高レベル API を使用したアーカイブのダウンロード AWS SDK for Java
<a name="download-archives-java-highlevel-example"></a>

次の Java コード例では、米国西部（オレゴン リージョン (`us-west-2`) のボールト (`examplevault`) からアーカイブをダウンロードします。

このサンプルを実行するための詳しい手順については、「[Eclipse を使用した Amazon Glacier の Java 実行例](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java)」を参照してください。ここに示したコードは、既存のアーカイブ ID とダウンロードしたアーカイブを保存するローカルファイルパスで更新する必要があります。

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

## の低レベル API を使用したアーカイブのダウンロード AWS SDK for Java
<a name="downloading-an-archive-using-java-lowlevel-api"></a>

以下に、 AWS SDK for Java の低レベル API を使用してボールトインベントリを取得する手順を示します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   アーカイブをダウンロードする AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `archive-retrieval` メソッドを実行して、`initiateJob` ジョブを開始します。

   `InitiateJobRequest` クラスのインスタンスを作成することにより、ダウンロードするアーカイブのアーカイブ ID や、Amazon Glacier (Amazon Glacier) でジョブの完了メッセージを投稿する Amazon SNS トピック (オプション) などのジョブ情報を入力します。Amazon Glacier は、レスポンスとしてジョブ ID を返します。レスポンスは、`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();
   ```

   オプションで、バイト範囲を指定して、アーカイブの一部のみを準備するよう Amazon Glacier にリクエストすることができます。たとえば、次のステートメントを追加すると、前のリクエストが更新され、アーカイブの 1 MB から 2 MB の部分のみを準備するよう Amazon Glacier にリクエストできます。

    

   ```
   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.  ジョブが完了するまで待ちます。

   ジョブの出力をダウンロードする準備が整うまで待つ必要があります。ボールトの通知設定により Amazon Simple Notification Service (Amazon SNS) トピックを指定している場合、またはジョブを開始したときに Amazon SNS トピックを指定している場合は、ジョブの完了後に Amazon Glacier によりそのトピックにメッセージが送信されます。

   また、`describeJob` メソッドを呼び出して Amazon Glacier にポーリングすることで、ジョブの完了ステータスを調べることもできます。ただし、通知のために Amazon SNS トピックを使用することをお勧めします。

1. `getJobOutput` メソッドを実行して、ジョブの出力 (アーカイブデータ) をダウンロードします。

   `GetJobOutputRequest` クラスのインスタンスを作成することにより、ジョブ ID やボールト名などのリクエスト情報を指定します。Amazon Glacier により返される出力は `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.
   ```

   前述のコードスニペットは、ジョブの出力全体をダウンロードします。このほか、`GetJobOutputRequest` でバイト範囲を指定することにより、出力の一部のみを取得したり、出力全体を小さなチャンクに分けてダウンロードしたりできます。

    

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

   `GetJobOutput` 呼び出しに対するレスポンスとして、Amazon Glacier では、特定の条件が満たされた場合に、ダウンロードしたデータの一部のチェックサムを返します。詳細については、「[データをダウンロードするときのチェックサムの受信](checksum-calculations-range.md)」を参照してください。

   ダウンロードにエラーがないことを確認するために、クライアント側でチェックサムを計算し、Amazon Glacier からレスポンスとして送信されたチェックサムと比較できます。

   オプションの範囲が指定されたアーカイブの取得ジョブの場合は、ジョブの説明を取得すると、取得する範囲のチェックサム（SHA256TreeHash）が含まれます。この値を使用して、後でダウンロードするバイト範囲全体の正確性を詳しく確認できます。たとえば、木構造ハッシュ可能なアーカイブ範囲を取得するジョブを開始してから、出力を複数のチャンクに分けてダウンロードし、`GetJobOutput` リクエストでそれぞれチェックサムが返されるようにした場合は、クライアント側でダウンロードした各部分のチェックサムを計算してから木構造ハッシュを計算することができます。この計算結果を、Amazon Glacier でジョブの説明リクエストに対して返されたレスポンスのチェックサムと比較して、ダウンロードしたバイト範囲全体が Amazon Glacier に格納されているバイト範囲と同じであることを確認できます。

    実例については、「[例 2: の低レベル API を使用してアーカイブを取得する AWS SDK for Java— 出力をチャンクでダウンロードする](#downloading-an-archive-with-range-using-java-example)」を参照してください。

### 例 1: の低レベル API を使用してアーカイブを取得する AWS SDK for Java
<a name="downloading-an-archive-using-java-example"></a>

次の Java コード例では、指定したボールトからアーカイブをダウンロードします。この例では、ジョブが完了した後で、単一の `getJobOutput` 呼び出しで出力全体をダウンロードします。出力をチャンクに分けてダウンロードする例については、「[例 2: の低レベル API を使用してアーカイブを取得する AWS SDK for Java— 出力をチャンクでダウンロードする](#downloading-an-archive-with-range-using-java-example)」を参照してください。

この例では次のタスクを実行しています。

 
+ Amazon Simple Notification Service (Amazon SNS) のトピックの作成

  Amazon Glacier は、ジョブの完了後、このトピックに通知を送信します。
+ Amazon Simple Queue Service (Amazon SQS) キューの作成

  この例では、ポリシーをキューにアタッチして、Amazon SNS トピックでメッセージをキューに投稿できるようにします。
+ 指定したアーカイブをダウンロードするジョブを開始します。

  ジョブのリクエストでは、ジョブの完了後に Amazon Glacier がトピックへの通知を発行できるように、作成した Amazon SNS トピックを指定しています。
+ Amazon SQS キューにジョブ ID を含むメッセージがあるかどうかを定期的に確認します。

  メッセージがある場合は、JSON を解析し、ジョブが正常に完了したかどうかを確認します。正常に完了している場合は、アーカイブをダウンロードします。
+ Amazon SNS トピックおよび作成された Amazon SQS キューを削除して、クリーンアップします。

 

```
import java.io.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));
    }
}
```

### 例 2: の低レベル API を使用してアーカイブを取得する AWS SDK for Java— 出力をチャンクでダウンロードする
<a name="downloading-an-archive-with-range-using-java-example"></a>

次の Java コード例では、Amazon Glacier からアーカイブを取得します。このコード例では、`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));
    }
}
```

# を使用した Amazon Glacier でのアーカイブのダウンロード AWS SDK for .NET
<a name="downloading-an-archive-using-dotnet"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md).NET 用の Amazon SDK で提供されており、アーカイブをダウンロードする方法を提供します。

**Topics**
+ [

## の高レベル API を使用したアーカイブのダウンロード AWS SDK for .NET
](#downloading-an-archive-using-dotnet-highlevel-api)
+ [

## の低レベル API を使用したアーカイブのダウンロード AWS SDK for .NET
](#downloading-an-archive-using-dotnet-lowlevel-api)

## の高レベル API を使用したアーカイブのダウンロード AWS SDK for .NET
<a name="downloading-an-archive-using-dotnet-highlevel-api"></a>

高レベル API の `ArchiveTransferManager` クラスには、アーカイブのダウンロードに使用できる `Download` メソッドが用意されています。

**重要**  
-`ArchiveTransferManager`クラスは、Amazon Simple Notification Service (Amazon SNS) トピックと、そのトピックにサブスクライブされている Amazon Simple Queue Service (Amazon SQS) キューを作成します。その後、アーカイブの取り出しジョブを開始し、使用可能にするアーカイブを探してキューをポーリングします。アーカイブが使用可能になると、ダウンロードが開始されます。取得時間に関する詳細については、「[アーカイブの取り出しオプション](downloading-an-archive-two-steps.md#api-downloading-an-archive-two-steps-retrieval-options)」を参照してください。

### 例: の高レベル API を使用したアーカイブのダウンロード AWS SDK for .NET
<a name="download-archives-dotnet-highlevel-example"></a>

次の C\$1 コード例では、米国西部（オレゴン リージョン (`examplevault`) のボールト からアーカイブをダウンロードします。

この例を実行するための詳しい手順については、「[コード例の実行](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)」を参照してください。ここに示したコードは、既存のアーカイブ ID とダウンロードしたアーカイブを保存するローカルファイルパスで更新する必要があります。

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

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

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

        var options = new DownloadOptions();
        options.StreamTransferProgress += ArchiveDownloadHighLevel.progress;
        // Download an archive.
        Console.WriteLine("Intiating the archive retrieval job and then polling SQS queue for the archive to be available.");
        Console.WriteLine("Once the archive is available, downloading will begin.");
        manager.Download(vaultName, archiveId, downloadFilePath, options);
        Console.WriteLine("To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }

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

## の低レベル API を使用したアーカイブのダウンロード AWS SDK for .NET
<a name="downloading-an-archive-using-dotnet-lowlevel-api"></a>

以下に、 AWS SDK for .NETの低レベル API を使用して、Amazon Glacier (Amazon Glacier) アーカイブをダウンロードするためのステップを示します。

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   アーカイブをダウンロードする AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `archive-retrieval` メソッドを実行して、`InitiateJob` ジョブを開始します。

   `InitiateJobRequest` クラスのインスタンスを作成することにより、ダウンロードするアーカイブのアーカイブ ID や、Amazon Glacier がジョブの完了メッセージを投稿する Amazon SNS トピック (オプション) などのジョブ情報を入力します。 は、レスポンスとしてジョブ ID を返します。Amazon Glacier は、レスポンスとしてジョブ ID を返します。レスポンスは、`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;
   ```

   必要に応じて、以下のリクエストに示すように、バイト範囲を指定して、アーカイブの一部のみを準備するよう Amazon Glacier にリクエストすることもできます。リクエストでは Amazon Glacier に対し、アーカイブの 1 MB から 2 MB までの部分のみを準備するように指定しています。

   ```
   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.  ジョブが完了するまで待ちます。

   ジョブの出力をダウンロードする準備が整うまで待つ必要があります。ボールトの通知設定により Amazon Simple Notification Service (Amazon SNS) トピックを指定している場合、またはジョブを開始したときに Amazon SNS トピックを指定している場合は、ジョブの完了後に Amazon Glacier によりそのトピックにメッセージが送信されます。以下のセクションに示しているコード例では、Amazon SNS を使用して、Amazon Glacier でメッセージを発行します。

   また、`DescribeJob` メソッドを呼び出して Amazon Glacier にポーリングすることで、ジョブの完了ステータスを調べることもできます。ただし、通知のために Amazon SNS トピックを使用することをお勧めします。

1. `GetJobOutput` メソッドを実行して、ジョブの出力 (アーカイブデータ) をダウンロードします。

   `GetJobOutputRequest` クラスのインスタンスを作成することにより、ジョブ ID やボールト名などのリクエスト情報を指定します。Amazon Glacier により返される出力は `GetJobOutputResponse` オブジェクトで使用できます。

   ```
   GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
   {
     JobId = jobId,
     VaultName = vaultName
   };
   
   GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest);
   using (Stream webStream = getJobOutputResponse.Body)
   {
     using (Stream fileToSave = File.OpenWrite(fileName))
     {
        CopyStream(webStream, fileToSave);
     }
   }
   ```

   前述のコードスニペットは、ジョブの出力全体をダウンロードします。このほか、`GetJobOutputRequest` でバイト範囲を指定することにより、出力の一部のみを取得したり、出力全体を小さなチャンクに分けてダウンロードしたりできます。

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

   `GetJobOutput` 呼び出しに対するレスポンスとして、Amazon Glacier では、特定の条件が満たされた場合に、ダウンロードしたデータの一部のチェックサムを返します。詳細については、「[データをダウンロードするときのチェックサムの受信](checksum-calculations-range.md)」を参照してください。

   ダウンロードにエラーがないことを確認するために、クライアント側でチェックサムを計算し、Amazon Glacier からレスポンスとして送信されたチェックサムと比較できます。

   オプションの範囲が指定されたアーカイブの取得ジョブの場合は、ジョブの説明を取得したときに取得する範囲のチェックサムが含まれます（SHA256TreeHash）。この値によって、後でダウンロードするバイト範囲全体の正確性を詳しく確認できます。たとえば、木構造ハッシュ可能なアーカイブ範囲を取得するジョブを開始してから、出力を複数のチャンクに分けてダウンロードし、`GetJobOutput` リクエストでそれぞれチェックサムが返されるようにした場合は、クライアント側でダウンロードした各部分のチェックサムを計算してから木構造ハッシュを計算することができます。この計算結果を、Amazon Glacier でジョブの説明リクエストに対して返されたレスポンスのチェックサムと比較して、ダウンロードしたバイト範囲全体が Amazon Glacier に格納されているバイト範囲と同じであることを確認できます。

   

   実例については、「[例 2: の低レベル API を使用してアーカイブを取得する AWS SDK for .NET— 出力をチャンクでダウンロードする](#creating-vaults-sdk-dotnet-example2)」を参照してください。

### 例 1: の低レベル API を使用してアーカイブを取得する AWS SDK for .NET
<a name="creating-vaults-sdk-dotnet-example-retrieve"></a>

次の C\$1 コード例は、指定したボールトからアーカイブをダウンロードします。この例では、ジョブが完了した後で、単一の `GetJobOutput` 呼び出しで出力全体をダウンロードします。出力をチャンクに分けてダウンロードする例については、「[例 2: の低レベル API を使用してアーカイブを取得する AWS SDK for .NET— 出力をチャンクでダウンロードする](#creating-vaults-sdk-dotnet-example2)」を参照してください。

この例では次のタスクを実行しています。
+ Amazon Simple Notification Service (Amazon SNS) のトピックを設定する 

  Amazon Glacier は、ジョブの完了後、このトピックに通知を送信します。
+ Amazon Simple Queue Service (Amazon SQS) キューを設定する 

  この例では、ポリシーをキューにアタッチして、Amazon SNS トピックでメッセージを投稿できるようにします。
+ 指定したアーカイブをダウンロードするジョブを開始します。

  この例では、ジョブのリクエストとして、Amazon Glacier によりジョブの完了後にメッセージが送信されるように Amazon SNS トピックを指定します。
+ Amazon SQS キューにメッセージがあるかどうかを定期的に確認します。

  メッセージがある場合は、JSON を解析し、ジョブが正常に完了したかどうかを確認します。正常に完了している場合は、アーカイブをダウンロードします。コード例では、JSON.NET ライブラリ ([JSON.NET](http://json.codeplex.com/) 参照) を使用して JSON を解析しています。
+ Amazon SNS トピックおよび作成された Amazon SQS キューを削除して、クリーンアップします。

```
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Runtime;
using Amazon.SimpleNotificationService;
using Amazon.SimpleNotificationService.Model;
using Amazon.SQS;
using Amazon.SQS.Model;
using Newtonsoft.Json;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveDownloadLowLevelUsingSNSSQS
  {
    static string topicArn;
    static string queueUrl;
    static string queueArn;
    static string vaultName = "*** Provide vault name ***";
    static string archiveID = "*** Provide archive ID ***";
    static string fileName  = "*** Provide the file name and path to where to store downloaded archive ***";
    static AmazonSimpleNotificationServiceClient snsClient;
    static AmazonSQSClient sqsClient;
    const string SQS_POLICY =
        "{" +
        "    \"Version\" : \"2012-10-17\",&TCX5-2025-waiver;" +
        "    \"Statement\" : [" +
        "        {" +
        "            \"Sid\" : \"sns-rule\"," +
        "            \"Effect\" : \"Allow\"," +
        "            \"Principal\" : {\"Service\" : \"sns.amazonaws.com\" }," +
        "            \"Action\"    : \"sqs:SendMessage\"," +
        "            \"Resource\"  : \"{QueueArn}\"," +
        "            \"Condition\" : {" +
        "                \"ArnLike\" : {" +
        "                    \"aws:SourceArn\" : \"{TopicArn}\"" +
        "                }" +
        "            }" +
        "        }" +
        "    ]" +
        "}";

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;
      try
      {
        using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2))
        {
          Console.WriteLine("Setup SNS topic and SQS queue."); 
          SetupTopicAndQueue();
          Console.WriteLine("To continue, press Enter"); Console.ReadKey();
          Console.WriteLine("Retrieving...");
          RetrieveArchive(client);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      finally
      {
        // Delete SNS topic and SQS queue.
        snsClient.DeleteTopic(new DeleteTopicRequest() { TopicArn = topicArn });
        sqsClient.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queueUrl });
      }
    }

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

      long ticks = DateTime.Now.Ticks;
      topicArn = snsClient.CreateTopic(new CreateTopicRequest { Name = "GlacierDownload-" + ticks }).TopicArn;
      Console.Write("topicArn: "); Console.WriteLine(topicArn);

      CreateQueueRequest createQueueRequest = new CreateQueueRequest();
      createQueueRequest.QueueName = "GlacierDownload-" + ticks;
      CreateQueueResponse createQueueResponse = sqsClient.CreateQueue(createQueueRequest);
      queueUrl = createQueueResponse.QueueUrl;
      Console.Write("QueueURL: "); Console.WriteLine(queueUrl);

      GetQueueAttributesRequest getQueueAttributesRequest = new GetQueueAttributesRequest();
      getQueueAttributesRequest.AttributeNames = new List<string> { "QueueArn" };
      getQueueAttributesRequest.QueueUrl = queueUrl;
      GetQueueAttributesResponse response = sqsClient.GetQueueAttributes(getQueueAttributesRequest);
      queueArn = response.QueueARN;
      Console.Write("QueueArn: "); Console.WriteLine(queueArn);

      // Setup the Amazon SNS topic to publish to the SQS queue.
      snsClient.Subscribe(new SubscribeRequest()
      {
        Protocol = "sqs",
        Endpoint = queueArn,
        TopicArn = topicArn
      });

      // Add policy to the queue so SNS can send messages to the queue.
      var policy = SQS_POLICY.Replace("{TopicArn}", topicArn).Replace("{QueueArn}", queueArn);

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

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

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

    private static void ProcessQueue(string jobId, AmazonGlacierClient client)
    {
      ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest() { QueueUrl = queueUrl, MaxNumberOfMessages = 1 }; 
      bool jobDone = false;
      while (!jobDone)
      {
        Console.WriteLine("Poll SQS queue");
        ReceiveMessageResponse receiveMessageResponse = sqsClient.ReceiveMessage(receiveMessageRequest); 
        if (receiveMessageResponse.Messages.Count == 0)
        {
          Thread.Sleep(10000 * 60);
          continue;
        }
        Console.WriteLine("Got message");
        Message message = receiveMessageResponse.Messages[0];
        Dictionary<string, string> outerLayer = JsonConvert.DeserializeObject<Dictionary<string, string>>(message.Body);
        Dictionary<string, object> fields = JsonConvert.DeserializeObject<Dictionary<string, object>>(outerLayer["Message"]);
        string statusCode = fields["StatusCode"] as string;

        if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_SUCCEEDED, StringComparison.InvariantCultureIgnoreCase))
        {
          Console.WriteLine("Downloading job output");
          DownloadOutput(jobId, client); // Save job output to the specified file location.
        }
        else if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_FAILED, StringComparison.InvariantCultureIgnoreCase))
          Console.WriteLine("Job failed... cannot download the archive.");

        jobDone = true;
        sqsClient.DeleteMessage(new DeleteMessageRequest() { QueueUrl = queueUrl, ReceiptHandle = message.ReceiptHandle });
      }
    }

    private static void DownloadOutput(string jobId, AmazonGlacierClient client)
    {
      GetJobOutputRequest getJobOutputRequest = new GetJobOutputRequest()
      {
        JobId = jobId,
        VaultName = vaultName
      };
      
      GetJobOutputResponse getJobOutputResponse = client.GetJobOutput(getJobOutputRequest);
      using (Stream webStream = getJobOutputResponse.Body)
      {
          using (Stream fileToSave = File.OpenWrite(fileName))
          {
              CopyStream(webStream, fileToSave);
          }
      }
    }

    public static void CopyStream(Stream input, Stream output)
    {
      byte[] buffer = new byte[65536];
      int length;
      while ((length = input.Read(buffer, 0, buffer.Length)) > 0)
      {
        output.Write(buffer, 0, length);
      }
    }
  }
}
```

### 例 2: の低レベル API を使用してアーカイブを取得する AWS SDK for .NET— 出力をチャンクでダウンロードする
<a name="creating-vaults-sdk-dotnet-example2"></a>

次の C\$1 コード例では、Amazon Glacier からアーカイブを取得しています。このコード例では、`GetJobOutputRequest` オブジェクトのバイト範囲を指定することにより、ジョブの出力をチャンクに分けてダウンロードします。

```
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Amazon.Glacier;
using Amazon.Glacier.Model;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;
using Amazon.SimpleNotificationService;
using Amazon.SimpleNotificationService.Model;
using Amazon.SQS;
using Amazon.SQS.Model;
using Newtonsoft.Json;
using System.Collections.Specialized;

namespace glacier.amazon.com.rproxy.govskope.ca.docsamples
{
  class ArchiveDownloadLowLevelUsingSQLSNSOutputUsingRange
  {
    static string topicArn;
    static string queueUrl;
    static string queueArn;
    static string vaultName = "*** Provide vault name ***";
    static string archiveId = "*** Provide archive ID ***";
    static string fileName  = "*** Provide the file name and path to where to store downloaded archive ***";
    static AmazonSimpleNotificationServiceClient snsClient;
    static AmazonSQSClient sqsClient;
    const string SQS_POLICY =
        "{" +
        "    \"Version\" : \"2012-10-17\",&TCX5-2025-waiver;" +
        "    \"Statement\" : [" +
        "        {" +
        "            \"Sid\" : \"sns-rule\"," +
        "            \"Effect\" : \"Allow\"," +
        "            \"Principal\" : {\"AWS\" : \"arn:aws:iam::123456789012:root\" }," +
        "            \"Action\"  : \"sqs:SendMessage\"," +
        "            \"Resource\"  : \"{QuernArn}\"," +
        "            \"Condition\" : {" +
        "                \"ArnLike\" : {" +
        "                    \"aws:SourceArn\" : \"{TopicArn}\"" +
        "                }" +
        "            }" +
        "        }" +
        "    ]" +
        "}";

    public static void Main(string[] args)
    {
      AmazonGlacierClient client;

      try
      {
          using (client = new AmazonGlacierClient(Amazon.RegionEndpoint.USWest2))
          {
              Console.WriteLine("Setup SNS topic and SQS queue.");
              SetupTopicAndQueue();
              Console.WriteLine("To continue, press Enter"); Console.ReadKey();

              Console.WriteLine("Download archive");
              DownloadAnArchive(archiveId, client);
        }
        Console.WriteLine("Operations successful. To continue, press Enter");
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      finally
      {
        // Delete SNS topic and SQS queue.
        snsClient.DeleteTopic(new DeleteTopicRequest() { TopicArn = topicArn });
        sqsClient.DeleteQueue(new DeleteQueueRequest() { QueueUrl = queueUrl });
      }
    }

       static void SetupTopicAndQueue()
    {
      long ticks = DateTime.Now.Ticks;
      
      // Setup SNS topic.
      snsClient = new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.USWest2);
      sqsClient = new AmazonSQSClient(Amazon.RegionEndpoint.USWest2);

      topicArn = snsClient.CreateTopic(new CreateTopicRequest { Name = "GlacierDownload-" + ticks }).TopicArn;
      Console.Write("topicArn: "); Console.WriteLine(topicArn);

      CreateQueueRequest createQueueRequest = new CreateQueueRequest();
      createQueueRequest.QueueName = "GlacierDownload-" + ticks;
      CreateQueueResponse createQueueResponse = sqsClient.CreateQueue(createQueueRequest);
      queueUrl = createQueueResponse.QueueUrl;
      Console.Write("QueueURL: "); Console.WriteLine(queueUrl);

      GetQueueAttributesRequest getQueueAttributesRequest = new GetQueueAttributesRequest();
      getQueueAttributesRequest.AttributeNames = new List<string> { "QueueArn" };
      getQueueAttributesRequest.QueueUrl = queueUrl;
      GetQueueAttributesResponse response = sqsClient.GetQueueAttributes(getQueueAttributesRequest);
      queueArn = response.QueueARN;
      Console.Write("QueueArn: "); Console.WriteLine(queueArn);

      // Setup the Amazon SNS topic to publish to the SQS queue.
      snsClient.Subscribe(new SubscribeRequest()
      {
        Protocol = "sqs",
        Endpoint = queueArn,
        TopicArn = topicArn
      });

      // Add the policy to the queue so SNS can send messages to the queue.
      var policy = SQS_POLICY.Replace("{TopicArn}", topicArn).Replace("{QuernArn}", queueArn);

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

    static void DownloadAnArchive(string archiveId, AmazonGlacierClient client)
    {
      // Initiate job.
      InitiateJobRequest initJobRequest = new InitiateJobRequest()
      {

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

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

    private static void ProcessQueue(string jobId, AmazonGlacierClient client)
    {
        var receiveMessageRequest = new ReceiveMessageRequest() { QueueUrl = queueUrl, MaxNumberOfMessages = 1 };
        bool jobDone = false;
        while (!jobDone)
        {
            Console.WriteLine("Poll SQS queue");
            ReceiveMessageResponse receiveMessageResponse = sqsClient.ReceiveMessage(receiveMessageRequest);
            if (receiveMessageResponse.Messages.Count == 0)
            {
                Thread.Sleep(10000 * 60);
                continue;
            }
            Console.WriteLine("Got message");
            Message message = receiveMessageResponse.Messages[0];
            Dictionary<string, string> outerLayer = JsonConvert.DeserializeObject<Dictionary<string, string>>(message.Body);
            Dictionary<string, object> fields = JsonConvert.DeserializeObject<Dictionary<string, object>>(outerLayer["Message"]);
            string statusCode = fields["StatusCode"] as string;
            if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_SUCCEEDED, StringComparison.InvariantCultureIgnoreCase))
            {
                long archiveSize = Convert.ToInt64(fields["ArchiveSizeInBytes"]);
                Console.WriteLine("Downloading job output");
                DownloadOutput(jobId, archiveSize, client); // This where we save job output to the specified file location.
            }
            else if (string.Equals(statusCode, GlacierUtils.JOB_STATUS_FAILED, StringComparison.InvariantCultureIgnoreCase))
                Console.WriteLine("Job failed... cannot download the archive.");
            jobDone = true;
            sqsClient.DeleteMessage(new DeleteMessageRequest() { QueueUrl = queueUrl, ReceiptHandle = message.ReceiptHandle });
        }
    }               

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

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

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

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

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

    public static void CopyStream(Stream input, Stream output)
    {
      byte[] buffer = new byte[65536];
      int length;
      while ((length = input.Read(buffer, 0, buffer.Length)) > 0)
      {
        output.Write(buffer, 0, length);
      }
    }
  }
}
```

# Python での並列処理を使用した大きなアーカイブのダウンロード
<a name="downloading-large-archive-parallel-python"></a>

このトピックでは、Python での並列処理を使用して Amazon S3 Glacier (S3 Glacier) から大きなアーカイブをダウンロードする方法について説明します。この方法では、個別に処理できるように細かく分割することで、どのサイズのアーカイブも確実にダウンロードできます。

## 概要:
<a name="downloading-large-archive-python-overview"></a>

この例で提供されている Python スクリプトは、次のタスクを実行します。

1. 通知に必要な AWS リソース (Amazon SNS トピックと Amazon SQS キュー) を設定します。

1. Amazon Glacier でアーカイブ取得ジョブを開始します

1. ジョブ完了通知の Amazon SQS キューをモニタリングします

1. 大きなアーカイブを管理しやすいチャンクに分割します

1. 複数のワーカースレッドを使用してチャンクを並行してダウンロードします

1. 後で再組み立てできるように各チャンクをディスクに保存します

## 前提条件
<a name="downloading-large-archive-python-prerequisites"></a>

開始する前に、以下の準備が整っていることを確認します。
+ Python 3.6 以降がインストールされていること。
+ AWS SDK for Python (Boto3) がインストールされている
+ AWS Amazon Glacier、Amazon SNS、Amazon SQS の適切なアクセス許可で設定された 認証情報
+ ダウンロードしたアーカイブチャンクを保存するのに十分なディスク容量

## 例: Python での並列処理を使用したアーカイブのダウンロード
<a name="downloading-large-archive-python-code"></a>

次の Python スクリプトは、並列処理を使用して Amazon Glacier から大きなアーカイブをダウンロードする方法を示しています。

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

## スクリプトを使用する
<a name="downloading-large-archive-python-usage"></a>

このスクリプトを使用するには、次のステップに従います。

1. スクリプトのプレースホルダー値をユーザー固有の情報に置き換えます。
   + *output\$1file\$1path*: チャンクファイルが保存されるディレクトリ
   + *vault\$1name*: S3 Glacier ボールトの名前
   + *notify\$1queue\$1name*: ジョブ通知キューの名前
   + *chunk\$1download\$1queue\$1name*: チャンクダウンロードキューの名前
   + *sns\$1topic\$1name*: SNS トピックの名前
   + *region*: ボールトが配置されている AWS リージョン
   + *archive\$1id*: 取得するアーカイブの ID

1.  スクリプトを実行します。

   ```
   python download_large_archive.py
   ```

1. すべてのチャンクをダウンロードしたら、次のようなコマンドを使用して 1 つのファイルにまとめることができます。

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

## 重要な考慮事項
<a name="downloading-large-archive-python-considerations"></a>

このスクリプトを使用する場合は、次の点に留意してください。
+ 選択した取得階層によって、S3 Glacier からのアーカイブの取得を完了するまでに数時間かかる場合があります。
+ スクリプトは無期限に実行され、キューを継続的にポーリングします。特定の要件に基づいて終了条件を追加することもできます。
+ アーカイブのすべてのチャンクを保存するのに十分なディスク容量があることを確認します。
+ スクリプトが中断された場合は、`retrieve_archive=False` で再起動して、新しい取得ジョブを開始せずにチャンクのダウンロードを続行できます。
+ ネットワーク帯域幅とシステムリソースに基づいて、*chunk\$1size* パラメータと *workers* パラメータを調整します。
+ Amazon S3 の取得、Amazon SNS、Amazon SQS の使用には、標準 AWS 料金が適用されます。

# REST API を使用したアーカイブのダウンロード
<a name="downloading-an-archive-using-rest"></a>

**REST API を使用してアーカイブをダウンロードする方法**

アーカイブをダウンロードするプロセスは、2 つのステップに分けることができます。

1. `archive-retrieval` タイプのジョブを開始します。詳細については、「[ジョブの開始 (ジョブの POST)](api-initiate-job-post.md)」を参照してください。

1. ジョブが完了したら、アーカイブデータをダウンロードします。詳細については、「[ジョブの出力の取得 (GET output)](api-job-output-get.md)」を参照してください。

# を使用した Amazon Glacier でのアーカイブのダウンロード AWS CLI
<a name="downloading-an-archive-using-cli"></a>

 AWS Command Line Interface () を使用して、Amazon Glacier (Amazon Glacier) でアーカイブをダウンロードできますAWS CLI。

**Topics**
+ [

## (前提条件) のセットアップ AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## 例: を使用してアーカイブをダウンロードする AWS CLI
](#Downloading-Archives-CLI-Implementation)

## (前提条件) のセットアップ AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1.  AWS CLIをダウンロードして設定します。手順については、*「AWS Command Line Interface ユーザーガイド」*の次のトピックを参照してください。

    [のインストール AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

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

1. コマンドプロンプトで次のコマンドを入力して、 AWS CLI セットアップを確認します。これらのコマンドは、いずれも認証情報を明示的に提供しないため、デフォルトプロファイルの認証情報が使用されます。
   + help コマンドを使用してください。

     ```
     aws help
     ```
   + 設定したアカウントの Amazon Glacier ボールトのリストを取得するには、`list-vaults` コマンドを使用します。*123456789012* を AWS アカウント ID に置き換えます。

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + の現在の設定データを表示するには AWS CLI、 `aws configure list` コマンドを使用します。

     ```
     aws configure list
     ```

## 例: を使用してアーカイブをダウンロードする AWS CLI
<a name="Downloading-Archives-CLI-Implementation"></a>
**注記**  
アーカイブをダウンロードするには、アーカイブ ID がわかっている必要があります。ステップ 1～4 でアーカイブ ID を取得します。ダウンロードするアーカイブ ID がすでにわかっている場合は、ステップ 5 に進みます。

1. インベントリ取得ジョブを開始するには、`initiate-job` コマンドを使用します。インベントリレポートにアーカイブ ID が一覧表示されます。

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

    正常な出力:

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

1. 以前の `` ジョブのステータスをチェックするには、`describe-job` コマンドを使用します。

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

    正常な出力:

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

1.  ジョブが完了するまで待ちます。

   ジョブの出力をダウンロードする準備が整うまで待つ必要があります。ボールトに通知設定を指定している場合、またはジョブを開始したときに Amazon Simple Notification Service (Amazon SNS) トピックを指定している場合は、ジョブの完了後に Amazon Glacier からそのトピックにメッセージが送信されます。

   ボールトに特定のイベントに対する通知設定を指定できます。詳細については、「[Amazon Glacier でボールト通知を設定する](configuring-notifications.md)」を参照してください。Amazon Glacier は、特定のイベントが発生するたびに、指定された SNS トピックにメッセージを送信します。

1. 完了したら、`get-job-output` コマンドを使用して、取得ジョブをファイル `output.json` にダウンロードします。このファイルにアーカイブ ID が含まれます。

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

   このコマンドは、次のフィールドを含むファイルを生成します。

   ```
   {
   "VaultARN":"arn:aws:glacier:region:111122223333:vaults/awsexamplevault",
   "InventoryDate":"*** job completion date ***",
   "ArchiveList":[
   {"ArchiveId":"*** archiveid ***",
   "ArchiveDescription":*** archive description (if set) ***,
   "CreationDate":"*** archive creation date ***",
   "Size":"*** archive size (in bytes) ***",
   "SHA256TreeHash":"*** archive hash ***"
   }
   {"ArchiveId":
   ...
   ]}
   ```

1. `initiate-job` コマンドを使用して、ボールトから各アーカイブを取得するプロセスを開始します。以下に示すようにジョブパラメータを `archive-retrieval` と指定する必要があります。

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

1. `archive-retrieval` ジョブが完了するまで待ちます。以前のコマンドのステータスをチェックするには、`describe-job` コマンドを使用します。

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

1. 上記のジョブが完了したら、`get-job-output` コマンドを使用してアーカイブをダウンロードします。

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

# Amazon Glacier でのアーカイブの削除
<a name="deleting-an-archive"></a>

Amazon Glacier (Amazon Glacier) 管理コンソールを使用してアーカイブを削除することはできません。アーカイブを削除するには、 AWS Command Line Interface (CLI) を使用するか、コードを記述して、REST API を直接使用するか、 AWS SDK for Java および .NET ラッパーライブラリを使用して削除リクエストを行う必要があります。以下のトピックでは、 AWS SDK for Java および .NET ラッパーライブラリ、REST API、および を使用する方法について説明します AWS CLI。

**Topics**
+ [

# AWS SDK for Javaを使用して Amazon Glacier でアーカイブを削除する
](deleting-an-archive-using-java.md)
+ [

# を使用した Amazon Glacier でのアーカイブの削除 AWS SDK for .NET
](deleting-an-archive-using-dot-net.md)
+ [

# REST API を使用した Amazon Glacier アーカイブの削除
](deleting-an-archive-using-rest.md)
+ [

# を使用した Amazon Glacier でのアーカイブの削除 AWS Command Line Interface
](deleting-an-archive-using-cli.md)

ボールトから削除できるアーカイブは一度に 1 つです。アーカイブを削除するには、削除リクエストにアーカイブ ID を指定する必要があります。アーカイブ ID は、そのアーカイブを含むボールトのボールトインベントリをダウンロードすることで取得できます。ボールトインベントリのダウンロードの詳細については、「[Amazon Glacier でボールトインベントリをダウンロードする](vault-inventory.md)」を参照してください。

アーカイブを削除した後でも、削除したアーカイブの取得ジョブを開始することはリクエストできますが、アーカイブの取得ジョブ自体は失敗します。

アーカイブを削除する際に、該当するアーカイブ ID のアーカイブが取得中であった場合、取得は以下のシナリオに応じて成功する場合と成功しない場合があります。

 
+ Amazon Glacier がアーカイブの削除リクエストを受け取ったときに、アーカイブの取得ジョブがダウンロード用のデータを準備している最中であった場合には、アーカイブの取得オペレーションが失敗することがあります。
+ Amazon Glacier がアーカイブの削除リクエストを受け取ったときに、アーカイブの取得ジョブがダウンロード対象のアーカイブの準備を完了していた場合には、出力をダウンロードできます。

アーカイブの取得に関する詳細については、「[Amazon Glacier でのアーカイブのダウンロード](downloading-an-archive.md)」を参照してください。

このオペレーションはべき等です。既に削除されたアーカイブを削除しようとした場合には、エラーは発生しません。

アーカイブの削除後、すぐにボールトインベントリをダウンロードした場合、リストに削除したアーカイブが含まれることがあります。Amazon Glacier がボールトインベントリを更新するのは、約 1 日 1 回であるためです。

**注記**  
ボールトアーカイブの自動削除については、「[Amazon S3 Glacier でのボールトアーカイブの自動削除](https://aws.amazon.com/solutions/guidance/automated-deletion-of-vault-archives-in-amazon-s3-glacier/)」を参照してください。

# AWS SDK for Javaを使用して Amazon Glacier でアーカイブを削除する
<a name="deleting-an-archive-using-java"></a>

以下では、AWS SDK for Java の低レベル API を使用してアーカイブを削除する手順を示します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   削除するアーカイブが格納されている AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、そのAWSリージョンに適用されます。

1. `DeleteArchiveRequest` クラスのインスタンスを作成することにより、リクエスト情報を指定します。

   アーカイブ ID、ボールト名、およびアカウント ID を指定する必要があります。アカウント ID を指定しなかった場合は、リクエストに署名する際に指定した認証情報に関連づけられているアカウント ID が使用されます。詳細については、「[Amazon Glacier AWS SDK for Java での の使用](using-aws-sdk-for-java.md)」を参照してください。

1. リクエストオブジェクトをパラメータとして指定して、`deleteArchive` メソッドを実行します。

以下の Java コードスニペットは、前述の手順を示しています。

```
AmazonGlacierClient client;

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

client.deleteArchive(request);
```

 

**注記**  
基本となる REST API については、「[アーカイブの削除 (DELETE archive)](api-archive-delete.md)」を参照してください。

## 例: AWS SDK for Java を使用したアーカイブの削除
<a name="deleting-an-archive-using-java-example"></a>

以下の Java コード例では、AWS SDK for Java を使用してアーカイブを削除しています。この例を実行するための詳しい手順については、「[Eclipse を使用した Amazon Glacier の Java 実行例](using-aws-sdk-for-java.md#setting-up-and-testing-sdk-java)」を参照してください。ここに示したコードは、ボールトの名前と、削除するアーカイブのアーカイブ ID で更新する必要があります。

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

# を使用した Amazon Glacier でのアーカイブの削除 AWS SDK for .NET
<a name="deleting-an-archive-using-dot-net"></a>

両方[高レベル API と低レベル API](using-aws-sdk.md).NET 用の Amazon SDK で提供されており、アーカイブを削除する方法を提供します。

**Topics**
+ [

## の高レベル API を使用したアーカイブの削除 AWS SDK for .NET
](#delete-archive-using-dot-net-high-level)
+ [

## 低レベル API を使用したアーカイブの削除 AWS SDK for .NET
](#delete-archive-using-dot-net-low-level)

## の高レベル API を使用したアーカイブの削除 AWS SDK for .NET
<a name="delete-archive-using-dot-net-high-level"></a>

高レベル API の `ArchiveTransferManager` クラスには、アーカイブの削除に使用できる `DeleteArchive` メソッドが用意されています。

### 例: の高レベル API を使用したアーカイブの削除 AWS SDK for .NET
<a name="delete-archive-dot-net-high-level-example"></a>

次の C\$1 コード例では、 の高レベル API AWS SDK for .NET を使用してアーカイブを削除します。この例を実行するための詳しい手順については、「[コード例の実行](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)」を参照してください。ここに示したコードは、削除するアーカイブのアーカイブ ID で、更新する必要があります。

**Example**  

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

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

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

## 低レベル API を使用したアーカイブの削除 AWS SDK for .NET
<a name="delete-archive-using-dot-net-low-level"></a>

以下に、 AWS SDK for .NETを使用してアーカイブを削除する手順を示します。

 

1. `AmazonGlacierClient` クラスのインスタンス（クライアント）を作成します。

   削除するアーカイブが保存される AWS リージョンを指定する必要があります。このクライアントを使用して実行するすべてのオペレーションは、その AWS リージョンに適用されます。

1. `DeleteArchiveRequest` クラスのインスタンスを作成することにより、リクエスト情報を指定します。

   アーカイブ ID、ボールト名、およびアカウント ID を指定する必要があります。アカウント ID を指定しなかった場合は、リクエストに署名する際に指定した認証情報に関連づけられているアカウント ID が使用されます。詳細については、「[Amazon Glacier での AWS SDKs の使用](using-aws-sdk.md)」を参照してください。

1. リクエストオブジェクトをパラメータとして指定して、`DeleteArchive` メソッドを実行します。

### 例: の低レベル API を使用してアーカイブを削除する AWS SDK for .NET
<a name="delete-archive-dot-net-low-level-example"></a>

以下の C\$1 の例は、前述の手順を示しています。この例では、 の低レベル API AWS SDK for .NET を使用してアーカイブを削除します。

**注記**  
基本となる REST API については、「[アーカイブの削除 (DELETE archive)](api-archive-delete.md)」を参照してください。

 この例を実行するための詳しい手順については、「[コード例の実行](using-aws-sdk-for-dot-net.md#setting-up-and-testing-sdk-dotnet)」を参照してください。ここに示したコードは、削除するアーカイブのアーカイブ ID で、更新する必要があります。

**Example**  

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

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

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

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

# REST API を使用した Amazon Glacier アーカイブの削除
<a name="deleting-an-archive-using-rest"></a>

アーカイブ削除 API を使用して、アーカイブを削除できます。
+ アーカイブ削除 API の詳細については、「[アーカイブの削除 (DELETE archive)](api-archive-delete.md)」を参照してください。
+ REST API の使用については、「[Amazon Glacier の API リファレンス](amazon-glacier-api.md)」を参照してください。

# を使用した Amazon Glacier でのアーカイブの削除 AWS Command Line Interface
<a name="deleting-an-archive-using-cli"></a>

 AWS Command Line Interface () を使用して、Amazon Glacier (Amazon Glacier) のアーカイブを削除できますAWS CLI。

**Topics**
+ [

## (前提条件) のセットアップ AWS CLI
](#Creating-Vaults-CLI-Setup)
+ [

## 例: を使用したアーカイブの削除 AWS CLI
](#Deleting-Archives-CLI-Implementation)

## (前提条件) のセットアップ AWS CLI
<a name="Creating-Vaults-CLI-Setup"></a>

1.  AWS CLIをダウンロードして設定します。手順については、*「AWS Command Line Interface ユーザーガイド」*の次のトピックを参照してください。

    [のインストール AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html) 

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

1. コマンドプロンプトで次のコマンドを入力して、 AWS CLI セットアップを確認します。これらのコマンドは、いずれも認証情報を明示的に提供しないため、デフォルトプロファイルの認証情報が使用されます。
   + help コマンドを使用してください。

     ```
     aws help
     ```
   + 設定したアカウントの Amazon Glacier ボールトのリストを取得するには、`list-vaults` コマンドを使用します。*123456789012* を AWS アカウント ID に置き換えます。

     ```
     aws glacier list-vaults --account-id 123456789012
     ```
   + の現在の設定データを表示するには AWS CLI、 `aws configure list` コマンドを使用します。

     ```
     aws configure list
     ```

## 例: を使用したアーカイブの削除 AWS CLI
<a name="Deleting-Archives-CLI-Implementation"></a>

1. インベントリ取得ジョブを開始するには、[https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-job.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-job.html) コマンドを使用します。

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

    正常な出力:

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

1. 以前の取得ジョブのステータスをチェックするには、[https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-job.html](https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-job.html) コマンドを使用します。

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

    正常な出力:

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

1.  ジョブが完了するまで待ちます。

   ジョブの出力をダウンロードする準備が整うまで待つ必要があります。ボールトに通知設定を指定している場合、またはジョブを開始したときに Amazon Simple Notification Service (Amazon SNS) トピックを指定している場合は、ジョブの完了後に Amazon Glacier からそのトピックにメッセージが送信されます。

   ボールトに特定のイベントに対する通知設定を指定できます。詳細については、「[Amazon Glacier でボールト通知を設定する](configuring-notifications.md)」を参照してください。Amazon Glacier は、特定のイベントが発生するたびに、指定された SNS トピックにメッセージを送信します。

1. 完了したら、[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) コマンドを使用して、取得ジョブをファイル `output.json` にダウンロードします。

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

   このコマンドは、次のフィールドを含むファイルを生成します。

   ```
   {
   "VaultARN":"arn:aws:glacier:region:111122223333:vaults/awsexamplevault",
   "InventoryDate":"*** job completion date ***",
   "ArchiveList":[
   {"ArchiveId":"*** archiveid ***",
   "ArchiveDescription":*** archive description (if set) ***,
   "CreationDate":"*** archive creation date ***",
   "Size":"*** archive size (in bytes) ***",
   "SHA256TreeHash":"*** archive hash ***"
   }
   {"ArchiveId":
   ...
   ]}
   ```

1. `delete-archive` コマンドを使用して、ボールトから各アーカイブを削除します。

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