【问题标题】:disable checksum rails active storage paperclip migration aws s3禁用校验和轨道活动存储回形针迁移 aws s3
【发布时间】:2019-03-02 14:19:29
【问题描述】:

有没有办法通过活动存储禁用校验和?我正在使用 amazon s3 存储从回形针迁移到主动存储。不与bucket通信就无法获取get md5校验和加密代码,迁移我们生产数据库中的数百万个附件太耗时。校验和列有一个 null: false 约束,删除它会在迁移和上传文件时引发错误,这似乎是不可避免的。我觉得我一定在这里遗漏了一些东西,有什么办法可以避免使用校验和列吗?

【问题讨论】:

  • 我也想知道这一点,如果我找到方法会发布。
  • 我解决这个问题的方法是删除迁移文件中校验和值的 null: false 约束。然后在我的 rake 任务中将校验和设置为 nil 值,将资产从回形针迁移到活动存储。
  • @BenSkiff 您的 rake 任务是什么样的?校验和用于验证下载和上传的数据。它是否影响了您的生产数据?
  • @BenSkiff 我面临同样的问题,并考虑放弃校验和以迁移文件。迁移结束后,您是否因为校验和为零而发现任何问题?
  • @Tashows(和 Blair)在生产中没有遇到禁用校验和的问题。然而,该应用程序大多只在内部使用,并没有特别大的用户群,但仍然没有问题。

标签: ruby-on-rails amazon-web-services md5 checksum rails-activestorage


【解决方案1】:

对于如下所述的某些类型的 S3 对象,Etag 是文件的 MD5 校验和。

“由 PUT 对象、POST 对象或复制操作或通过 AWS 管理控制台创建并通过 SSE-S3 或明文加密的对象具有作为其对象数据的 MD5 摘要的 ETag。 由 PUT 对象、POST 对象或复制操作或通过 AWS 管理控制台创建并由 SSE-C 或 SSE-KMS 加密的对象具有不是其对象数据的 MD5 摘要的 ETag。 如果对象是通过 Multipart Upload 或 Part Copy 操作创建的,则无论采用何种加密方法,ETag 都不是 MD5 摘要”

参考:https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html

如果您的用例与上述匹配,您将能够使用它而不是下载和消化整个文件。

我的代码是这样的:

key = "#{id}/#{filename}"
resp = @s3client.head_object({bucket: @bucket, key: key})
checksum_base64 = [[resp.etag].pack("H*")].pack("m0")

为了获得更好的性能,您可以使用 client#list_objects API 为整个存储桶或子集批量获取 ObjectSummary 记录,并使用这些记录来查找 Etag/校验和。

我还没有用 ActiveSupport 完全测试过这个端到端。 (现在它通常不是 Paperclip 的一个很好的替代品。特别是,目前缺乏对多个存储桶的支持对我们来说有点阻碍)。。 p>

【讨论】:

  • 听起来比我见过的任何一种执行迁移的方法都更好。但我最终只是让校验和为零。
  • Etag 并不总是 MD5 校验和!详情请见docs.aws.amazon.com/AmazonS3/latest/API/…
  • 过去只是分段上传,在这种情况下。现在这已经扩展到其他事情了,但是在一些常见的情况下,比如我们的系统,你仍然可以依赖它。我会修改的。
  • 当然可以,但是当作为多部分上传时,您不能在 Active Storage 中依赖 ETag,因为它稍后会在完整性检查中失败(至少在 5.2.3 中)
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2014-01-05
  • 2012-03-25
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2017-10-01
  • 2014-04-11
相关资源
最近更新 更多