يتطلب هذا المقال مستوى: متوسط. لازم تكون عارف Python أساسي، وشكل طلب HTTP، وعندك فكرة عن S3. مش محتاج تكون خبير AWS.
ارفع الملفات مباشرة إلى S3 بروابط موقّعة: خادمك يوقّع بس، والملف ميعديش عليه
لو المستخدم بيرفع ملف 240 ميجابايت وبيعدّي على خادمك الأول، انت بتدفع الثمن مرتين: ذاكرة الخادم بتتحجز طول الرفع، والـ request بيقع عند 30 ثانية. الحل إن المتصفح يرفع الملف مباشرة على S3، وخادمك دوره الوحيد إنه يوقّع رابط. في المقال ده هتبني ده خطوة بخطوة بـ boto3، وهتقيس الفرق بالأرقام.
المشكلة باختصار
الطريقة الشائعة: المتصفح يبعت الملف لخادمك (Flask أو FastAPI أو Express)، وخادمك يرفعه على S3. الطريقة دي بتفشل بمجرد ما الملفات تكبر. كل رفع بيحجز ذاكرة على الخادم بحجم الملف تقريبًا. عشرة مستخدمين بيرفعوا 240 ميجابايت في نفس الوقت معناه ~2.4 جيجابايت RAM محجوزة في لحظة واحدة. وأغلب البروكسيات (زي nginx أو الـ load balancer) بتقفل الاتصال بعد 30 أو 60 ثانية، فالرفع الكبير بيضرب 504 Gateway Timeout.
الفكرة الأول بمثال بسيط
تخيّل مطعم فيه فاليه باركنج. انت مش بتدّي مفتاح عربيتك لكل واحد واقف على الباب. بتاخد من موظف الاستقبال تذكرة عليها رقم ومكتوب إنها صالحة النهاردة بس. التذكرة دي بتخوّلك تسيب العربية في مكان محدد، من غير ما موظف الاستقبال يمسك العربية بنفسه.
الرابط الموقّع (Presigned URL) هو التذكرة دي بالظبط. خادمك عنده مفتاح AWS السري (زي مدير المطعم). بدل ما يمرّر كل ملف بنفسه، بيولّد رابطًا موقّعًا: عنوان طويل فيه توقيع تشفيري بيقول لـ S3 «الشخص اللي معاه اللينك ده مسموح له يكتب الملف ده بالتحديد في المكان ده بالتحديد، ولمدة 5 دقايق بس». المتصفح بيستخدم الرابط ويرفع مباشرة على S3.
علميًا: الرابط الموقّع هو URL عادي مضاف له معاملات توقيع بخوارزمية AWS Signature Version 4. التوقيع بيتحسب من مفتاحك السري + اسم الـ bucket + اسم الملف (key) + وقت الانتهاء + العملية (PUT). S3 بيعيد حساب نفس التوقيع لما الطلب يوصله؛ لو طابق، بيقبل الرفع. مفتاحك السري نفسه معدّاش على الشبكة أبدًا، والرابط بينتهي لوحده بعد المدة اللي حددتها.
الخطوات
- جهّز bucket ومستخدم IAM بصلاحية محدودة. اعمل bucket، واعمل مستخدم أو Role عنده صلاحية
s3:PutObjectعلى مسار الرفع بس، مش على الـ bucket كله. النتيجة المتوقعة: عندكAWS_ACCESS_KEY_IDوAWS_SECRET_ACCESS_KEYبصلاحية ضيقة. - ثبّت boto3. شغّل الأمر ده. النتيجة: مكتبة AWS جاهزة في بيئتك.
pip install boto3