Невозможно пересобрать из-за обновления gem AWS SDK и новых средств защиты целостности данных AWS

Привет, я Пат Паттерсон, главный технический евангелист компании Backblaze. Я наткнулся на эту ветку, так как у меня есть собственный форум Discourse в режиме proof-of-concept, и сегодня при настройке использования Backblaze B2 для резервного копирования и загрузки файлов я столкнулся именно с этой проблемой.

Установка параметров AWS_REQUEST_CHECKSUM_CALCULATION и AWS_RESPONSE_CHECKSUM_CALCULATION в значение WHEN_REQUIRED является полезным обходным решением для базовых случаев загрузки и выгрузки файлов, однако стоит знать, что оно не покрывает ряд сценариев, включая:

  • Удаление файлов — Discourse использует операцию S3 DeleteObjects для удаления нескольких файлов в одном вызове API, как и положено.
  • Загрузку файлов в бакеты с включённой функцией блокировки объектов (object lock).

Проблема заключается в том, что для этих операций требуется (а не просто поддерживается) контрольная сумма (либо заголовок Content-MD5, либо один из новых заголовков контрольных сумм), из-за чего текущие версии AWS SDK автоматически добавляют новый заголовок контрольной суммы. Насколько мне известно, нет способа переопределить это поведение и заставить SDK использовать Content-MD5, как это было раньше.

Наши инженеры работают над решением всех этих вопросов; тем временем лучшей мерой смягчения является использование версии 1.177.0 или более ранней пакета aws-sdk-s3.

Я попытался понизить версии пакетов AWS SDK в своём тестовом развёртывании, отредактировав файл 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, — это плохой подход.