【问题标题】:How can I get the ETag / MD5 hash of a transcoded file back from AWS Elastic Transcoder?如何从 AWS Elastic Transcoder 获取转码文件的 ETag / MD5 哈希?
【发布时间】:2021-10-01 10:50:26
【问题描述】:

我将 Amazon Elastic Transcoder 与 Lambda 和 Step Functions 结合使用,对 WAV 文件中的 MP3 进行转码。

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

目前我不得不在一个单独的过程中使用这些来获取这些,这真的很慢:

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 哈希,但我在任何地方都看不到。

有没有人对如何更好地解决这个问题有任何提示,或者我在响应/文档中遗漏了什么?

【问题讨论】:

  • 您是批量获取 ETag 吗?当 Elastic Transcoder 上传 S3 文件时,为什么不触发 Lambda 为您执行此操作?
  • 是的,我已经通过我上面描述的单独过程来做到这一点。只是很慢。我现在也遇到了转码器将更大的文件作为多部分传送的问题,因此 etag 与 MD5 不匹配。

标签: python amazon-web-services aws-lambda aws-step-functions amazon-elastic-transcoder


【解决方案1】:

我希望 Elastic Transcoder 会在作业响应中提供转码文件 ETag

很遗憾,它没有。

从当前的 AWS Python Boto3 1.18.60 开发工具包(或任何其他开发工具包,包括 REST API)开始,输出对象的实体标签不会在 job response object 中的任何位置返回。


这很可能是因为实体标签代表对象的特定版本,主要用于有效的缓存失效。

Elastic Transcoder 作业不会产生相同输出的多个版本,因此,为什么它会返回 ETag 值?如果有人需要 ETag,他们可以从 S3 对象中获取。

另一个问题是,如果有大量输入的多部分输出会发生什么? SDK 返回什么? ETag 标头值的列表?你有多个部分,但你没有多个版本

此实现将违反RFC 7232 specification for the ETag header

实体标签是不透明的验证器 区分相同的多个表示 资源,无论这些多重表示是否 由于资源状态随时间变化,内容协商 导致多个表示同时有效, 或两者兼而有之。


在这种情况下,您的实际问题是您想要文件的 MD5 哈希,即使它们是多部分的。

现在您的代码可以获取单个文件的 MD5 散列,但如果它们是多部分的,它们不会像您期望的那样散列多部分上传。 Amazon 不是计算整个文件的哈希值,而是计算 每个部分 的哈希值,然后将其组合成一个哈希集作为 ETag 标头。

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

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

ETag 可能是也可能可能不是对象数据的 MD5 摘要

分段上传或部分复制操作创建的对象具有不是 MD5 摘要的 ETag,无论加密方法如何。

一个 MD5 哈希,但是当它是一个多部分上传时它 不是所以上面的技术是正确的。

要正确计算多部分上传的 MD5 哈希,请尝试查看这个很棒的 answer 以响应 "What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?"


总而言之,很遗憾,您在从 Amazon Elastic Transcoder 返回的响应中没有对象的 MD5 摘要哈希 - 您必须自己完成这项繁重的工作,如果您这样做可能需要很长时间有很大的文件。

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

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

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

您肯定能够并行发送它们,因此将您在请求之间花费的时间全部转移到 Amazon 的基础架构上。

获取响应,然后一起处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2010-11-25
    • 2019-03-17
    • 2016-06-24
    相关资源
    最近更新 更多