Log in to leave a comment
No posts yet
أدرك تماماً ذلك الشعور بالبرودة الذي يسري في صدرك في كل مرة تطلع فيها على فاتورة Amazon S3. بالنسبة لمهندس البيانات، يعتبر S3 بمثابة الهواء الذي يتنفسه، ولكن استدعاء واجهة برمجة التطبيقات (API) عشرات آلاف المرات ونقل ملفات ضخمة لأغراض الاختبار قد يجعل تكلفة "التوابع" أكبر من تكلفة "الأصل". اعتباراً من عام 2025، تبلغ تكلفة تخزين S3 Standard حوالي 0.023 دولار لكل جيجابايت، ولكن الرعب الحقيقي يكمن في تكاليف نقل البيانات (Egress). فبمجرد تجاوز 100 جيجابايت، سيتعين عليك دفع 0.09 دولار لكل جيجابايت، وهو ما يعادل تقريباً 4 أضعاف تكلفة التخزين. لتوفير هذه التكاليف، يقوم البعض بتشغيل MinIO محلياً، ولكنهم يعانون من تعارضها مع كود التشغيل الفعلي؛ لذا قمت بتلخيص إعدادات التكوين التي أستخدمها في العمل الفعلي.
كتابة عناوين S3 مباشرة داخل كود التطبيق هي عادة خطيرة. فإذا تركت العنوان المحلي بالخطأ عند النشر، فسيؤدي ذلك إلى تعطل النظام. تقرأ مكتبة Boto3 متغيرات بيئة النظام قبل إعدادات الكود الداخلية. وباستخدام هذه الأولوية، يمكنك جعل التطبيق ينظر إلى MinIO محلياً، بينما يستخدم AWS S3 تلقائياً في بيئة التشغيل.
طريقة الإعداد
AWS_S3_ENDPOINT_URL=http://localhost:9000 في ملف .env في البيئة المحلية.os.getenv("AWS_S3_ENDPOINT_URL").boto3.client("s3", endpoint_url=endpoint).بهذه الطريقة، لن يجد خادم التشغيل متغير البيئة هذا، وبالتالي سيتوجه Boto3 إلى عنوان AWS الافتراضي. هذه هي الطريقة الأضمن لجعل تكلفة عشرات آلاف طلبات PUT/GET أثناء مرحلة الاختبار المحلي صفر ريال.
ستواجه أخطاءً إذا حاولت استخدام كود Terraform الذي يحدد البنية التحتية التجارية كما هو مع MinIO المحلي. وذلك لأن مزود AWS في Terraform يحاول التحقق من معرف حساب AWS الفعلي بشكل افتراضي. في البيئة المحلية، يجب اعتراض عملية التحقق هذه وخداعها.
مثال على إعداد Terraform
s3 = "http://localhost:9000" ضمن إعدادات endpoints.s3_use_path_style و skip_credentials_validation و skip_requesting_account_id بوضعها جميعاً على true.mock_key في access_key و secret_key.بعد هذا الإعداد، سيقوم Terraform بإنشاء سياسات الحاويات (bucket policies) وقواعد دورة الحياة (Lifecycle Rules) على MinIO المحلي دون الحاجة للاتصال بحساب AWS حقيقي. هذا فعال جداً في تقليل معدل فشل النشر من خلال اكتشاف الأخطاء في مواصفات البنية التحتية مسبقاً.
لرؤية أداء الاستعلام بشكل صحيح، يجب أن تكون البيانات الوهمية ذات حجم كبير. ولكن إنشاء البيانات باستخدام حلقات التكرار (loops) العادية بطيء جداً ومستنزف للطاقة. أنا أستخدم Polars أو Apache Arrow. يستخدم Polars عمليات متجهة (vectorized operations)، لذا فهو أسرع من Pandas بـ 10 مرات تقريباً.
عملية إنشاء البيانات
Faker وأنشئ كتل بيانات (chunks) بمقدار 100,000 صف باستخدام Polars.write_to_dataset في محرك pyarrow لحفظ ملفات Parquet مقسمة بأسلوب Hive (year=2026/month=04).رفع وتنزيل 100 جيجابايت من البيانات بشكل متكرر في السحابة قد يكلفك مئات الدولارات. إن دفع أجهزتك المحلية إلى أقصى حدودها أثناء الاختبار أفضل بكثير لصحة محفظتك.
عند اختبار منطق بدون خادم (serverless) يعمل تلقائياً عند رفع ملف، يمكنك استخدام ميزة إشعارات الحاويات في MinIO. يدعم MinIO ميزة Webhook التي ترسل بيانات JSON إلى نقطة نهاية HTTP محددة عند إنشاء كائن.
خطوات التنفيذ
MINIO_NOTIFY_WEBHOOK_ENDPOINT بعنوان الخادم المحلي.s3:ObjectCreated:Put يصل إلى الخادم المحلي بشكل صحيح.تعتمد الموثوقية عند تدفق الأحداث بكثافة على حجم الطابور ومعدل حدوث الأحداث (
). في بيئة الاختبار المحلية، من الأفضل زيادة إعداد queue_limit لتجنب وجع الرأس.
أحياناً لا تفتح الملفات التي تم إنشاؤها داخل حاوية Docker على الجهاز المضيف بسبب مشاكل الصلاحيات. خاصة لمستخدمي macOS، يجب التأكد من تفعيل 'VirtioFS' في إعدادات Docker Desktop. يعتبر VirtioFS أسرع من طريقة gRPC FUSE التقليدية في معالجة نظام الملفات بنسبة تصل إلى 98%. عند التعامل مع كميات كبيرة من البيانات، يكون هذا الفرق ملموساً جداً.
حل مشكلة الصلاحيات
docker run استخدم خيار --user $(id -u):$(id -g) لمطابقة صلاحيات المضيف والحاوية./data في الحاوية.إن بناء بيئة محلية جيدة يعني امتلاك مختبر مثالي حيث يمكنك استكشاف مبادئ عمل البنية التحتية دون القلق بشأن التكاليف. الأمر يتجاوز مجرد توفير المال؛ إنه يمنحك إيقاع تطوير مستقل لا يتأثر بتقلبات البيئة السحابية.