其他
大咖专栏 | 如何使用AWS 命令行分段上传大文件
今天这篇文章,是由亚马逊AWS解决方案架构师——蓝勇老师分享。
分段上传的优势主要有以下几点:· 提高吞吐量如果需要上传的文件比较大,使用直接上传方式,效率很低。而使用亚马逊S3分段上传功能,通过并行上传分段以提高吞吐量,能充分利用当前的带宽,提高了上传效率。· 从网络问题中快速恢复如果使用分段上传,某个分段失败了,你只需要重新上传这个分段,将上传文件时由于网络错误所产生的影响降至最低。· 突破S3单文件上传限制当文件大于5GB,你只能将文件分片,然后分段上传。
AWS Secret Access Key:查看用户生成的密钥文件并输入Access Key的值。
Default region name:默认区域名称。这是您希望默认对其进行调用的区域的名称。由于在本用例中我们需要调用北京区域的S3服务,因此请输入cn-north-1。
Default output format:默认输出格式,此格式可以是json、文本或表。如果不指定输出格式,将使用 json。这里我们使用默认的json选项。第二步运行复制命令运行s3 cp命令如下:[ec2-user@ip-192-10-x-xxx data]$ aws s3 cp myvideo.mp4 s3://multiple-upload-test/myvideo.mp4上面我们使用cp命令将myvideo.mp4文件上传到北京区multiple-upload-test存储桶中,输出信息如下:upload: ./myvideo.mp4 to s3://multiple-upload-test/myvideo.mp4在命令运行过程中,你可以看到文件自动被分成多个片段然后分段上传到目标存储通,上传完成后,你就可以在目标存储桶中看到完整的文件。使用aws s3 sync也可以实现自动的分段上传。
启动分段上传后,可以使用list-multipart-uploads命令查看分段上传具体信息,示例如下:aws s3api list-multipart-uploads --bucket multiple-upload-test同样地,当中的bucket为要上传S3的bucket名称,与上述命令一致。返回信息:{ "Uploads": [ { "Initiator": { "DisplayName": "xxxxxxx", "ID": "arn:aws-cn:iam::xxxxxxxx:user/xxxxx" }, "Initiated": "2016-06-24T07:17:28.000Z", "UploadId": "_m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO", "StorageClass": "STANDARD", "Key": "myvideo.mp4", "Owner": { "ID": "9ad8x098aa27467exxxf6f04d5eaxxx6e6e93d5067ba5bdd86dbb68ddb2511bd" } } ]}第四步上传文件分片首先上传第一个分片文件,命令如下:aws s3api upload-part --bucket multiple-upload-test --key myvideo.mp4 --part-number 1 --body myvideo-part-aa --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO其中:bucket:要上传S3的bucket名称;key:要上传文件的名称。part-number:当前上传分片文件的分段编号。(需要注意的是,上传分段时,除了指定上传 ID,还必须指定分段编号。您可以选择 1 和 10000 之间的任意分段编号。分段编号在您正在上传的数据元中唯一地识别分段及其位置。如果您使用之前上传的分段的同一分段编号上传新分段,则之前上传的分段将被覆盖。无论您何时上传分段,Amazon S3 都将在其响应中返回 ETag 标头。对于每个分段上传,您必须记录分段编号和 ETag 值。您需要在随后的请求中包括这些值以完成分段上传。这个参数很重要,当完成所有的分段上传后,S3将按照分段编号从小到大的顺序把分段拼接起来。)body:当前上传分片文件的本地路径。upload-id:初始化分段上传时系统返回的UploadId。 返回信息:{ "ETag": "\"82eba7dcefdb5dd5bc72247c3f5543ca\""}看到返回码ETag则说明上传成功。 同样地,我们继续上传第二个分片文件,命令如下:aws s3api upload-part --bucket multiple-upload-test --key myvideo.mp4 --part-number 2 --body myvideo-part-ab --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO返回信息:{ "ETag": "\"03902e3af09f974cd406f988587d0814\""}上传分段文件后,可以使用list-parts命令查看上传信息:aws s3api list-parts --bucket multiple-upload-test --key myvideo.mp4 --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO返回信息如下:{ "Owner": { "ID": "9ad8c098aa27467ec9ef6f04d5ea97a6e6e93d5067ba5bdd86dbb68ddb2511bd" }, "Initiator": { "DisplayName": "lanyong", "ID": "arn:aws-cn:iam::xxxxxxxxxx:user/xxxxxx" }, "Parts": [ { "LastModified": "2016-06-24T07:34:21.000Z", "PartNumber": 1, "ETag": "\"82eba7dcefdb5dd5bc72247c3f5543ca\"", "Size": 41943040 }, { "LastModified": "2016-06-24T07:39:16.000Z", "PartNumber": 2, "ETag": "\"03902e3af09f974cd406f988587d0814\"", "Size": 36159239 } ], "StorageClass": "STANDARD"}在返回的信息中我们可以查看分段上传的所有者信息以及各分段的详细信息。在下述的完成文件组装中您需要用到各分段的ETag信息,您可以在本条命令的返回中获取。当然,在每次分段上传后也会返回ETag信息,您也可以把他们分别记录下来。第五步完成文件组装所有分段都被上传后,S3需要具体分段信息来重新组装原始文件,需要的内容包括每次上传的分段序号及上传后返回的ETag。每个分段的文件序号和ETag可以从上个命令list-parts中获取。 获取的文件序号和ETag需要使用如下示例格式包装:{"Parts": [ { "ETag": "82eba7dcefdb5dd5bc72247c3f5543ca", "PartNumber": 1 }, { "ETag": "03902e3af09f974cd406f988587d0814", "PartNumber": 2 } ]}将上文本保存为文件,放于当前目录下。然后运行complete-multipart-upload命令完成文件的组装:aws s3api complete-multipart-upload --multipart-upload file://mpustructs --bucket multiple-upload-test --key myvideo.mp4 --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO当中的mpustructs为上述组装文件的文件名,用户可自定义。 返回信息:{ "ETag": "\"45f9fd2960aa026c44eec4618bc592a2-2\"", "Bucket": "multiple-upload-test", "Location": "https://s3.cn-north-1.amazonaws.com.cn/multiple-upload-test/myvideo.mp4", "Key": "myvideo.mp4"}完成分段上传后,Amazon S3 会按分段编号的升序顺序将各个段连接起来,从而创建对象。如果在开始分段上传请求中提供了任何数据元元数据,则 Amazon S3 会将该元数据与数据元相关联。成功完成请求后,分段将不再存在。
需要特别注意的是,启动分段上传并上传一个或多个分段之后,您必须完成或中止分段上传,才能停止收取上传的段的存储费用。只有在完成或中止分段上传之后,Amazon S3 才会释放段存储并停止向您收取段存储费用。具体的段存储费用,请参考AWS官方文档:http://aws.amazon.com/cn/s3/pricing/。
为了防止用户上传分段后没有完成或中止分段所产生的不必要费用,作为最佳实践,AWS建议在分段上传操作中加入存储桶生命周期管理策略,在超过一定时间后,自动中止未完成的分段上传。具体存储桶生命周期策略的设置方法,请参考AWS官方文档:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/mpuoverview.html#mpuploadpricing第六步检查您S3 bucket中的文件上传完成后,请检查您的bucket,你就可以看到文件已成功上传并组装完成了。