Não é possível reconstruir devido ao aumento da versão da gem AWS SDK e às novas Proteções de Integridade de Dados da AWS

Olá, sou Pat Patterson, Evangelista Técnico Chefe da Backblaze; cheguei a este tópico porque tenho um fórum Discourse de prova de conceito auto-hospedado e, por acaso, me deparei com exatamente este problema hoje ao configurar meu fórum para usar o Backblaze B2 para backups e uploads.

Definir AWS_REQUEST_CHECKSUM_CALCULATION e AWS_RESPONSE_CHECKSUM_CALCULATION como WHEN_REQUIRED é uma solução alternativa útil para casos básicos de upload e download de arquivos, mas é útil saber que isso não cobre uma série de cenários, incluindo:

  • Exclusão de arquivos - O Discourse está usando a operação S3 DeleteObjects para excluir vários arquivos em uma única chamada de API, como deveria.
  • Upload de arquivos para buckets com bloqueio de objetos ativado.

O problema é que um checksum (seja o cabeçalho Content-MD5 ou um dos novos cabeçalhos de checksum) é exigido (em vez de apenas suportado) para essas operações, e isso faz com que os SDKs AWS atuais forneçam o novo cabeçalho de checksum. Pelo que sei, não há como substituir isso e fazer com que o SDK forneça Content-MD5 como fazia antes.

Nossos engenheiros estão trabalhando para resolver tudo isso; enquanto isso, a melhor mitigação é usar a versão 1.177.0 ou anterior do gem aws-sdk-s3.

Eu tentei fazer o downgrade das versões do gem AWS SDK em minha implantação de PoC editando o Gemfile e substituindo

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

por

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

mas meu bundle-fu não é forte, e só consegui quebrar minha implantação com o erro:

/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'
...

Acho que perdi alguma etapa vital.

Sem querer lançar sombra sobre nossos amigos da DO, eles fizeram isso atualizando seu serviço para simplesmente ignorar os novos cabeçalhos de checksum em vez de rejeitar a chamada de API devido ao checksum não suportado.

O relatório de incidente deles diz:

Observe que o Spaces atualmente não verifica checksums de integridade de dados enviados pelo AWS CLI e SDKs AWS como parte das solicitações de upload

Decidimos que simplesmente aceitar e armazenar dados que podem não corresponder ao checksum fornecido pelo cliente da API era uma coisa ruim.

9 curtidas