如何使用 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 命令不支持必需的请求参数。
解决方法
在上传文件之前,计算文件的 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 sync 或 aws s3 mv。
您分段上传到 Amazon S3 的对象的 ETag 格式与您使用传统 PUT 请求上传的对象不同。要存储源文件的 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 CLI 与 Amazon S3 结合使用的详细信息,请参阅 AWS CLI S3 配置。
使用低级别 aws s3api 命令
1. 将要上传的文件分成多个分段。
**提示:**如果您使用的是 Linux 操作系统,请使用 split 命令。
2. 运行以下命令启动分段上传并检索相关联的上传 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。确保上传的每个新分段的分段编号依次增加。
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 生命周期操作。或者,使用 aws s3api 命令删除不完整的分段:
1. 运行以下命令列出不完整的分段文件上传。将 --bucket 的值替换为您的桶的名称。
aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-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
相关信息
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前