如何使用 AWS CLI 将大文件分段上传到 Amazon S3?
我想将大文件分段复制到 Amazon Simple Storage Service (Amazon S3) 存储桶,或者使用分段上传。我想使用 AWS 命令行界面 (AWS CLI) 上传文件。
简短描述
通过 AWS CLI 使用高级别 aws s3 命令或低级别 aws s3api 命令将大文件上传到 Amazon S3。有关这两个命令层的详细信息,请参阅将 Amazon S3 与 AWS CLI 配合使用。
**重要事项:**最佳做法是使用 aws s3 命令(如 aws s3 cp)进行分段上传和下载。这是因为 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 命令进行分段上传,请运行以下 cp 命令:
aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/
注意: 请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称。
上述示例使用命令 aws s3 cp 在对象较大时自动执行分段上传。您还可以使用其他 aws s3 命令将对象上传到 S3 存储桶中。例如,使用 aws s3 sync 或 aws s3 mv。
您分段上传到 Amazon S3 的对象的 ETag 格式与您使用 PUT 请求上传的对象不同。要存储源文件的 MD5 校验和值作为参考,上传文件时,请将校验和值作为自定义元数据。要添加 MD5 校验和值作为自定义元数据,请在上传命令中加入可选参数 --metadata,示例如下:
aws s3 cp large_test_file s3://DOC-EXAMPLE-BUCKET/ --metadata md5="examplemd5value1234"
注意: 请将 large_test_file 替换为要上传的文件名,将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 examplemd5value1234 替换为您的 MD5 值。
要使用更多主机的带宽和资源,请增加 AWS CLI S3 配置中设置的最大并发请求数。默认情况下,AWS CLI 最多使用 10 个并发请求。运行以下 configure 命令将最大并发请求数设置为 20:
aws configure set default.s3.max_concurrent_requests 20
使用 aws s3api 命令
-
将要上传的文件分成多个分段。
**提示:**如果您使用的是 Linux 操作系统,请使用 split 命令。 -
要启动分段上传并检索关联的上传 ID,请运行以下 create-multipart-upload 命令:
aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file注意: 请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 large_test_file 替换为您要上传的文件名称。
该命令会返回一个包含 UploadID 的响应。
-
复制 UploadID 值作为后续步骤的参考。
-
要上传文件的第一个分段,请运行以下 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==注意: 请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 large_test_file 替换为您要上传的文件名称。请将 upload-id 值替换为 create-multipart-upload 命令的输出中的值。
该命令会返回一个响应,其中包含您上传的文件分段的 ETag 值。
-
复制 ETag 值作为后续步骤的参考。
-
对每个文件分段重复步骤 4 和 5。确保上传的每个新分段的分段编号依次增加。
-
上传所有文件分段后,请运行以下 list-parts 命令列出上传的分段并确认列表是否完整:
aws s3api list-parts --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk注意: 请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 large_test_file 替换为您要上传的文件名称。将 upload-id 值替换为 create-multipart-upload 命令的输出中的值。
-
将您上传的每个文件分段的 ETag 值编译为 JSON 格式的文件。
JSON 文件示例:{ "Parts": [{ "ETag": "example8be9a0268ebfb8b115d4c1fd3", "PartNumber":1 }, .... { "ETag": "example246e31ab807da6f62802c1ae8", "PartNumber":4 }] } -
将文件命名为 fileparts.json。
-
要完成分段上传,请运行以下 complete-multipart-upload 命令:
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 格式文件的路径。将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 large_test_file 替换为您要上传的文件名称。将 upload-id 值替换为 list-multipart-uploads 命令的输出中的值。
- 如果上述命令成功,您会收到类似于以下内容的响应:
{ "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 生命周期操作。或者,使用 aws s3api 命令移除未完成的分段。
-
要列出未完成的分段文件上传,请运行以下 list-multipart-uploads 命令:
aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-BUCKET注意: 请将 DOC-EXAMPLE-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 " } } ] } -
要移除未完成的分段,请运行以下 abort-multipart-upload 命令:
aws s3api abort-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB注意: 请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 large_test_file 替换为您要上传的文件名称。将 upload-id 值替换为 list-multipart-uploads 命令的输出中的值。

