Hola, soy Pat Patterson, Evangelista Técnico Jefe en Backblaze; llegué a este hilo porque tengo un foro de prueba de concepto de Discourse autoalojado y me encontré con este problema exacto hoy mientras configuraba mi foro para usar Backblaze B2 para copias de seguridad y cargas.
Establecer AWS_REQUEST_CHECKSUM_CALCULATION y AWS_RESPONSE_CHECKSUM_CALCULATION en WHEN_REQUIRED es una solución útil para casos básicos de carga y descarga de archivos, pero es útil saber que no cubre una serie de escenarios, que incluyen:
- Eliminar archivos: Discourse está utilizando la operación S3
DeleteObjectspara eliminar varios archivos en una sola llamada API, como debe ser. - Cargar archivos en buckets con el bloqueo de objetos habilitado.
El problema es que una suma de verificación (ya sea la cabecera Content-MD5 o una de las nuevas cabeceras de suma de verificación) es requerida (en lugar de solo admitida) para estas operaciones, y esto hace que los SDKs de AWS actuales proporcionen la nueva cabecera de suma de verificación. Por lo que sé, no hay forma de anular esto y hacer que el SDK proporcione Content-MD5 como solía hacerlo.
Nuestros ingenieros están trabajando para resolver todo esto; mientras tanto, la mejor mitigación es usar la versión 1.177.0 o anterior de la gema aws-sdk-s3.
Intenté degradar las versiones de la gema AWS SDK en mi implementación de PoC editando el Gemfile y reemplazando
gem "aws-sdk-s3", require: false
gem "aws-sdk-sns", require: false
con
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
pero mi bundle-fu no es fuerte, y solo logré romper mi implementación con el error:
/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'
...
Supongo que me perdí algún paso vital.
Sin querer arrojar sombra sobre nuestros amigos de DO, lo hicieron actualizando su servicio para simplemente ignorar las nuevas cabeceras de suma de verificación en lugar de rechazar la llamada API debido a la suma de verificación no admitida.
Su informe de incidente dice:
Tenga en cuenta que Spaces no verifica actualmente las sumas de verificación de integridad de datos enviadas por AWS CLI y AWS SDKs como parte de las solicitudes de carga.
Decidimos que simplemente aceptar y almacenar datos que podrían no coincidir con la suma de verificación que proporcionó el cliente de la API era algo malo.