如何使用 AWS CLI 将大文件分段上传到 Amazon S3?

2 分钟阅读
0

我想将大文件分段复制到 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 syncaws 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 官方
AWS 官方已更新 10 个月前