由于AWS SDK gem版本升级和新的AWS数据完整性保护,无法重建

您好 - 我是 Pat Patterson,Backblaze 的首席技术布道师;我之所以来到这个帖子,是因为我有一个自托管的 Discourse 论坛概念验证,并且在今天配置我的论坛使用 Backblaze B2 进行备份和上传时,恰好遇到了这个问题。

AWS_REQUEST_CHECKSUM_CALCULATIONAWS_RESPONSE_CHECKSUM_CALCULATION 设置为 WHEN_REQUIRED 是上传和下载文件的基本情况的一个有用的解决方法,但需要知道的是,它并不涵盖许多场景,包括:

  • 删除文件 - Discourse 使用 DeleteObjects S3 操作一次 API 调用删除多个文件,这是正确的做法。
  • 上传对象锁定启用的存储桶中的文件。

问题在于,这些操作需要(而不仅仅是支持)一个校验和(Content-MD5 标头或新的校验和标头之一),这会导致当前的 AWS SDK 提供新的校验和标头。据我所知,没有办法覆盖这一点,让 SDK 提供像以前一样的 Content-MD5

我们的工程师正在努力解决所有这些问题;在此期间,最好的缓解方法是使用 aws-sdk-s3 gem 的版本 1.177.0 或更早版本。

我尝试通过编辑 Gemfile 并将以下内容替换为:

gem "aws-sdk-s3", require: false
gem "aws-sdk-sns", require: false

替换为:

gem "aws-sdk-core", "~> 3.215.1", require: false
gem "aws-sdk-kms", "~> 1.96.0", require: false
gem "aws-sdk-s3", "~> 1.177.0", require: false
gem "aws-sdk-sns", "~> 1.92.0", require: false

但我对 bundle 的掌握不够好,只成功地通过以下错误破坏了我的部署:

/var/www/discourse/config/initializers/100-sidekiq.rb:69:in `<main>': undefined method `logger=' for module Sidekiq (NoMethodError)

  Sidekiq.logger = Logger.new(nil)
         ^^^^^^^^^
	from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2.1/lib/rails/engine.rb:689:in `load'
	from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2.1/lib/rails/engine.rb:689:in `block in load_config_initializer'
...

我猜我错过了一些重要的步骤。

我不希望给我们在 DO 的朋友泼冷水,他们是通过更新他们的服务来做到这一点的,即简单地忽略新的校验和标头,而不是因为不支持的校验和而拒绝 API 调用。

他们的事件报告 说:

请注意,Spaces 目前不验证 AWS CLI 和 AWS SDK 在上传请求中发送的数据完整性校验和。

我们认为简单地接受和存储可能与 API 客户端提供的校验和不匹配的数据是不好的。

9 个赞