マルチパート・アップロードの使用

Oracle Cloud Infrastructure Object Storageサービスは、特にラージ・オブジェクトのより効率的で回復力のあるアップロードのためのマルチパート・アップロードをサポートしています。APIソフトウェア開発キットとコマンドライン・インタフェースまたはコマンドライン・インタフェース(CLI)を使用して、マルチパート・アップロードを実行できます。コンソールでは、マルチパート・アップロードを使用して、64MiBより大きいオブジェクトをアップロードします。

マルチパート・アップロードでは、オブジェクトの個々のパートを並行してアップロードすることで、アップロードに費やす時間を短縮できます。APIを介して実行されるマルチパート・アップロードでは、オブジェクトのアップロード全体を再試行するのではなく、失敗したパートのアップロードを再試行できるため、ネットワーク障害による影響を最小限に抑えることもできます。

マルチパート・アップロードは、単一のアップロード操作に対して大きすぎるオブジェクトに対応できます。100 MiBを超えるオブジェクトをアップロードする場合にはマルチパート・アップロードを実行することをお薦めします。アップロードされるオブジェクトの最大サイズは10 TiBです。オブジェクト・パートは50 GiB以下である必要があります。APIを介して実行される大規模なアップロードの場合、個々のパートのアップロード間で一時停止し、スケジュールとリソースが許すときにアップロードを再開する柔軟性があります。

オブジェクト・ライフサイクル・ポリシー・ルールを使用して、コミットされていないか失敗したマルチパート・アップロードを、指定した日数後に自動的に削除できます。詳細は、オブジェクト・ライフサイクル管理の使用を参照してください。

必須IAMポリシー

Oracle Cloud Infrastructureを使用するには、管理者が記述するポリシー で、コンソールまたはSDK、CLIまたはその他のツールを使用したREST APIのどれを使用しているかにかかわらず、必要なアクセスのタイプを付与されている必要があります。アクションを実行しようとしたときに、権限がない、または認可されていないというメッセージが表示された場合は、付与されているアクセスのタイプと作業するコンパートメントを管理者に確認してください。

ポリシーに慣れていない場合は、ポリシーの開始および共通ポリシーを参照してください。

管理者の場合:

  • 指定したIAMグループで、テナンシのすべてのコンパートメント内のオブジェクト・ストレージのネームスペース、バケット、およびそれらに関連付けられたオブジェクトを管理するポリシーを作成できます:

    Allow group <IAM_group_name> to manage object-family in tenancy
  • または、アクセスの範囲を狭くするポリシーを作成できます。たとえば、指定したグループがテナンシの特定のコンパートメント内のバケットとオブジェクトのみを管理するようにするには:

    Allow group <IAM_group_name> to manage buckets in compartment <compartment_name>
重要

より限定的なポリシーを記述する場合は、マルチパート・アップロードに必要な権限が含まれていることを確認してください。ユーザーには、OBJECT_CREATEおよびOBJECT_OVERWRITEの両方の権限を付与するポリシーが必要です。

ポリシーを記述するための他の代替手段の詳細は、オブジェクト・ストレージ、アーカイブ・ストレージおよびデータ転送の詳細を参照してください。

マルチパート・アップロードAPIの使用

APIを使用して実行されるマルチパート・アップロードは、次のステップで構成されます:

  1. アップロードの開始
  2. オブジェクト・パートのアップロード
  3. アップロードのコミット

マルチパート・アップロードAPIを使用する前に、アップロードするパートを作成する必要があります。オブジェクト・ストレージは、残りのステップのAPI操作を提供します。また、サービスでは、進行中のマルチパート・アップロードのリスト表示、進行中のマルチパート・アップロードのオブジェクト・パートのリスト表示、およびAPIを介して開始された進行中のマルチパート・アップロードの中断を行うためのAPI操作も提供します。 ここでは、APIのステップの概要を示しますが、サポートされているAPIコールの詳細は、APIリファレンスを参照してください。

オブジェクト・パートの作成

マルチパート・アップロードでは、アップロードするオブジェクトを個々のパートに分割します。個々のパートは、50 GiB程度の大きさにすることができます。各パートに使用するパート番号を決定します。パート番号は1から10,000の範囲です。連続した番号を割り当てる必要はありませんが、オブジェクト・ストレージは、パート番号を昇順に並べることでオブジェクトを構築します。

アップロードの開始

オブジェクト・パートの作成が終了したら、CreateMultipartUpload REST APIコールを実行してマルチパート・アップロードを開始します。オブジェクト名および任意のオブジェクト・メタデータを指定します。オブジェクト・ストレージは、このマルチパート・アップロードに関連するすべてのリクエストに含める必要がある一意のアップロードIDで応答します。また、オブジェクト・ストレージは、アップロードをアクティブとしてマークします。アップロードは、明示的にコミットするか中断するまでアクティブなままです。

オブジェクト・パートのアップロード

オブジェクト・パートのアップロードごとにUploadPartリクエストを実行します。リクエスト・パラメータで、オブジェクト・ストレージネームスペース、バケット名、アップロードIDおよびパート番号を指定します。リクエスト本文にオブジェクト・パートを含めます。オブジェクト・パートは、並行して、任意の順序でアップロードできます。アップロードをコミットすると、オブジェクト・ストレージでは、パート番号を使用してオブジェクト・パートを順序付けします。パート番号は連続している必要はありません。同じアップロードIDとパート番号を使用して複数のオブジェクト・パートがアップロードされた場合、最後のアップロードでパートが上書きされ、CommitMultipartUpload APIをコールするとコミットされます。

オブジェクト・ストレージは、アップロードされた各パートに対してETag (エンティティ・タグ)値を返します。アップロードをコミットする際は、各パートのパート番号と対応するETag値の両方が必要です。

ネットワークの問題がある場合は、個々のパートに対して失敗したアップロードを再開できます。アップロード全体を再開する必要はありません。なんらかの理由でアップロードを一度に実行できない場合は、マルチパート・アップロードを使用すると、自分のペースでパートのアップロードを続行できます。マルチパート・アップロードはアクティブなままですが、合計数が10,000未満であれば、パートを追加し続けることができます。

アップロードされたすべてのパートをリストすることにより、アクティブなマルチパート・アップロードを確認できます。(アクティブなマルチパート・アップロードで、個々のオブジェクト・パートの情報をリストすることはできません。)ListMultipartUploadParts操作には、オブジェクト・ストレージ・ネームスペース、バケット名およびアップロードIDが必要です。オブジェクト・ストレージは、指定されたアップロードIDに関連付けられているパートに関する情報で応答します。パート情報には、パート番号、ETag値、MD5ハッシュおよびパート・サイズ(バイト)が含まれます。

同様に、複数のマルチパート・アップロードが同時に行われている場合は、進行中のアップロードを確認できます。ListMultipartUploads APIコールを実行して、指定されたオブジェクト・ストレージ・ネームスペースとバケット内のアクティブなマルチパート・アップロードをリストします。

データをアップロードすると、パート・ストレージの料金が発生し始めます。

アップロードのコミット

すべてのオブジェクト・パートをアップロードしたら、アップロードをコミットします。CommitMultipartUploadリクエスト・パラメータを使用して、オブジェクト・ストレージ・ネームスペース、バケット名およびアップロードIDを指定します。リクエストの本文に、各パートのパート番号と対応するETag値を含めます。アップロードをコミットすると、オブジェクト・ストレージは構成部分からオブジェクトを構築します。オブジェクトは、指定されたバケットおよびオブジェクト・ストレージ・ネームスペースに格納されます。他のオブジェクトと同様に処理できます。ガベージ・コレクションでは、アップロードしたがCommitMultipartUploadリクエストに含めなかったパート番号で占有されているストレージ・スペースが解放されます。

完了したアップロードからパートをリストまたは取得することはできません。完了したアップロードからパートを追加または削除することもできません。このような場合は、新規アップロードを開始することでオブジェクトを置換できます。

マルチパート・アップロードをコミットせずに中断する場合、進行中のパートのアップロードが完了するまで待機してから、AbortMultipartUpload操作を使用します。いずれにせよ、パートのアップロードの進行中にアップロードを中断すると、オブジェクト・ストレージは、完了したパートと進行中のパートの両方をクリーンアップします。中断されたマルチパート・アップロードのアップロードIDは再利用できません。

APIドキュメント

APIの使用およびリクエストの署名の詳細は、REST APIおよびセキュリティ資格証明を参照してください。SDKの詳細は、ソフトウェア開発キットとコマンドライン・インタフェースを参照してください。

次の操作を使用して、マルチパート・アップロードを管理します:

CLIの使用

CLIを使用してマルチパート・アップロードを実行する場合は、APIで行う必要があるときにオブジェクトをパートに分割する必要はありません。かわりに、選択したパートのサイズを指定すると、オブジェクト・ストレージでは、オブジェクトがパートに分割され、すべてのパートのアップロードが自動的に実行されます。並行してアップロードできるパートの最大数を設定できます。デフォルトでは、CLIは、並行してアップロードできるパートの数を3つに制限しています。CLIを使用する場合、アップロードの完了時にコミットを実行する必要はありません。

CLIを使用して、進行中のマルチパート・アップロードをリストしたり、APIを介して開始されたマルチパート・アップロードを中断することもできます。

CLIの使用についての詳細は、コマンドライン・インタフェース(CLI)を参照してください。CLIコマンドで使用できるフラグおよびオプションの完全なリストは、コマンドライン・リファレンスを参照してください。

CLIを使用してマルチパート・アップロードを実行するには

オブジェクトをアップロードするには、コマンド・プロンプトを開き、--part-sizeフラグを指定してoci os object putを実行します。--part-size値は、各パートのサイズをメビバイト(MiBs)で表します。オブジェクト・ストレージは、最後にアップロードされたパートの最小パート・サイズ制限を免除します。--part-size値は整数である必要があります。

オプションで、--parallel-upload-countフラグを使用して、許可される並行アップロードの最大数を設定できます。

oci os object put --namespace <object_storage_namespace> -bn <bucket_name> --file <file_location> --name <object_name> --part-size <upload_part_size_in_MB> --parallel-upload-count <maximum_number_parallel_uploads>

例:

oci os object put --namespace MyNamespace -bn MyBucket --file ~/path/to/file --name MyObject --parallel-upload-count 10 --part-size 500
Upload ID: 277ffff5-e1b5-e81d-5f81-c374a8f33998
Split file into 12 parts for upload.
Uploading object ################################### 100%
{ "etag": "861c8341-74d8-4142-8da4-28e1ce7783ba", "last-modified": "Wed, 25 Sep 2019 19:59:15 GMT", "opc-multipart-md5": "9Qn1eyou2yMiyOO9Bc7o1A==-12" } 

oci os object putコマンドの詳細は、オブジェクトをバケットにアップロードするにはを参照してください。

未完了または失敗したマルチパート・アップロードのパートをリストするには
oci os multipart list -ns <object_storage_namespace> -bn <bucket_name>

例:

oci os multipart list --bucket-name MyBucket{
  "data": [
    {
      "bucket": "MyBucket",
      "namespace": "MyNamespace",
      "object": "MyObject",
      "time-created": "2019-07-25T21:55:21.973000+00:00",
      "upload-id": "0b7abd48-9ff2-9d5f-2034-63a02fdd7afa"
    },
    {
      "bucket": "MyBucket",
      "namespace": "MyNamespace",
      "object": "MyObject",
      "time-created": "2019-07-25T21:53:09.246000+00:00",
      "upload-id": "1293ac9d-83f8-e055-a5a7-d1e13277b5c0"
    },
    {
      "bucket": "MyBucket",
      "namespace": "MyNamespace",
      "object": "MyObject",
      "time-created": "2019-07-25T21:46:34.981000+00:00",
      "upload-id": "33e7a875-9e94-c3bc-6577-2ee5d8226b53"
    }
...
ヒント

リスト出力のページ区切りを制御するコマンド・オプションについては、コマンドライン・リファレンスを参照してください。
コミットされていないか失敗したマルチパート・アップロードの1つのパートを削除するには
oci os multipart abort -ns <object_storage_namespace> -bn <bucket_name> --object-name <object_name> --upload-id <upload_ID>

例:

oci os multipart abort --bucket-name MyBucket --object-name MyObject --upload-id 0b7abd48-9ff2-9d5f-2034-63a02fdd7afa
WARNING: Are you sure you want to permanently remove this incomplete upload? [y/N]: y
ヒント

CLIインタフェースから、削除リクエストの確認を求められます。確認プロンプトを表示せずに削除するには、--forceフラグを使用します。

コミットされていないか失敗したマルチパート・アップロードを自動的に削除するライフサイクル・ポリシーを作成することもできます。詳細は、オブジェクト・ライフサイクル管理の使用を参照してください。

コミットされていないか失敗したマルチパート・アップロードの複数のパートを削除するには
#!/bin/bash

BUCKET=$1

oci os multipart list --bucket-name $BUCKET | \
    jq -c '.data | map({'o': .object, 'i': ."upload-id"}) | .[]' | \
    while read JSON; do
        OBJECTNAME=$(echo $JSON | jq '.o' | sed -e 's/\"//g;')
        UPLOADID=$(echo $JSON | jq '.i' | sed -e 's/\"//g;')
        echo Removing Object name $OBJECTNAME, ID $UPLOADID
        oci os multipart abort --bucket-name $BUCKET \
                --object-name $OBJECTNAME \
                --upload-id $UPLOADID \
                --force
    done

コミットされていないか失敗したマルチパート・アップロードを自動的に削除するライフサイクル・ポリシーを作成することもできます。詳細は、オブジェクト・ライフサイクル管理の使用を参照してください。