Satya 向您演示如何
执行到 S3 的
分段消息上传

Satya_s3-multipart-upload-cli-1

我想将一个大文件作为多个部分或使用分段上传复制到 Amazon Simple Storage Service (Amazon S3) 存储桶。如何使用 AWS 命令行界面 (AWS CLI) 执行此操作?

您可以通过 AWS CLI,使用 aws s3 命令(高级别)或 aws s3api 命令(低级别)将大文件上传到 Amazon S3。有关这两个命令层的更多信息,请参阅 结合使用 Amazon S3 与 AWS 命令行界面
 
推荐的方法是使用 aws s3 命令(例如 aws s3 cp)进行上传和下载,因为这些 aws s3 命令会根据文件大小自动执行分段上传和下载。相比之下,只有在 aws s3 命令不支持特定上传需求(例如,当分段上传涉及多个服务器时,手动停止分段上传并稍后恢复)或者 aws s3 命令不支持所需的请求参数时,才应使用 aws s3api 命令(例如 aws s3api create-multipart-upload)。

在上传文件之前,您可以计算文件的 MD5 校验和值,以便在上传后执行完整性检查时作为参考。

(推荐)使用高级别 (aws s3) 命令上传文件

要使用高级别 aws s3 命令执行分段上传,请运行以下命令:

$ aws s3 cp large_test_file s3://exampleawsbucket/

此示例使用命令 aws s3 cp,但其他涉及将对象上传到 S3 存储桶的高级别命令(例如,aws s3 syncws s3 mv)在对象非常大的情况下都会自动执行分段上传。

分段上传到 Amazon S3 的对象具有与使用传统 PUT 请求上传的对象不同的 ETag 格式。要存储源文件的 MD5 校验和值作为参考,您可以选择将带校验和值的文件作为自定义元数据上传。要将 MD5 校验和值添加为自定义元数据,请在上传命令中包含可选参数 --metadata md5="examplemd5value1234/4Q",类似于以下内容:

$ aws s3 cp large_test_file s3://exampleawsbucket/ --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) 命令分段上传文件

重要提示:只有在 aws s3 命令不支持特定上传需求(例如,当分段上传涉及多个服务器时,手动停止分段上传并恢复)或者 aws s3 命令不支持所需的请求参数时,才应使用此 aws s3api 过程。对于其他分段上传,请使用 aws s3 cp 或其他高级别 s3 命令。

1.    将要上传的文件拆分为多个部分。
提示:如果您使用的是 Linux 操作系统,则可使用 split 命令。

2.    运行此命令以启动分段上传并检索关联的上传 ID。该命令会返回一个包含 UploadID 的响应:

aws s3api create-multipart-upload --bucket exampleawsbucket --key large_test_file

3.    复制 UploadID 值,以便在后面的步骤中用作参考。

4.    运行此命令以上传文件的第一部分。请务必使用适合您的存储桶、文件和分段上传的值来替换所有值。该命令会返回一个响应,其中包含您上传的文件部分的 ETag 值。有关每个参数的更多信息,请参阅 upload-part

aws s3api upload-part --bucket exampleawsbucket --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 exampleawsbucket --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

8.    将上传的每个文件部分的 ETag 值编译为类似于以下内容的 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 exampleawsbucket --key large_test_file --upload-id exampleTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

11.    如果上一个命令成功,您会收到类似于下面的响应:

{
    "ETag": "\\"exampleae01633ff0af167d925cad279-2\\"",
    "Bucket": "exampleawsbucket",
    "Location": "https://exampleawsbucket.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 exampleawsbucket

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 exampleawsbucket --key large_test_file --upload-id examplevQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB

此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 访问 AWS 支持中心

发布时间:2016 年 1 月 25 日

更新时间:2018 年 9 月 25 日