マルチパートアップロードを使用したオブジェクトのアップロードとコピー - Amazon Simple Storage Service

マルチパートアップロードを使用したオブジェクトのアップロードとコピー

マルチパートアップロードを使用すると、単一のオブジェクトをパートのセットとしてアップロードすることができます。各パートは、オブジェクトのデータの連続する部分です。これらのオブジェクトパートは、任意の順序で個別にアップロードできます。いずれかのパートの送信が失敗すると、他のパートに影響を与えることなくそのパートを再送することができます。オブジェクトのすべてのパートがアップロードされたら、Amazon S3 はこれらのパートを組み立ててオブジェクトを作成します。通常、オブジェクトサイズが 100 MB 以上の場合は、単一のオペレーションでオブジェクトをアップロードする代わりに、マルチパートアップロードを使用することを考慮してください。

マルチパートアップロードの使用には、次の利点があります。

  • スループットの向上 − パートを並列にアップロードすることで、スループットを向上させることができます。

  • ネットワーク問題からの迅速な回復 − パートサイズが小さいほど、ネットワークエラーにより失敗したアップロードを再開する際の影響を最小限に抑えることができます。

  • オブジェクトのアップロードの一時停止と再開 – オブジェクトの複数のパートを徐々にアップロードできます。マルチパートアップロードを開始した後は終了期限がありません。マルチパートアップロードは明示的に完了または停止する必要があります。

  • オブジェクトの最終的なサイズが不明な状態でアップロードを開始 – オブジェクトの作成中でもアップロードを開始できます。

次の方法でマルチパートアップロードを使用することをお勧めします。

  • 安定した高帯域幅ネットワーク経由で大きなオブジェクトをアップロードする場合は、複数スレッドのパフォーマンスのために並行してオブジェクトパートをアップロードすることにより、マルチパートアップロードを使用して使用可能な帯域幅の使用を最大化します。

  • むらがあるネットワークでアップロードを実行する場合は、マルチパートアップロードを使用して、アップロードの再開を回避することで、ネットワークエラーに対する弾力性を高めます。マルチパートアップロードを使用するときには、アップロード中に中断されたパートのアップロードを再試行するだけで済みます。最初からオブジェクトのアップロードを再開する必要はありません。

注記

Amazon S3 Express One Zone ストレージクラスをディレクトリバケットで使用する方法の詳細については、「ディレクトリバケットと S3 Express One Zone」と「ディレクトリバケットの概要」を参照してください。S3 Express One Zone とディレクトリバケットでマルチパートアップロードを使用する方法の詳細については、「ディレクトリバケットでのマルチパートアップロードの使用」を参照してください。

マルチパートアップロードのプロセス

マルチパートアップロードは 3 つのステップで構成されるプロセスです。まずアップロードを開始し、次にオブジェクトのパートをアップロードします。すべてのパートをアップロードしたらマルチパートアップロードを完了します。Amazon S3 の側では、マルチパートアップロードの完了リクエストを受け取ると同時に、アップロードされたパートからオブジェクトを構築します。構築されたオブジェクトは、バケット内の他のオブジェクトと同じようにアクセスできます。

進行中のすべてのマルチパートアップロードをリストしたり、特定のマルチパートアップロードにおいてアップロードが完了したパートのリストを取得したりできます。このようなオペレーションのそれぞれについて、このセクションで説明します。

マルチパートアップロードの開始

リクエストを送信すると、アップロード ID を含むレスポンスが Amazon S3 から返されます。アップロード ID はマルチパートアップロードの一意の識別子です。パートのアップロード、パートのリスト、アップロードの完了、アップロードの停止を行うときは常に、このアップロード ID を指定する必要があります。アップロードするオブジェクトの説明となるメタデータを指定する場合は、マルチパートアップロードの開始リクエストの中にそれを指定する必要があります。

パートのアップロード

パートをアップロードするときは、アップロード ID に加えて、パート番号を指定する必要があります。1~10,000 の範囲で任意のパート番号を選択できます。パート番号によって、アップロードするオブジェクトに含まれるパートとその位置が一意に識別されます。選択するパート番号は、連続している必要はありません (例えば、1、5、14 など)。以前にアップロードしたパートと同じパート番号を使って新しいパートをアップロードした場合、以前のパートは上書きされます。

パートをアップロードしたときに、Amazon S3 はエンティティタグ (ETag) ヘッダーを含むレスポンスを返します。パートのアップロードごとに、パート番号と ETag 値を記録する必要があります。マルチパートアップロードを完了するためには、残りのリクエストにこれらの値を含める必要があります。各パートには、アップロード時に独自の ETag が設定されます。ただし、マルチパートアップロードが完了し、すべてのパートが統合されると、チェックサムのチェックサムとしてすべてのパートが 1 つの ETag の下に置かれます。

注記

マルチパートアップロードを開始して、1 つまたは複数のパートをアップロードした後は、マルチパートアップロードを完了するか停止しない限り、アップロードしたパートのストレージに対する課金を停止できません。マルチパートアップロードを完了または停止した後でのみ、Amazon S3 はパートのストレージを解放して、パートのストレージに対する課金を停止します。

マルチパートアップロードを停止した後は、再度同じアップロード ID を使ってパートをアップロードすることはできません。パートのアップロードが進行しているときにアップロードを停止した後も、パートのアップロードは成功または失敗する可能性があります。すべてのパートによって使用されているストレージをすべて解放するには、すべてのパートのアップロードが完了した後でマルチパートアップロードを停止する必要があります。

マルチパートアップロードの完了

マルチパートアップロードを完了すると、パート番号に基づいて昇順に連結されたオブジェクトが Amazon S3 によって作成されます。マルチパートアップロードの開始リクエストにオブジェクトメタデータが指定されている場合、Amazon S3 によってそのメタデータはオブジェクトに関連付けられます。完了リクエストが正常に処理されると、個々のパートはなくなります。

マルチパートアップロードの完了リクエストには、アップロード ID と、パート番号およびそれに対応する ETag 値の両方のリストが含まれている必要があります。Amazon S3 からのレスポンスには、結合されるオブジェクトデータを一意に識別する ETag が含まれます。この ETag が、オブジェクトデータの MD5 ハッシュになるとは限りません。

マルチパートアップロードのサンプル呼び出し

この例では、100 GB ファイルのマルチパートアップロードを生成していると仮定します。この場合、プロセス全体に対して次の API コールが実行されます。合計 1002 回の API コールが実行されます。

  • プロセスを開始する CreateMultipartUpload の呼び出し。

  • それぞれ 100 MB の一部をアップロードし、合計サイズは 100 GB となる、1000 回の個別の UploadPart の呼び出し。

  • プロセスを終了する CompleteMultipartUpload の呼び出し。

マルチパートアップロードのリスト化

特定のマルチパートアップロードのパートや、進行中のすべてのマルチパートアップロードをリスト表示できます。パートのリストオペレーションでは、特定のマルチパートアップロードについて既にアップロードしたパートの情報が返されます。パートのリストリクエストを送信するたびに、指定したマルチパートアップロードのパート情報 (最大で 1,000 個のパート) が Amazon S3 から返されます。マルチパートアップロードに 1,000 個を超えるパートが含まれる場合、すべてのパートを取得するにはパートのリストリクエストを追加で送信する必要があります。返されるパートのリストには、アップロードが完了していないパートは含まれていないことに注意してください。マルチパートアップロードの一覧表示オペレーションを使用すると、進行中のマルチパートアップロードのリストを取得できます。

進行中のマルチパートアップロードとは、開始されているものの、まだ完了または停止されていないアップロードを意味します。各リクエストに最大 1,000 個のマルチパートアップロードが返されます。進行中のマルチパートアップロードが 1,000 個を超える場合、残りのマルチパートアップロードを取得するには、リクエストを追加で送信する必要があります。返されたリストは確認の目的でのみ使用してください。マルチパートアップロードの完了リクエストを送信するときに、このリストの結果を使用しないでください。代わりに、パートのアップロード時に指定したパート番号と、それに対応する、Amazon S3 から返される ETag 値の独自のリストを維持しておいてください。

マルチパートアップロードオペレーションを使用したチェックサム

Amazon S3 にオブジェクトをアップロードするときに、使用する Amazon S3 のチェックサムアルゴリズムを指定できます。Amazon S3 はデフォルトで MD5 を使用してデータの整合性を検証しますが、使用する追加のチェックサムアルゴリズムを指定することができます。MD5 を使用する場合、Amazon S3 はアップロードの完了後にマルチパートオブジェクト全体のチェックサムを計算します。このチェックサムはオブジェクト全体のチェックサムではなく、個々のパートのチェックサムのチェックサムです。

追加のチェックサムを使用するように Amazon S3 に指示すると、Amazon S3 は各パートのチェックサム値を計算し、その値を保存します。API または SDK を使用し、GetObject または HeadObject を使用して、個々のパートのチェックサム値を取得できます。まだ処理中のマルチパートアップロードの個々の部分のチェックサム値を取得したい場合は、ListParts を使用できます。

重要

追加のチェックサムを含むマルチパートアップロードを使用している場合は、マルチパート番号には連続するパート番号を使用する必要があります。追加のチェックサムを使用する場合、連続しないパート番号でマルチパートアップロードリクエストを完了しようとすると、Amazon S3 は HTTP 500 Internal Server Error エラーを生成します。

マルチパートアップロードオブジェクトでのチェックサムの動作の詳細については、「オブジェクトの整合性をチェックする」を参照してください。

マルチパートアップロードで追加のチェックサムを含むオブジェクトをアップロードするエンドツーエンドの手順については、「チュートリアル: マルチパートアップロードでオブジェクトをアップロードして、データ整合性を検証する」を参照してください。

マルチパートアップロードの同時オペレーション

分散開発環境においては、アプリケーションから同じオブジェクトに対して複数の更新が同時に開始されることもありえます。同じオブジェクトキーを使ってアプリケーションから複数のマルチパートアップロードが開始される可能性もあります。そのようなアップロードごとに、アプリケーションからパートのアップロードが行われ、アップロードの完了リクエストが Amazon S3 に送信されて、オブジェクトが作成されます。バケットで S3 バージョニングが有効になっているときには、マルチパートアップロードを完了するたびに新しいバージョンが作成されます。バージョニングが有効なバケットで、同じオブジェクトキーを使用する複数のマルチパートアップロードを開始した場合、オブジェクトの最新バージョンは、どのアップロードが最後に開始されたか (createdDate) によって決まります。例えば、オブジェクトの CreateMultipartUpload リクエストを午前 10 時に開始し、次に、同じオブジェクトに対する 2 番目の CreateMultipartUpload リクエストを午前 11 時に送信したとします。この場合は、2 番目のリクエストが最後に送信されたため、2 番目のリクエストの後に最初のアップロードが完了したとしても、午前 11 時 のリクエストでアップロードされたオブジェクトが最新バージョンになります。バージョニングが有効になっていないバケットの場合は、マルチパートアップロードの開始から完了までの間に受信された他の何らかのリクエストが優先される可能性もあります。

注記

マルチパートアップロードの開始から完了までの間に受信された他の何らかのリクエストが優先されることもありえます。例えば、あるキーを使ってマルチパートアップロードを開始した後、アップロードが完了しないうちに別のオペレーションによってそのキーが削除されたとします。その場合、オブジェクトを確認できなくても、マルチパートアップロードの完了レスポンスによってオブジェクト作成の成功が示される可能性があります。

マルチパートアップロード中に同じキー名を持つオブジェクトのアップロードを禁止する

アップロード時の条件付き書き込みオペレーションを使用して、バケット内にオブジェクトが存在するかどうかを確認してからオブジェクトを作成できるようになりました。これにより、既存のデータの上書きを阻止できます。条件付き書き込みでは、アップロードする際にバケット内に同じキー名を持つ既存のオブジェクトが存在しないことを検証します。

条件付き書き込みは、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 標準料金で請求されます。CompleteMultibleUpload リクエストのみが、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 サポート

これらのライブラリは、オブジェクトのマルチパートアップロードを容易にする、高レベルの抽象化を実現します。ただし、アプリケーションの必要に応じて REST 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、バケットポリシー、またはユーザーポリシーを使用して割り当てることのできる、さまざまなマルチパートアップロードオペレーションに必要なアクセス許可を次の表に示します。

アクション 必要なアクセス許可

マルチパートアップロードの作成

マルチパートアップロードを作成するには、オブジェクトに対して s3:PutObject アクションを実行するための許可が必要です。

バケット所有者は他のプリンシパルに対して s3:PutObject アクションの実行を許可できます。

Initiate Multipart Upload

マルチパートアップロードを開始するには、オブジェクトに対して s3:PutObject アクションを実行するための許可が必要です。

バケット所有者は他のプリンシパルに対して s3:PutObject アクションの実行を許可できます。

イニシエータ

マルチパートアップロード開始者を識別するコンテナエレメント。イニシエータが AWS アカウント である場合、このエレメントは所有者エレメントと同じ情報を提供します。イニシエータが IAM ユーザーである場合、このエレメントはユーザー ARN と表示名を提供します。

Upload Part

パートをアップロードするには、オブジェクトに対して s3:PutObject アクションを実行するための許可が必要です。

マルチパートアップロードの開始者がオブジェクトのパートをアップロードできるようにするため、バケット所有者はその開始者に対しオブジェクトへの s3:PutObject アクションの実行を許可する必要があります。

パートのアップロード (コピー)

パートをアップロードするには、オブジェクトに対して s3:PutObject アクションを実行するための許可が必要です。既存のオブジェクトからパートをアップロードするので、ソースオブジェクトに対して s3:GetObject を実行するための許可が必要です。

開始者がオブジェクトのパートをアップロードするには、バケット所有者が、開始者にそのオブジェクトでの s3:PutObject アクションの実行を許可する必要があります。

Complete Multipart Upload

マルチパートアップロードを完了するには、オブジェクトに対して s3:PutObject アクションを実行するための許可が必要です。

マルチパートアップロードの開始者がオブジェクトのアップロードを完了できるようにするため、バケット所有者はその開始者に対しオブジェクトへの s3:PutObject アクションの実行を許可する必要があります。

マルチパートアップロードの中止

マルチパートアップロードを停止するには、s3:AbortMultipartUpload アクションを実行するための許可が必要です。

デフォルトでは、バケット所有者とマルチパートアップロードの開始者が、IAM とバケットポリシーの一部として、このアクションの実行を許可されます。開始者が IAM ユーザーである場合、そのユーザーの AWS アカウント もそのマルチパートアップロードを停止できます。VPC エンドポイントポリシーでは、マルチパートアップロードのイニシエータは、s3:AbortMultipartUpload アクションを実行する許可を自動的に取得しません。

このようなデフォルト設定に加え、バケット所有者は他のプリンシパルに対してオブジェクトへの s3:AbortMultipartUpload アクションの実行を許可できます。バケット所有者は任意のプリンシパルに対し、s3:AbortMultipartUpload アクションを実行する権限を無効にすることができます。

パートのリスト

マルチパートアップロードに含まれるパートをリストするには、s3:ListMultipartUploadParts アクションを実行するための許可が必要です。

デフォルトではバケット所有者が、バケットに対する任意のマルチパートアップロードについてパートのリストを許可されています。マルチパートアップロードの開始者は、特定のマルチパートアップロードについてパートのリストを許可されます。マルチパートアップロードの開始者が IAM ユーザーである場合、その IAM ユーザーを管理している AWS アカウント もそのアップロードのパートのリストへのアクセス許可を付与されます。

このようなデフォルト設定に加え、バケット所有者は他のプリンシパルに対してオブジェクトへの s3:ListMultipartUploadParts アクションの実行を許可できます。バケット所有者は任意のプリンシパルに対し、s3:ListMultipartUploadParts アクションを実行する権限を無効にすることもできます。

マルチパートアップロードのリスト

バケットに対して進行中のマルチパートアップロードをリストするには、そのバケットに対して s3:ListBucketMultipartUploads アクションを実行するための許可が必要です。

デフォルト設定に加え、バケット所有者は他のプリンシパルに対してバケットへの s3:ListBucketMultipartUploads アクションの実行を許可できます。

AWS KMS 暗号化および復号関連のアクセス許可

AWS Key Management Service (AWS KMS) MS キーを使用して暗号化を伴うマルチパートアップロードを実行するには、キーの kms:Decrypt および kms:GenerateDataKey アクションに対する許可がリクエスタに必要です。また、CreateMultipartUpload API の kms:GenerateDataKey アクションに対する許可も必要です。さらに、リクエスタには UploadPart および UploadPartCopy API での kms:Decrypt アクションに対する許可が必要になります。マルチパートアップロードを完了する前に、暗号化されたファイル部分からデータを復号して読み取る必要があるため、Amazon S3 にはこれらの許可が必要です。

IAM ユーザーまたはロールが KMS キーと同じ AWS アカウント にある場合、キーポリシーでこれらの許可が必要です。IAM ユーザーまたはロールが KMS キーとは異なるアカウントに属している場合、キーポリシーと IAM ユーザーまたはロールの両方に対する許可が必要です。

ACL アクセス権限とアクセスポリシーのアクセス許可との関係については、ACL アクセス許可とアクセスポリシーのアクセス許可のマッピング を参照してください。IAM ユーザー、グループ、ロール、ベストプラクティスの詳細については、IAM ユーザーガイドの「IAM ID (ユーザー、グループ、ロール)」を参照してください。