こんにちは。Backblaze の最高技術エバンジェリスト、パット・パターソンです。このスレッドにたどり着いたのは、セルフホスト型の Discourse フォーラムの概念実証を構築しており、Backblaze B2 をバックアップやアップロードに使用するようにフォーラムを設定している際に、まさにこの問題に遭遇したからです。
AWS_REQUEST_CHECKSUM_CALCULATION と AWS_RESPONSE_CHECKSUM_CALCULATION を WHEN_REQUIRED に設定することは、ファイルのアップロードとダウンロードの基本的なケースでは役立つ回避策ですが、これではカバーできないシナリオがいくつかあることを知っておくと役立ちます。それらには以下が含まれます。
- ファイルの削除 - Discourse は、S3 の
DeleteObjects操作を使用して、複数のファイルを 1 回の API 呼び出しで削除しています。これは正しい方法です。 - オブジェクトロックが有効になっているバケットへのファイルのアップロード。
問題は、これらの操作ではチェックサム(Content-MD5 ヘッダーまたは新しいチェックサムヘッダーのいずれか)が(単にサポートされているだけでなく)必須であり、これにより現在の AWS SDK が新しいチェックサムヘッダーを提供するということです。私の知る限り、これをオーバーライドして、SDK が以前のように Content-MD5 を提供させる方法はありません。
エンジニアがこれらの問題を解決するために取り組んでいます。それまでの間、最善の軽減策は、aws-sdk-s3 gem のバージョン 1.177.0 以前を使用することです。
PoC デプロイメントで AWS SDK gem のバージョンをダウングレードしようと、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 クライアントが提供したチェックサムと一致しない可能性のあるデータを単に受け入れて保存することは悪いことだと判断しました。