

 **このページは、ボールトと 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 ストレージクラスへの移行を検討してください。

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

# パート単位での大きなアーカイブのアップロード (マルチパートアップロード)
<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.us.docsamples
{
  class ArchiveUploadMPU
  {
    static string vaultName       = "examplevault";
    static string archiveToUpload = "*** Provide file name (with full path) to upload ***";
    static long partSize          = 4194304; // 4 MB.

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

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

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

      InitiateMultipartUploadResponse initiateMPUresponse = client.InitiateMultipartUpload(initiateMPUrequest);

      return initiateMPUresponse.UploadId;
    }

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

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

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

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

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

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

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