如何从 AWS Elastic Transcoder 取回转码文件的 ETag / MD5 哈希值?

How can I get the ETag / MD5 hash of a transcoded file back from AWS Elastic Transcoder?

我将 Amazon Elastic Transcoder 与 Lambda 和 Step Functions 结合使用以从 WAV 文件转码 MP3。

我需要将转码后的 MP3 的 MD5 / S3 ETag header 值存储在我的数据库中。

目前我不得不在一个非常慢的单独进程中使用它们来获取它们:

s3_cli = boto3.client("s3",aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY)
s3_resp = s3_cli.head_object(Bucket=bucket, Key=mp3_key)
s3obj_etag = s3_resp['ETag'].replace('"', '')

在实施之前,我希望 Elastic Transcoder 会在作业响应中提供转码后的文件 MD5 哈希值,但我在任何地方都看不到它。

有没有人有任何关于如何更好地解决这个问题的提示,或者我在 response/docs 中遗漏了什么?

I was hoping that Elastic Transcoder would provide the transcoded files ETag in the job response

不幸的是,它没有。

截至目前的 AWS Python Boto3 1.18.60 SDK(或任何其他 SDK,包括 REST API),输出的实体标签 object( s) 未在 job response object.

中的任何地方编辑 return

这很可能是因为实体标记表示 object 的特定版本并且主要用于有效的缓存失效。

Elastic Transcoder 作业不会生成相同输出的多个 版本 ,因此,为什么它会 return ETag 值?如果有人需要 ETag,他们可以从 S3 object.

另一个问题是,如果对大输入有 multi-part 输出会怎样? SDK return 是做什么用的? 列表ETag header 值?您有多个部分,但没有多个版本

此实施将违背 RFC 7232 specification for the ETag header:

An entity-tag is an opaque validator for differentiating between multiple representations of the same resource, regardless of whether those multiple representations are due to resource state changes over time, content negotiation resulting in multiple representations being valid at the same time, or both.


在这种情况下,您的实际问题是您想要 文件的 MD5 哈希值,即使它们是 multi-part.

现在您的代码将用于获取单个文件的 MD5 哈希值,但如果它们是 multi-part,它们不会像您期望的那样对分段上传进行哈希处理。 Amazon 不是计算整个文件的散列,而是计算 每个部分 的散列,然后将其组合成一个散列集作为 ETag header。

这很有意义:他们在收到每个部分时计算其哈希值。在传输完所有部分后,他们组合哈希值而不是尝试通过读取可能达到 AWS object 大小限制 - 5 TB[= 的文件来计算最终的 MD5 哈希值74=]。当您处于 Amazon 的规模时,尝试为每个人的文件生成 MD5 哈希值,您会发现他们的方法非常聪明:)

这可能就是 S3 API Reference 说下面的原因:

The ETag may or may not be an MD5 digest of the object data.

Objects created by either the Multipart Upload or Part Copy operation have ETags that are not MD5 digests, regardless of the method of encryption.

一个MD5散列,但是当它是multi-part上传时不是所以上面是技术上的正确。

要正确计算 multi-part 上传的 MD5 哈希值,请尝试查看这个很棒的 answer in response to "What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?"


总而言之,不幸的是,您在 Amazon Elastic Transcoder 返回的响应中没有 object(s) 的 MD5 摘要散列 - 您必须自己完成这项繁重的工作 &如果您有大文件,可能需要很长时间。

没有解决方法或更快的解决方案 - 您有最快的解决方案,因为您已经以最有效的方式从 HEAD 获取 ETag 值。

我可能会建议在尝试确定文件的最终 MD5 摘要之前尝试并行化为获取 object 的元数据 (s3_cli.head_object(...)) 所做的 HTTP HEAD 请求。

如果您有 500 个文件,那肯定会加快速度 - 不要单独提出 API 请求。

你肯定能够并行发送它们,所以将你在请求之间花费的时间全部转移到亚马逊的基础设施上。

获取回复,然后一起处理。