Hallo, ich bin Pat Patterson, Chief Technical Evangelist bei Backblaze. Ich bin auf diesen Thread gestoßen, weil ich ein selbst gehostetes Proof-of-Concept-Discourse-Forum habe und heute genau auf dieses Problem gestoßen bin, als ich mein Forum für Backups und Uploads mit Backblaze B2 konfiguriert habe.
Das Setzen von AWS_REQUEST_CHECKSUM_CALCULATION und AWS_RESPONSE_CHECKSUM_CALCULATION auf WHEN_REQUIRED ist eine hilfreiche Problemumgehung für grundlegende Fälle des Hoch- und Herunterladens von Dateien, aber es ist hilfreich zu wissen, dass dies eine Reihe von Szenarien nicht abdeckt, darunter:
- Löschen von Dateien – Discourse verwendet die S3-Operation
DeleteObjects, um mehrere Dateien in einem einzigen API-Aufruf zu löschen, wie es sein sollte. - Hochladen von Dateien in Buckets mit aktivierter Objektsperre.
Das Problem ist, dass eine Prüfsumme (entweder der Content-MD5-Header oder einer der neuen Prüfsummen-Header) für diese Operationen erforderlich ist (und nicht nur unterstützt wird), und dies veranlasst die aktuellen AWS SDKs, den neuen Prüfsummen-Header bereitzustellen. Soweit ich weiß, gibt es keine Möglichkeit, dies zu überschreiben und das SDK dazu zu bringen, Content-MD5 bereitzustellen, wie es früher der Fall war.
Unsere Ingenieure arbeiten daran, all dies zu lösen. In der Zwischenzeit ist die beste Abhilfemaßnahme die Verwendung der Version 1.177.0 oder früher des Gems aws-sdk-s3.
Ich habe versucht, die Versionen des AWS SDK Gems in meiner PoC-Bereitstellung herunterzustufen, indem ich die Gemfile bearbeitet und Folgendes ersetzt habe:
gem "aws-sdk-s3", require: false
gem "aws-sdk-sns", require: false
durch
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
aber mein bundle-fu ist nicht stark, und ich habe meine Bereitstellung nur mit dem Fehler zum Absturz gebracht:
/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'
...
Ich schätze, ich habe einen wichtigen Schritt verpasst.
Ohne unseren Freunden bei DO etwas Böses zu wollen, haben sie dies getan, indem sie ihren Dienst aktualisiert haben, um die neuen Prüfsummen-Header einfach zu ignorieren, anstatt den API-Aufruf aufgrund der nicht unterstützten Prüfsumme abzulehnen.
Ihr Störungsbericht besagt:
Beachten Sie, dass Spaces derzeit keine Datenintegritätsprüfsummen verifiziert, die vom AWS CLI und den AWS SDKs im Rahmen von Upload-Anfragen gesendet werden.
Wir haben entschieden, dass das einfache Akzeptieren und Speichern von Daten, die möglicherweise nicht mit der vom API-Client bereitgestellten Prüfsumme übereinstimmen, schlecht ist.