لا يمكن إعادة البناء بسبب رفع إصدار جيم AWS SDK ووسائل حماية سلامة بيانات AWS الجديدة

مرحباً - أنا بات باترسون، كبير مسؤولي التبشير التقني في Backblaze؛ لقد وصلت إلى هذا الموضوع لأن لدي منتدى Discourse مُستضاف ذاتيًا لإثبات المفهوم، وقد صادفت هذه المشكلة بالضبط اليوم أثناء تكوين منتدى الخاص بي لاستخدام Backblaze B2 للنسخ الاحتياطي والتحميلات.

يُعد تعيين AWS_REQUEST_CHECKSUM_CALCULATION و AWS_RESPONSE_CHECKSUM_CALCULATION إلى WHEN_REQUIRED حلاً بديلاً مفيدًا للحالات الأساسية لتحميل وتنزيل الملفات، ولكن من المفيد معرفة أنه لا يغطي عددًا من السيناريوهات، بما في ذلك:

  • حذف الملفات - يستخدم Discourse عملية S3 DeleteObjects لحذف ملفات متعددة في استدعاء API واحد، كما ينبغي.
  • تحميل الملفات إلى مستودعات تم تمكين قفل الكائنات فيها.

المشكلة هي أن المجموع الاختباري (إما رأس Content-MD5 أو أحد رؤوس المجموع الاختباري الجديدة) مطلوب (بدلاً من مجرد مدعوم) لهذه العمليات، وهذا يتسبب في قيام حزم AWS SDK الحالية بتوفير رأس المجموع الاختباري الجديد. على حد علمي، لا توجد طريقة لتجاوز ذلك وجعل SDK يوفر Content-MD5 كما كان يفعل في السابق.

يعمل مهندسونا على حل كل هذا؛ في هذه الأثناء، أفضل تخفيف هو استخدام الإصدار 1.177.0 أو أقدم من gem aws-sdk-s3.

لقد حاولت تخفيض إصدارات حزمة AWS SDK في نشر PoC الخاص بي عن طريق تحرير 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 كان أمرًا سيئًا.

9 إعجابات