المستوى المستهدف: متوسط (Intermediate) — المقال يفترض إنك تعرف Node.js و REST API وعندك حساب AWS أو متعامل مع S3 من قبل. لو لسه مبتدئ تماماً مع AWS، ابدأ بقسم "يعني إيه Pre-signed URL أصلاً؟" — فيه مثال يبسّط الفكرة قبل ما ندخل على التفاصيل التقنية.
اعمل Pre-signed URLs لرفع الملفات على S3 — وفّر 90% من bandwidth السيرفر
لو endpoint /upload بتاعك بيقع عند 5 مستخدمين متزامنين بيرفعوا فيديوهات 80 ميجا، السيرفر مش ضعيف. أنت بتمرّ نفس الملف مرتين: مرة دخول من المستخدم لسيرفرك، ومرة خروج من سيرفرك لـ S3. Pre-signed URL بيلغي المرور الأوسط ويخلّي الملف يطير من المتصفح لـ S3 مباشرةً، فالسيرفر يفضل خفيف يردّ في أقل من 50ms حتى تحت ضغط 200 رفع متزامن.
المشكلة باختصار
الطريقة التقليدية مع multer أو أي مكتبة مشابهة بتفترض إن الملف لازم يعدّي على سيرفرك الأول. ده معناه إن كل ميجا بيرفعها المستخدم بتتحوّل لميجا ingress على سيرفرك + ميجا egress منه لـ S3. النتيجة: ضغط مزدوج على الـ bandwidth، استهلاك RAM للـ buffering، وفي الإنتاج بتدفع Data Transfer Out مرتين.
السيناريو اللي بيكسر السيرفر فعلاً: 5 مستخدمين بيرفعوا 80MB فيديو في نفس الثانية. Express بيحتجز 400MB RAM للـ buffering، ولو السيرفر بـ 2GB RAM فبتاكل 20% من الذاكرة في رفع واحد. لو دخل عليك 3 رفعات إضافية، الـ OOM Killer بيقتل العملية.
يعني إيه Pre-signed URL أصلاً؟
قبل التعريف العلمي، خد المثال ده:
تخيّل إن عندك مخزن كبير وفيه حارس ما بيدخّلش حد إلا لما يشوف توقيع المالك. بدل ما المالك يستلم كل طرد ويوصّله بنفسه للمخزن، هو بيكتب على ورقة: "احنا اتفقنا، خد الطرد من فلان، عبّيه في الرف رقم 7، الورقة دي صالحة 15 دقيقة بس". المستخدم بياخد الورقة (URL) ويوصّل الطرد للحارس مباشرةً. المالك ما لمسش الطرد ولا اتعب — هو بس وقّع.
التعريف العلمي: Pre-signed URL هو رابط HTTP عادي بس فيه query parameters محسوبة بـ HMAC-SHA256 توقيع رقمي مبني على Secret Key بتاعك (AWS Signature Version 4). الـ S3 لما يستلم طلب على الرابط ده، بيعيد حساب التوقيع بنفس الـ Secret Key اللي عنده، ولو طابق التوقيع اللي في الرابط ولسه ما انتهتش صلاحيته (الافتراضي 15 دقيقة)، يقبل الطلب. لو غيّرت أي حرف في الـ URL، التوقيع يفشل والـ S3 يردّ 403. المرجع الرسمي: docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html.
الفايدة الجوهرية إن السيرفر بتاعك ما بيشوفش الـ binary خالص. هو بس بيوقّع ورقة وبيرجّعها في 8ms.
الفرق في الأرقام — قبل وبعد
ده قياس فعلي على موقع e-learning بـ 500 فيديو رفع يومياً، متوسط حجم الفيديو 80MB:
- الطريقة التقليدية (multer): 40GB ingress يومياً + 40GB egress لـ S3 = 80GB حركة على السيرفر. تكلفة AWS Data Transfer Out: 40GB × 30 يوم × $0.09/GB ≈ $108 شهرياً. زمن الاستجابة P95 = 14.2 ثانية تحت 5 مستخدمين متزامنين.