Amazon S3 でのマルチパートアップロードを使用したオブジェクトのアップロードとコピー
マルチパートアップロードを使用すると、単一のオブジェクトをパートのセットとして Amazon S3 にアップロードすることができます。各パートは、オブジェクトのデータの連続する部分です。これらのオブジェクトパートは、任意の順序で個別にアップロードできます。アップロードの場合、更新された AWS クライアントはオブジェクトのチェックサムを自動的に計算し、リクエストの一部としてオブジェクトのサイズとともに Amazon S3 に送信します。いずれかのパートの送信が失敗すると、他のパートに影響を与えることなくそのパートを再送することができます。オブジェクトのすべてのパートがアップロードされたら、Amazon S3 はこれらを組み立ててオブジェクトを作成します。100 MB 以上のオブジェクトは、単一のオペレーションでアップロードするのではなく、マルチパートアップロードを使用するのがベストプラクティスです。
マルチパートアップロードの使用には、次の利点があります。
-
スループットの向上 − パートを並列にアップロードすることで、スループットを向上させることができます。
-
ネットワーク問題からの迅速な回復 − パートサイズが小さいほど、ネットワークエラーにより失敗したアップロードを再開する際の影響を最小限に抑えることができます。
-
オブジェクトのアップロードの一時停止と再開 – オブジェクトの複数のパートを徐々にアップロードできます。マルチパートアップロードを開始した後は終了期限がありません。マルチパートアップロードは明示的に完了または停止する必要があります。
-
オブジェクトの最終的なサイズが不明な状態でアップロードを開始 – オブジェクトを作成しながらアップロードできます。
次の方法でマルチパートアップロードを使用することをお勧めします。
-
安定した高帯域幅ネットワーク経由で大きなオブジェクトをアップロードする場合は、複数スレッドのパフォーマンスのために並行してオブジェクトパートをアップロードすることにより、マルチパートアップロードを使用して使用可能な帯域幅の使用を最大化します。
-
むらがあるネットワークでアップロードを実行する場合は、マルチパートアップロードを使用して、アップロードの再開を回避することで、ネットワークエラーに対する弾力性を高めます。マルチパートアップロードを使用するときには、アップロード中に中断されたパートのアップロードを再試行するだけで済みます。最初からオブジェクトのアップロードを再開する必要はありません。
注記
Amazon S3 Express One Zone ストレージクラスをディレクトリバケットで使用する方法の詳細については、「S3 Express One Zone」と「ディレクトリバケットの使用」を参照してください。S3 Express One Zone とディレクトリバケットでマルチパートアップロードを使用する方法の詳細については、「ディレクトリバケットでのマルチパートアップロードの使用」を参照してください。
マルチパートアップロードのプロセス
マルチパートアップロードは 3 つのステップで構成されるプロセスです。アップロードを開始し、オブジェクトのパートをアップロードします。すべてのパートをアップロードし終わったら、マルチパートアップロードを完了します。Amazon S3 の側では、マルチパートアップロードの完了リクエストを受け取ると同時に、アップロードされたパートからオブジェクトを構築します。構築されたオブジェクトは、バケット内の他のオブジェクトと同じようにアクセスできます。
進行中のすべてのマルチパートアップロードをリストしたり、特定のマルチパートアップロードにおいてアップロードが完了したパートのリスト表示を取得したりできます。このようなオペレーションのそれぞれについて、このセクションで説明します。
マルチパートアップロードの開始
マルチパートアップロードを開始するリクエストを送信するときは、必ずチェックサムタイプを指定してください。その後、Amazon S3 は、マルチパートアップロードの一意の識別子であるアップロード ID を含むレスポンスを返します。このアップロード ID は、パートのアップロード、パートのリスト、アップロードの完了、アップロードの停止を行うときは常に必要になります。アップロードするオブジェクトの説明となるメタデータを指定する場合は、マルチパートアップロードの開始リクエストの中で指定する必要があります。
パートのアップロード
パートをアップロードするときは、アップロード ID に加えて、パート番号を指定する必要があります。1~10,000 の範囲で任意のパート番号を選択できます。パート番号によって、アップロードするオブジェクトに含まれるパートとその位置が一意に識別されます。選択するパート番号は、連続している必要はありません (例えば、1、5、14 など)。以前にアップロードしたパートと同じパート番号を使って新しいパートをアップロードした場合、以前のパートは上書きされることに注意してください。
パートをアップロードすると、Amazon S3 は各パートのチェックサム値を含むチェックサムアルゴリズムタイプをレスポンスのヘッダーとして返します。パートのアップロードごとに、パート番号と ETag 値を記録する必要があります。マルチパートアップロードを完了するためには、残りのリクエストにこれらの値を含める必要があります。各パートには、アップロード時に独自の ETag が設定されます。ただし、マルチパートアップロードが完了し、すべてのパートが統合されると、チェックサムのチェックサムとしてすべてのパートが 1 つの ETag に属することになります。
重要
マルチパートアップロードを開始して、1 つまたは複数のパートをアップロードした後は、マルチパートアップロードを完了するか停止しない限り、アップロードしたパートのストレージに対する課金を停止できません。マルチパートアップロードを完了または停止した後でのみ、Amazon S3 はパートのストレージを解放して、パートのストレージに対する課金を停止します。
マルチパートアップロードを停止した後は、再度同じアップロード ID を使ってパートをアップロードすることはできません。パートのアップロードが進行中だった場合、アップロードを停止した後も、パートのアップロードは成功または失敗する可能性があります。すべてのパートによって使用されているストレージをすべて解放するには、すべてのパートのアップロードが完了した後でマルチパートアップロードを停止する必要があります。
マルチパートアップロードの完了
マルチパートアップロードを完了すると、パート番号に基づいて昇順に連結されたオブジェクトが Amazon S3 によって作成されます。マルチパートアップロードの開始リクエストにオブジェクトメタデータが指定されている場合、Amazon S3 によってそのメタデータはオブジェクトに関連付けられます。完了リクエストが正常に処理されると、個々のパートはなくなります。
マルチパートアップロードの完了リクエストには、アップロード ID と、パート番号およびそれに対応する ETag 値のリストが含まれている必要があります。Amazon S3 からのレスポンスには、結合されるオブジェクトデータを一意に識別する ETag が含まれます。この ETag が、オブジェクトデータの MD5 ハッシュになるとは限りません。
マルチパートアップロード中にフルオブジェクトチェックサムを指定すると、AWS SDK はそのチェックサムを Amazon S3 に渡し、S3 はオブジェクトの整合性をサーバー側で検証して、受信した値と比較します。次に、値が一致すると、S3 はオブジェクトを保存します。2 つの値が一致しない場合、Amazon S3 は BadDigest
エラーでリクエストに失敗します。オブジェクトのチェックサムはオブジェクトメタデータにも保存され、後でオブジェクトのデータ整合性を検証するために使用します。
マルチパートアップロードのサンプル呼び出し
この例では、100 GB ファイルのマルチパートアップロードを生成していると仮定します。この場合、プロセス全体に対して次の API コールが実行されます。合計 1,002 回の API コールが実行されます。
-
プロセスを開始する
CreateMultipartUpload
の呼び出し。 -
それぞれ 100 MB の一部をアップロードし、合計サイズは 100 GB となる、1,000 回の個別の
UploadPart
の呼び出し。 -
プロセスを完了するための
CompleteMultipartUpload
呼び出し。
マルチパートアップロードのリスト化
特定のマルチパートアップロードのパートや、進行中のすべてのマルチパートアップロードをリスト表示できます。パートのリストオペレーションでは、特定のマルチパートアップロードについて既にアップロードしたパートの情報が返されます。パートのリストリクエストを送信するたびに、指定したマルチパートアップロードのパート情報 (最大で 1,000 個のパート) が Amazon S3 から返されます。マルチパートアップロードに 1,000 個を超えるパートが含まれる場合、すべてのパートを取得するにはパートのリストリクエストを追加で送信する必要があります。返されるパートのリストには、アップロードが完了していないパートは含まれていないことに注意してください。マルチパートアップロードの一覧表示オペレーションを使用すると、進行中のマルチパートアップロードのリストを取得できます。
進行中のマルチパートアップロードとは、開始されているものの、まだ完了または停止されていないアップロードを意味します。各リクエストに最大 1,000 個のマルチパートアップロードが返されます。進行中のマルチパートアップロードが 1,000 個を超える場合、残りのマルチパートアップロードを取得するには、リクエストを追加で送信する必要があります。返されたリストは確認の目的でのみ使用してください。
重要
マルチパートアップロードの完了リクエストを送信するときに、このリストの結果を使用しないでください。代わりに、パートのアップロード時に指定したパート番号と、それに対応する、Amazon S3 から返される ETag 値の独自のリストを維持しておいてください。
マルチパートアップロードオペレーションを使用したチェックサム
Amazon S3 にオブジェクトをアップロードするときに、使用する Amazon S3 のチェックサムアルゴリズムを指定できます。デフォルトでは、AWS SDK および S3 コンソールはすべてのオブジェクトアップロードにアルゴリズムを使用します。これは上書きできます。古い SDK を使用していて、アップロードされたオブジェクトに指定されたチェックサムがない場合、Amazon S3 は自動的に CRC-64/NVME (CRC64NVME
) チェックサムアルゴリズムを使用します。(これは、効率的なデータ整合性の検証に推奨されるオプションでもあります。) CRC-64/NVME を使用する場合、Amazon S3 はマルチパートまたはシングルパートのアップロードの完了後に、フルオブジェクトのチェックサムを計算します。CRC-64/NVME チェックサムアルゴリズムは、オブジェクト全体の直接チェックサム、または個々のパートごとにチェックサムのチェックサムを計算するために使用されます。
マルチパートアップロードを使用してオブジェクトを S3 にアップロードすると、Amazon S3 は各パートまたはフルオブジェクトのチェックサム値を計算し、その値を保存します。S3 API または AWS SDK を使用して、次の方法でチェックサム値を取得できます。
-
個々のパートには、
GetObject
またはHeadObject
を使用できます。まだ処理中のマルチパートアップロードの個々の部分のチェックサム値を取得したい場合は、ListParts
を使用できます。 -
オブジェクト全体に対しては、
PutObject
を使用できます。フルオブジェクトのチェックサムを使用してマルチパートアップロードを実行する場合は、フルオブジェクトのチェックサムタイプを指定して、CreateMultipartUpload
とCompleteMultipartUpload
を使用します。オブジェクト全体のチェックサム値を検証するか、マルチパートアップロードで使用されているチェックサムタイプを確認するには、ListParts
を使用します。
重要
[チェックサム] を含むマルチパートアップロードを使用している場合、各パートのアップロード (マルチパートアップロードの中での) のパート番号には、連続するパート番号を使用する必要があります。[チェックサム] を使用している場合、連続しないパート番号でマルチパートアップロードリクエストを完了しようとすると、Amazon S3 は HTTP 500 Internal Server
エラーを生成します。
マルチパートアップロードオブジェクトでのチェックサムの動作の詳細については、「Amazon S3 でのオブジェクトの整合性のチェック」を参照してください。
追加のチェックサムを含むマルチパートアップロードを使用してオブジェクトをアップロードする方法を示すエンドツーエンドの手順については、「チュートリアル: マルチパートアップロードでオブジェクトをアップロードして、データ整合性を検証する」を参照してください。
マルチパートアップロードの同時オペレーション
分散開発環境においては、アプリケーションから同じオブジェクトに対して複数の更新が同時に開始されることもありえます。同じオブジェクトキーを使ってアプリケーションから複数のマルチパートアップロードが開始される可能性もあります。そのようなアップロードごとに、アプリケーションからパートのアップロードが行われ、アップロードの完了リクエストが Amazon S3 に送信されて、オブジェクトが作成されます。バケットで S3 バージョニングが有効になっているときには、マルチパートアップロードを完了するたびに新しいバージョンが作成されます。バージョニングが有効なバケットで、同じオブジェクトキーを使用する複数のマルチパートアップロードを開始した場合、オブジェクトの最新バージョンは、どのアップロードが最後に開始されたか (createdDate
) によって決まります。
例えば、オブジェクトの CreateMultipartUpload
リクエストを午前 10 時に開始します。次に、同じオブジェクトに対する 2 番目の CreateMultipartUpload
リクエストを午前 11 時に送信したとします。この場合は、2 番目のリクエストが最後に送信されたため、2 番目のリクエストの後に最初のアップロードが完了したとしても、午前 11 時 のリクエストでアップロードされたオブジェクトが最新バージョンになります。バージョニングが有効になっていないバケットの場合は、マルチパートアップロードの開始から完了までの間に受信された他の何らかのリクエストが優先される可能性もあります。
同時マルチパートアップロードリクエストが優先されるもう 1 つの例は、そのキーを使用してマルチパートアップロードを開始した後に、別のオペレーションでキーが削除される場合です。オペレーションを完了する前に、マルチパートアップロードの完了レスポンスによって、オブジェクトを確認できなくても、オブジェクト作成の成功が示される可能性があります。
マルチパートアップロード中に同じキー名を持つオブジェクトのアップロードを禁止する
アップロード時の条件付き書き込みオペレーションを使用して、バケット内にオブジェクトが存在するかどうかを確認してからオブジェクトを作成できるようになりました。これにより、既存のデータの上書きを阻止できます。条件付き書き込みでは、アップロードする際にバケット内に同じキー名を持つ既存のオブジェクトが存在しないことを検証します。
条件付き書き込みは、PutObject リクエストまたは CompleteMultipartUpload リクエストに使用できます。
条件付きリクエストの詳細については、「条件付きリクエストを使用して S3 オペレーションに前提条件を追加する」を参照してください。
マルチパートアップロードと料金
マルチパートアップロードを開始すると、アップロードを完了または中止するまですべてのパートが Amazon S3 によって保持されます。マルチパートアップロードの実行期間を通して、アップロードとそれに関連するパートのために使用されるすべてのストレージ、帯域幅、リクエストに対して課金が行われます。
これらのパートは、パートのアップロード時に指定されたストレージクラスに従って課金されます。ただし、これらのパートが S3 Glacier Flexible Retrieval または S3 Glacier Deep Archive にアップロードされた場合、料金は請求されません。S3 Glacier Flexible Retrieval ストレージクラスへの PUT リクエストに対する処理中のマルチパートパートは、アップロードが完了するまで S3 Glacier Flexible Retrieval ステージングストレージとして S3 標準ストレージ料金で請求されます。さらに、CreateMultipartUpload
と UploadPart
の両方が S3 標準料金で請求されます。CompleteMultipartUpload
リクエストのみが、S3 Glacier Flexible Retrieval 料金で請求されます。同様に、S3 Glacier Deep Archive ストレージクラスへの PUT の処理中のマルチパートパートは、アップロードが完了するまで S3 Glacier Flexible Retrieval ステージングストレージとして S3 標準ストレージ料金で請求されます。CompleteMultipartUpload
リクエストのみが、S3 Glacier Deep Archive 料金で請求されます。
マルチパートアップロードを停止した場合、Amazon S3 はアップロードアーティファクトおよびアップロードしたすべてのパートを削除します。これらのアーティファクトについては請求されません。指定されたストレージクラスに関係なく、不完全なマルチパートアップロードの削除に伴う早期削除料金はありません。料金に関する詳細については、「Amazon S3 の料金
注記
ストレージコストを最小限に抑えるため、AbortIncompleteMultipartUpload
アクションを使用して指定した日数が経過した後に不完全なマルチパートアップロードを削除するようにライフサイクルルールを設定することをお勧めします。不完全なマルチパートアップロードを削除するライフサイクルルールの作成の詳細については、「不完全なマルチパートアップロードを中止するためのバケットライフサイクルポリシーの設定」を参照してください。
マルチパートアップロードの API サポート
Amazon Simple Storage Service API リファレンスの以下のセクションでは、マルチパートアップロードの REST API について説明しています。
AWS Lambda 関数を使用するマルチパートアップロードのチュートリアルについては、「Uploading large objects to Amazon S3 using multipart upload and transfer acceleration
マルチパートアップロードの AWS Command Line Interface サポート
マルチパートアップロードのオペレーションについては、AWS Command Line Interface の以下のトピックを参照してください。
マルチパートアップロードの AWS SDK サポート
AWS SDK を使用して、オブジェクトを部分的にアップロードできます。API アクションでサポートされる AWS SDK のリストについては、次を参照してください。
マルチパートアップロード API とアクセス許可
マルチパートアップロードオペレーションを使用するには、必要なアクセス権限を有している必要があります。マルチパートアップロードオペレーションを実行するためのアクセス許可を付与するには、アクセスコントロールリスト (ACL)、バケットポリシー、ユーザーポリシーを使用できます。ACL、バケットポリシー、またはユーザーポリシーを使用して割り当てることのできる、さまざまなマルチパートアップロードオペレーションに必要なアクセス許可を次の表に示します。
アクション | 必要なアクセス許可 |
---|---|
マルチパートアップロードの作成 |
マルチパートアップロードのリクエストを作成するには、オブジェクトに対して バケット所有者は他のプリンシパルに対して |
Initiate Multipart Upload |
マルチパートアップロードを開始するには、オブジェクトに対して バケット所有者は他のプリンシパルに対して |
イニシエータ | マルチパートアップロード開始者を識別するコンテナエレメント。イニシエータが AWS アカウント である場合、このエレメントは所有者エレメントと同じ情報を提供します。イニシエータが IAM ユーザーである場合、このエレメントはユーザー ARN と表示名を提供します。 |
Upload Part | パートをアップロードするには、オブジェクトに対して マルチパートアップロードの開始者がオブジェクトのパートをアップロードできるようにするため、バケット所有者はその開始者に対しオブジェクトへの |
パートのアップロード (コピー) | パートをアップロードするには、オブジェクトに対して 開始者がオブジェクトのパートをアップロードするには、バケット所有者が、開始者にそのオブジェクトでの |
Complete Multipart Upload | マルチパートアップロードを完了するには、オブジェクトに対して マルチパートアップロードの開始者がオブジェクトのアップロードを完了できるようにするため、バケット所有者はその開始者に対しオブジェクトへの |
マルチパートアップロードの中止 | マルチパートアップロードを停止するには、 デフォルトでは、バケット所有者とマルチパートアップロードの開始者が、IAM と S3 バケットポリシーの一部として、このアクションの実行を許可されます。開始者が IAM ユーザーである場合、そのユーザーの AWS アカウント もそのマルチパートアップロードを停止できます。VPC エンドポイントポリシーでは、マルチパートアップロードのイニシエータは、 このようなデフォルト設定に加え、バケット所有者は他のプリンシパルに対してオブジェクトへの |
パートのリスト | マルチパートアップロードに含まれるパートをリストするには、 デフォルトではバケット所有者が、バケットに対する任意のマルチパートアップロードについてパートのリストを許可されています。マルチパートアップロードの開始者は、特定のマルチパートアップロードについてパートのリストを許可されます。マルチパートアップロードの開始者が IAM ユーザーである場合、その IAM ユーザーを管理している AWS アカウント もそのアップロードのパートのリストへのアクセス許可を付与されます。 このようなデフォルト設定に加え、バケット所有者は他のプリンシパルに対してオブジェクトへの |
マルチパートアップロードのリスト | バケットに対して進行中のマルチパートアップロードをリストするには、そのバケットに対して デフォルト設定に加え、バケット所有者は他のプリンシパルに対してバケットへの |
AWS KMS 暗号化および復号関連のアクセス許可 |
AWS Key Management Service (AWS KMS) KMS キーを使用した暗号化を伴うマルチパートアップロードを実行するには、リクエスタに以下のアクセス許可が必要です。
マルチパートアップロードを完了する前に、暗号化されたファイル部分からデータを復号して読み取る必要があるため、Amazon S3 にはこれらの許可が必要です。また、オブジェクトのチェックサム値を取得するには、 IAM ユーザーまたはロールが KMS キーと同じ AWS アカウントにある場合、キーと IAM ポリシーの両方にアクセス許可があることを確認してください。IAM ユーザーまたはロールが KMS キーとは異なるアカウントに属している場合、キーポリシーと IAM ユーザーまたはロールの両方に対する許可が必要です。 |
SSE-C (お客様が用意した暗号化キーによるサーバー側の暗号化) | CompleteMultipartUpload API を使用する場合は、SSE-C (お客様が用意した暗号化キーによるサーバー側の暗号化) を指定する必要があります。指定しない場合、オブジェクトはチェックサムなしで作成され、チェックサム値は返されません。 |
ACL アクセス権限とアクセスポリシーのアクセス許可との関係については、ACL アクセス許可とアクセスポリシーのアクセス許可のマッピング を参照してください。IAM ユーザー、グループ、ロール、ベストプラクティスの詳細については、IAM ユーザーガイドの「IAM ID (ユーザー、グループ、ロール)」を参照してください。
マルチパートアップロードオペレーションを使用したチェックサム
実際のマルチパートアップロードを実行するために使用される Amazon S3 API は CreateMultipartUpload
、UploadPart
、および CompleteMultipartUpload
の 3 つです。次の表は、各 API に提供する必要があるチェックサムヘッダーと値を示しています。
チェックサムアルゴリズム | チェックサムタイプ | CreateMultipartUpload |
UploadPart |
CompleteMultipartUpoad |
---|---|---|---|---|
CRC-64/NVME ( |
フルオブジェクト | 必要なヘッダー:
|
オプションヘッダー:
|
オプションヘッダー:
|
CRC-32 ( CRC 32-C ( |
フルオブジェクト |
必要なヘッダー:
|
オプションヘッダー:
|
オプションヘッダー:
|
CRC-32 ( CRC-32C ( SHA-1 ( SHA-256 ( |
複合 |
必要なヘッダー:
|
必要なヘッダー:
|
必要なヘッダー: すべてのパートレベルのチェックサムを オプションヘッダー:
|