أمازون S3 هي خدمة قوية للغاية في قلب خدمات أمازون ويب سيرفيسز. ومع ذلك، خارج بيئة الإنتاج، قد يكون من الصعب العمل مع S3 خارج بيئة الإنتاج. فهي تنطوي على تمرير مفاتيح الوصول، وتوفير حسابات المستخدمين، والحفاظ على اتصال شبكة موثوق به - ناهيك عن أنها تكلف أموالاً. FakeS3 هو خادم خفيف الوزن يحاكي سلوك S3 الحقيقي. فهو يستجيب للمكالمات نفسها التي يستجيب لها Amazon S3 ويخزن الملفات التي تم تحميلها في نظام الملفات المحلي الخاص بك - لا توجد طلبات إلى خدمة أمازون. على الرغم من أن الجوهرة لا تدعم المجموعة الكاملة لأوامر S3، إلا أن واجهة برمجة التطبيقات المنفذة كافية لمعظم حالات استخدام التطبيقات.
في هذه المقالة سأقوم بتقديم نهج دمج AWS و FakeS3 مع Paperclip - مكتبة مرفقات الملفات الشائعة للسجل النشط. يوفر دمج Paperclip و S3 معًا نظامًا فعالًا لتخزين الملفات يجمع بين ميزات Paperclip الأساسية المفيدة (مثل إدارة عمليات التحقق من الصحة وتحويلات الصور) مع مزايا التخزين عبر الإنترنت. على الرغم من أن تكوين هذه الأدوات ليس واضحًا ويتطلب البحث في الوثائق التفصيلية بالإضافة إلى حل العديد من المشكلات الخاصة بالأحجار الكريمة، إلا أن الأمر يستحق قضاء بعض الوقت في جعل التطوير أسرع وأكثر كفاءة.
ما هو هدفنا؟
يتطلب دمج الأدوات الموصوفة ثلاث خطوات:
- تشغيل خادم S3 المزيف المقدم من جوهرة FakeS3 المزيفة في الخلفية.
- تكوين عميل AWS S3 لتفويض جميع الطلبات إلى خادم مزيف تم إطلاقه.
- تهيئة مشبك الورق لاستخدام نقطة نهاية S3 وهمية في عناوين URL المورد المبنية.
التركيب
لنبدأ بتثبيت الجواهر المطلوبة:
# Gemfile
جوهرة "مشبك الورق"
جوهرة "aws-sdk", "~> 1.6"
الجوهرة "fakes3"، المجموعة: [:تطوير، :اختبار]
تأكد من تثبيت الإصدار 1.6 من aws-sdk. لا يعمل مشبك الورق الذي يستخدم SKD لإدارة التخزين في خدمة Amazon بشكل جيد مع الإصدارات الأعلى من هذه الجوهرة. ويرجع ذلك إلى التغييرات الكبيرة التي طرأت على واجهة برمجة التطبيقات SDK التي تم جلبها مع الإصدار 2.0.
تذكر أيضًا أن الهدف الرئيسي من FakeS3 هو تقليل تبعيات وقت التشغيل. إنها أكثر من أداة تطوير لاختبار استدعاءات S3 في الكود بدلاً من خادم إنتاج يتطلع إلى تكرار وظيفة S3. لذلك يجب عليك تضمين الجوهرة في مجموعة التطوير والاختبار فقط.
تكوين AWS
توفر AWS SDK طريقة مساعدة مخصصة مسؤولة عن تحميل التكوين. سيقوم افتراضيًا بتحميل التكوين من config/aws.yml
واستخراج معلمات البيئة الحالية وتمريرها إلى عميل AWS. أولاً، قم باستدعاء الطريقة التالية في المُهيئ:
# config/initializers/aws.rb
AWS:::Rails.load_yaml_config
والآن، بعد أن أصبح لدينا ملف تهيئة يتم تحميله بشكل صحيح، يمكننا المتابعة في تحديد محتواه:
# config/aws.yml
التطوير: &التطوير
Access_key_ID: "abc"
مفتاح_الوصول_السري: "abc": "abc"
نقطة النهاية s3: "المضيف المحلي"
s3_port: 10001
s3_فورس_باث_ستايل: صحيح
استخدام_ssl: خطأ
اختبار: *تطوير
دعونا نناقش جميع المعلمات واحدة تلو الأخرى:
مفتاح_مفتاح_الوصول_المعرف، مفتاح_الوصول_السري
- بيانات اعتماد عميل AWS المطلوبة للوصول إلى حساب Amazon الخاص بك. يتم تجاهلها من قبل خادم S3 المزيف وبالتالي القيم المخصصة في بيئات وضع الحماية.نقطة النهاية s3_endpoint, s3_port
- مواصفات نقطة نهاية S3. نحن نستخدم هذه المعلمات لاستبدال نقطة نهاية S3 الحقيقية بنقطة نهاية مزيفة يتم إطلاقها بواسطة جوهرة FakeS3 المزيفة - سيتم الآن تفويض جميع الطلبات إلى خدمة أمازون إلى خادم مزيف محلي.s3_فرض_المسار_المسار_ستايل
- يقبل S3 نمطين لتضمين اسم الدلو في عنوان URL. يمكنك اختيار وضع اسم الجرافة على نمط المجال (bucket.s3.amazonaws.com) أو نمط المسار (s3.amazonaws.com/bucket). من أجل إبقاء الأمور بسيطة وتجنب التكوين الإضافي المرتبط بتعيين المجال الفرعي للجرافة إلى عنوان الاسترجاع، أفضل نمط المسار على نمط المجال في بيئة التطوير.استخدام_ssl
- يفرض على AWS SDK استخدام HTTPS بدلاً من HTTP الفانيليا. نحن بحاجة إلى تعطيل هذا الخيار، لأن FakeS3 gem لا يدعم طلبات HTTPS التي ينفذها عميل AWS افتراضيًا.
التهيئة لبيئة الإنتاج واضحة ومباشرة جداً:
# config/aws.yml
الإنتاج: &إنتاج
access_key_keyid:
مفتاح_الوصول_السري:
التدريج: *الإنتاج
ولكن هذه المرة، نحن نتعامل مع خدمة S3 حقيقية، لذلك تحتاج إلى تقديم بيانات اعتماد AWS الأصلية.
نظرًا للمخاطر الأمنية المحتملة، من الممارسات الجيدة الاحتفاظ بالقيم السرية مثل مفاتيح الوصول خارج نظام التحكم في الإصدار الخاص بك، على سبيل المثال باستخدام متغيرات البيئة. سنستخدم ERB لحقن قيمها في ملف التكوين.
تكوين مشبك الورق
حان الوقت الآن لمواجهة Paperclip وإجباره على العمل بشكل جيد مع عميل S3 الذي تم تكوينه بالفعل. الهدف الرئيسي من تكوين مشبك الورق هو الحصول على مسار التخزين الذي سيحدد موقع الموارد التي يستضيفها الخادم المزيف:
المضيف المحلي:10001/:اسم_الدلو/:المسار
مرة أخرى، لنبدأ ببيئة التطوير:
# config/paperclip.yml
التطوير: &التطوير
التخزين: :s3
دلو: "التطوير"
s3_اسم المضيف: "المضيف المحلي"
عنوان url: ":s3_alias_url"
المسار: ":class/:class/:attachment/:id_partition/:style/:fileename.:extension"
s3_المضيف_الاسم المستعار: ":localhost:10001/development"
اختبار: *تطوير
التخزين
- مواصفات ناقل التخزين (افتراضيًا نظام الملفات المحلي). نظرًا لأننا نستخدم AWS S3 نحتاج إلى تغييره إلى:s3
.الدلو
- اسم دلو S3 الذي سيخزن ملفاتك. إذا لم يكن الدلو موجودًا سيحاول Paperclip إنشاءه.الرابط
- مضبوطًا على:s3_alias_url
سيؤدي إلى قيام Paperclip بتسمية اسم مضيف دلو S3 بالاسم المستعار لدلو S3 بالقيمة المحددة بواسطة:s3_المضيف_الاسم المستعار
المعلمة.s3_المضيف_الاسم المستعار
- الاسم المستعار لمضيف دلو S3 الافتراضي. لاحظ أن موضع اسم المضيف والمنفذ واسم الدلو يتوافق مع تكوين عميل AWS.المسار
- نمط للمفاتيح التي سيتم تخزين الملفات تحتها في الدلو. يجب أن تكون المفاتيح فريدة داخل الدلو، مثل أسماء الملفات. نظرًا لأن S3 لا يدعم الدلائل، يمكنك استخدام/
لمحاكاة هياكل الدليل.
# config/paperclip.yml
الإنتاج: &production
التخزين: :s3
دلو:
URL: ":s3_domain_url"
المسار: ":class/:class/:مرفق/:id_partition/:style/:fileename.:extension"
التدريج: *الإنتاج
على غرار بيانات اعتماد AWS، يعتبر اسم الدلو أيضًا قيمة سرية يجب تخزينها خارج قاعدة التعليمات البرمجية الخاصة بك. أوصي بتخزين اسمه في متغير البيئة.
أخيرًا، ادمج التكوين في خيارات Paperclip الافتراضية في أداة تهيئة:
# config/initializers/paperclip.rb
paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys!
مشبك الورق::مرفق.default_options.merge! paperclip_defaults
تشغيل التزييف3
يحتوي كل من تكوينات AWS و Paperclip على مرجع إلى خادم S3 المزيف المحلي المتوقع تشغيله تحت المضيف المحلي:10001
. قبل العمل في التطوير، يجب عليك تشغيل الخادم باستخدام الأمر التالي (الذي توفره جوهرة FakeS3 gem):
تزييف 3 -r public/system -p 10001
المعلمات التي تم تمريرها هي:
الجذر -r
- الدليل الجذر الذي سيتم تخزين الملفات التي تم تحميلها تحته. ضع في اعتبارك استبعاده من VCS إذا كنت لا تريد أن يتم تخزين الملفات التي تم تحميلها في مستودعك.المنفذ -P
- رقم المنفذ الذي سيتم تشغيل الخادم المحلي عليه.
إذا كنت تستخدم فورمان لإدارة العمليات في تطبيقك، فقد يكون من المناسب إضافة الإدخال التالي إلى Procfile:
# Procfile
fakes3: fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p Continuous Integration/Continuous Deployment (CI/CD)P62T{FAKES3_PORT:-10001}
سيوفر لك ذلك الوقت الضائع في تشغيل الخادم المزيف في كل مرة ستحتاج فيها إلى تطوير بعض الميزات المتعلقة بـ S3.
الخاتمة
لقد قمنا بتهيئة عميل AWS لتفويض جميع الطلبات إلى خادم مزيف محلي، وقمنا بإعداد Paperclip لاستخدام نقطة نهاية S3 المزيفة في عناوين URL الخاصة بالمورد المُنشأة وأطلقنا الخادم المزيف الذي توفره جوهرة S3 المزيفة لتخزين جميع الملفات في نظام الملفات المحلي.
ونتيجة لذلك، أصبحنا مستقلين عن الاتصال بالإنترنت ووفرنا المال مما جعل تطويرنا أسرع وأكثر موثوقية.