跳至内容

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

3 分钟阅读
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 命令不支持必需的请求参数。

解决方法

**注意:**如果在运行 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 syncaws 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 命令

  1. 将要上传的文件分成多个分段。
    **提示:**如果您使用的是 Linux 操作系统,请使用 split 命令。

  2. 要启动分段上传并检索关联的上传 ID,请运行以下 create-multipart-upload 命令:

    aws s3api create-multipart-upload --bucket DOC-EXAMPLE-BUCKET --key large_test_file

    注意: 请将 DOC-EXAMPLE-BUCKET 替换为您的存储桶名称,并将 large_test_file 替换为您要上传的文件名称。

    该命令会返回一个包含 UploadID 的响应。

  3. 复制 UploadID 值作为后续步骤的参考。

  4. 要上传文件的第一个分段,请运行以下 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 值。

  5. 复制 ETag 值作为后续步骤的参考。

  6. 对每个文件分段重复步骤 4 和 5。确保上传的每个新分段的分段编号依次增加。

  7. 上传所有文件分段后,请运行以下 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 命令的输出中的值。

  8. 将您上传的每个文件分段的 ETag 值编译为 JSON 格式的文件。
    JSON 文件示例:

    {
        "Parts": [{
            "ETag": "example8be9a0268ebfb8b115d4c1fd3",
            "PartNumber":1
        },
    
        ....
    
        {
            "ETag": "example246e31ab807da6f62802c1ae8",
            "PartNumber":4
        }]
    }
  9. 将文件命名为 fileparts.json

  10. 要完成分段上传,请运行以下 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 命令的输出中的值。

  1. 如果上述命令成功,您会收到类似于以下内容的响应:
{
    "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. 要列出未完成的分段文件上传,请运行以下 list-multipart-uploads 命令:

    aws s3api list-multipart-uploads --bucket DOC-EXAMPLE-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. 要移除未完成的分段,请运行以下 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 命令的输出中的值。

相关信息

在 Amazon S3 中以分段上传方式上传和复制对象

AWS 官方已更新 9 个月前