如何找到用于在 Amazon S3 上创建现有分段对象的分段大小?



如果文件中有大量零件,很容易找到合适的零件尺寸(因为可能的零件尺寸排列数量有限,并且通常可以假定零件尺寸落在 MiB 或 MB 边界上(。

但是,对于给定的上传,随着部分数量的减少,会出现许多不同的部分大小可能性,并且很难有一个算法来猜测该数量并且耗时来确认计算。

了解段大小非常有用,因为 S3 中用于 ETag 计算的算法仅在有效负载匹配且两个对象在上传期间使用相同的段大小创建时为两个相同的对象生成相同的值。 否则,它将为两个相同的对象生成不同的 ETag 值。 (HTTP 本身并不要求两个相同的对象具有相同的 ETag,但匹配 ETag 值对于完整性验证很有用(。

是否可以了解用于在 S3 中上传现有对象的部分大小?

我将回答我自己的问题,因为这已经困扰了我一段时间,我刚刚找到了解决此问题的方法。对于复制存储桶的内容,我看到的大多数(如果不是全部(解决方案都诉诸于猜测部分大小,并简单地放弃在源存储桶和目标存储桶上具有匹配的 etag 的想法。有趣的是,aws 自己发布了钟楼框架,该框架诉诸于猜测零件号,并且只假设它已被 aws cli 工具复制。

事实证明,有一种记录在案的方法可以做到这一点:aws cli 工具有一个 get-object 和 head-object apis 选项,它允许您指定所需的部件号,如下所示:

aws s3api head-object --bucket YOURBUCKET --key YOURKEY --part-number 1

这将返回如下所示的标头:

{
"AcceptRanges": "bytes", 
"ContentType": "application/octet-stream", 
"LastModified": "Mon, 31 Jul 2017 08:23:11 GMT", 
"ContentLength": 8388608,
"ETag": ""XXXX-6"", 
"ServerSideEncryption": "AES256", 
"PartsCount": 6, 
"Metadata": {}
}

在这种情况下,如您所见,我们通过部分编号 1 的ContentLength标头被告知此上传的部分大小应该是多少:即 8 MB,与用于上传此对象的大小相同......

如果你使用 --debug 标志,你可以看到这是如何在 REST 世界中完成的:他们只是添加一个 url 参数 partNumber=1

aws --debug s3api head-object --bucket YOURBUCKET --key YOURKEY --part-number 1
....
2017-07-31 16:21:46,968 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=HeadObject) (verify_ssl=True) with params: 
{'body': '', 'url': u'https://s3.amazonaws.com/YOURKEY/?partNumber=1', 
'headers': {'User-Agent': 'aws-cli/1.11.127 Python/2.7.12 Linux/4.4.35-33.55.amzn1.x86_64 botocore/1.5.90'}, 
'context': {'auth_type': None, 'client_region': 'us-east-1', 'signing': {'bucket': u'YOURBUCKET'}, 'has_streaming_input': False, 'client_config': <botocore.config.Config object at 0x7f20a8e1ff50>}, 
----->  'query_string': {u'partNumber': 1},   <-----
'url_path': u'/YOURBUCKET/YOURKEY', 'method': u'HEAD'}
....

接下来是弄清楚如何对此类 URL 进行签名。aws cli 命令"aws s3 presign" 无法执行此操作。

最新更新