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 コマンドが必須のリクエストパラメータをサポートしていない場合です。

解決方法

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

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

高レベルの 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

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

  1. アップロードするファイルを、複数のパートに分割します。
    ヒント: Linux オペレーティングシステムを使用している場合は、split コマンドを使用します。

  2. 次のコマンドを実行して、マルチパートアップロードを開始して、関連付けられたアップロード ID を取得します。

    aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file

    このコマンドは、UploadID を含む応答を返します。

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

  4. 次のコマンドを実行して、ファイルの最初のパートをアップロードします。

    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==
    

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

  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. 以下のコマンドを実行して、マルチパートアップロードを実行します。

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

--multipart-upload の値を、作成した ETag を含む JSON 形式のファイルへのパスに置き換えます。 前のコマンドが成功すると、以下のような応答が表示されます。

{
    "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. 次のコマンドを実行すると、未完了のマルチパートファイルのアップロードをリストできます。

    aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET
    

    --bucket の値をバケット名に置き換えます。

  2. このコマンドは、処理されなかったファイルパートを含む次のようなメッセージを返します。

    {
        "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 "
                }
            }
       ]
    }
  3. 次のコマンドを実行して、未完了のパートを削除します。

    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年前
コメントはありません

関連するコンテンツ