AWS CLI を使用し、大きなファイルを複数に分割して Amazon S3 にアップロードするにはどうすれば良いですか?

所要時間2分
0

大きなファイルを複数に分割して Amazon Simple Storage Service (Amazon S3) バケットにコピー (マルチパートアップロード機能を使用) したいと考えています。ファイルのアップロードには、AWS コマンドラインインターフェイス (AWS) を使用したいと思います。

簡単な説明

AWS CLI を高レベルの aws s3 コマンドまたは低レベルの aws s3api コマンドと共に使用して、大きなファイルを Amazon S3 にアップロードします。これらの 2 つのコマンド階層の詳細については、「Using Amazon S3 with the AWS CLI」を参照してください。

重要: マルチパートアップロードおよびダウンロードには、aws s3 cp などの aws s3 コマンドを使用するのがベストプラクティスです。これは、aws s3 コマンドがファイルサイズに応じてマルチパートアップロードとダウンロードを自動的に実行するためです。aws s3 コマンドが特定のアップロードをサポートしていない場合にのみ、aws s3api コマンド (aws s3api create-multipart-upload など) を使用します。例えば、マルチパートアップロードに複数のサーバーが関係している場合や、マルチパートアップロードを手動で停止して後で再開する場合などです。または、aws s3 コマンドが必須のリクエストパラメータをサポートしていない場合です。

解決方法

ファイルをアップロードする前に、アップロード後の整合性チェックの基準としてファイルの MD5 チェックサム値を計算します。

注: AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

高レベルの aws s3 コマンドを使用

マルチパートアップロードで高レベルの aws s3 コマンドを使用するには、以下のコマンドを実行します。

$ aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/

この例では、オブジェクトが大きい場合にマルチパートアップロードを自動的に実行するコマンド aws s3 cp を使用しています。また、S3 バケットへのオブジェクトのアップロードを行う他の aws s3 コマンドを使用することもできます。例えば、aws s3 syncaws s3 mv などを使用できます。

マルチパートのパーツとして Amazon S3 にアップロードするようなオブジェクトの ETag 形式は、従来の PUT 要求を使用してアップロードするオブジェクトの ETag 形式とは異なります。ソースファイルの MD5 チェックサム値を基準として保存するには、チェックサム値を含んだファイルを、カスタムメタデータとしてアップロードします。MD5 チェックサム値をカスタムメタデータとして追加するには、アップロードコマンドにオプションのパラメータ --metadata md5="examplemd5value1234/4Q" を追加します。

$ aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/ --metadata md5="examplemd5value1234/4Q"

ホストのより多くの帯域幅とリソースを使用するには、AWS CLI 設定で設定された同時リクエストの最大数を増やします。デフォルトでは、AWS CLI は最大 10 個の同時リクエストを使用します。このコマンドは、最大同時リクエスト数を 20 に設定します。

$ aws configure set default.s3.max_concurrent_requests 20

Amazon S3 を使用して AWS CLI を設定する方法の詳細については、「AWS CLI S3 configuration」を参照してください。

低レベルの aws s3api コマンドを使用

  1. アップロードするファイルを、複数のパートに分割します。

ヒント: Linux オペレーティングシステムを使用している場合は、split コマンドを使用します。

  1. 次のコマンドを実行して、マルチパートアップロードを開始して、関連付けられたアップロード ID を取得します。このコマンドは、UploadID を含む応答を返します。
aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file

3.    これ以降の手順で参照できるように UploadID 値をコピーします。

4.    次のコマンドを実行して、ファイルの最初のパートをアップロードします。すべての値をバケット、ファイル、マルチパートアップロードの値に変更します。このコマンドは、アップロードされたファイルの一部である ETag 値を含む応答を返します。各パラメータの詳細については、「upload-part」を参照してください。

aws s3api upload-part --bucket DOC-EXAMPLE-BUCKET --key large_test_file --part-number 1 --body large_test_file.001 --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 exampleaAmjr+4sRXUwf0w==

5.    これ以降の手順で参照できるように ETag 値をコピーします。

6.    ファイルの各パートで手順 4 および 5 を繰り返します。アップロードする新規のパートごとに 1 ずつパート番号を大きくします。

7.    すべてのファイルパートをアップロードしたら、次のコマンドを実行し、アップロードされたパートの一覧を表示して、一覧が完全なものであることを確認します。

aws s3api list-parts --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

8.    アップロードした各ファイルパートの ETag 値を JSON 形式のファイルとしてコンパイルします。

JSON ファイルの例:

{
    "Parts": [{
        "ETag": "example8be9a0268ebfb8b115d4c1fd3",
        "PartNumber":1
    },

    ....

    {
        "ETag": "example246e31ab807da6f62802c1ae8",
        "PartNumber":4
    }]
}

9.    ファイルに fileparts.json という名前を付けます。

10.    以下のコマンドを実行して、マルチパートアップロードを実行します。--multipart-upload の値を、作成した ETag を含む JSON 形式のファイルへのパスに置き換えます。

aws s3api complete-multipart-upload --multipart-upload file://fileparts.json --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

11.    前のコマンドが成功すると、以下のような応答が表示されます。

{
    "ETag": "\\"exampleae01633ff0af167d925cad279-2\\"",
    "Bucket": "DOC-EXAMPLE-BUCKET",
    "Location": "https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/large_test_file",

    "Key": "large_test_file"
}

アップロードの失敗を解決

マルチパートアップロードに高レベルの aws s3 コマンドを使用した場合にアップロードが失敗したときは、新規のマルチパートアップロードを開始する必要があります。マルチパートアップロードの失敗の原因は、タイムアウトまたは手動によるキャンセルです。ほとんどの場合、AWS CLI は自動的にマルチパートアップロードをキャンセルし、作成したマルチパートファイルをすべて削除します。このプロセスには、数分かかる場合があります。aws s3api コマンドを使用してプロセスが中断された場合は、アップロードが未完了のパートが削除され、該当するパートが再アップロードされます。

未完了のパートを削除するには、「AbortIncompleteMultipartUpload lifecycle action」を使用します。または、aws s3api コマンドを使用して未完了のパートを削除します。

1.    次のコマンドを実行すると、未完了のマルチパートファイルのアップロードをリストできます。--bucket の値をバケット名に置き換えます。

aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET
  1. このコマンドは、処理されなかったファイルパートを含む次のようなメッセージを返します。
{
    "Uploads": [
        {

    "Initiator": {
                "DisplayName": "multipartmessage",
                "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    "
            },
            "Initiated": "2016-03-31T06:13:15.000Z",

    "UploadId": "examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-",
            "StorageClass": "STANDARD",

    "Key": "",
            "Owner": {
                "DisplayName": "multipartmessage",

    "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
            }
        }
   ]
}
  1. 次のコマンドを実行して、未完了のパートを削除します。
aws s3api abort-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB

関連情報

Uploading and copying objects using multipart upload

AWS公式
AWS公式更新しました 1年前
コメントはありません