AWS CLI を使用し、大きなファイルを複数に分割して Amazon S3 にアップロードするにはどうすれば良いですか?
大きなファイルを複数に分割して 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 sync や aws 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 コマンドを使用
-
アップロードするファイルを、複数のパートに分割します。
ヒント: Linux オペレーティングシステムを使用している場合は、split コマンドを使用します。 -
次のコマンドを実行して、マルチパートアップロードを開始して、関連付けられたアップロード ID を取得します。
aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file
このコマンドは、UploadID を含む応答を返します。
-
れ以降の手順で参照できるように UploadID 値をコピーします。
-
次のコマンドを実行して、ファイルの最初のパートをアップロードします。
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」を参照してください。
-
これ以降の手順で参照できるように ETag 値をコピーします。
-
ファイルの各パートで手順 4 および 5 を繰り返します。アップロードする新規のパートごとに 1 ずつパート番号を大きくします。
-
すべてのファイルパートをアップロードしたら、次のコマンドを実行し、アップロードされたパートの一覧を表示して、一覧が完全なものであることを確認します。
aws s3api list-parts --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk
-
アップロードした各ファイルパートの ETag 値を JSON 形式のファイルとしてコンパイルします。
JSON ファイルの例:{ "Parts": [{ "ETag": "example8be9a0268ebfb8b115d4c1fd3", "PartNumber":1 }, .... { "ETag": "example246e31ab807da6f62802c1ae8", "PartNumber":4 }] }
-
ファイルに fileparts.json という名前を付けます。
-
以下のコマンドを実行して、マルチパートアップロードを実行します。
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 コマンドを使用して未完了のパートを削除します。
-
次のコマンドを実行すると、未完了のマルチパートファイルのアップロードをリストできます。
aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET
--bucket の値をバケット名に置き換えます。
-
このコマンドは、処理されなかったファイルパートを含む次のようなメッセージを返します。
{ "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 " } } ] }
-
次のコマンドを実行して、未完了のパートを削除します。
aws s3api abort-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB
関連情報
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 6年前lg...
- 質問済み 1ヶ月前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 3ヶ月前