AWS برای تازه‌کارها: S3، Deduplication و Presigned URLs

ساخت اپلیکیشن‌های اسباب‌بازی را متوقف کنید. ساخت سیستم‌های عملیاتی (Production) را شروع کنید.

اگر سرور شما قابل جایگزینی (disposable) است، فایل‌های شما نمی‌توانند روی دیسک آن ذخیره شوند. شما به AWS S3 نیاز دارید. S3 یک فضای ذخیره‌سازی شیء‌گرا (object storage) است که مستقل از سرورهای شما عمل می‌کند. این امر تضمین می‌کند که حتی در صورت از کار افتادن یا حذف شدن سرور، فایل‌های شما باقی بمانند.

در اینجا نحوه ساخت یک جریان (flow) حرفه‌ای برای آپلود فایل آورده شده است:

  • از S3 Buckets و Keys استفاده کنید یک bucket ظرف نگهدارنده شماست. یک key مسیر کامل فایل شماست. S3 پوشه‌های واقعی ندارد، بلکه از پیشوندها (prefixes) در یک ساختار تخت (flat structure) استفاده می‌کند. برای نظم بیشتر، می‌توانید فایل‌ها را بر اساس نوع آن‌ها، مانند images/ یا documents/ سازماندهی کنید.

  • قابلیت Content Deduplication را پیاده‌سازی کنید برای یک فایل یکسان، دو بار هزینه پرداخت نکنید. از الگوریتم SHA-256 برای ایجاد یک اثر انگشت (fingerprint) منحصربه‌فرد برای هر فایل استفاده کنید. اگر دو کاربر دقیقاً یک تصویر را آپلود کنند، هش (hash) آن‌ها یکسان خواهد بود. قبل از آپلود در S3، این هش را در پایگاه داده خود بررسی کنید. اگر هش وجود داشت، از همان فایل موجود استفاده کنید.

  • فایل‌های حجیم را به صورت Stream آپلود کنید هرگز یک ویدیوی ۲۰۰ مگابایتی را فقط برای محاسبه هش، در RAM سرور خود بارگذاری نکنید. از Node.js streams برای پردازش فایل‌ها در قطعات کوچک (chunks) استفاده کنید. این کار سرعت سرور را حفظ کرده و از کرش کردن آن جلوگیری می‌کند.

  • محدودیت حجم فایل را اعمال کنید بررسی در سمت فرانت‌اند فقط برای تجربه کاربری (UX) است و امنیت محسوب نمی‌شود. شما باید محدودیت‌های حجم را در سه لایه اعمال کنید: • سمت کلاینت برای UX. • اعتبارسنجی در سمت بک‌اند (Backend) برای رد سریع درخواست‌های نامعتبر. • شرایط S3 از طریق presigned URLs برای متوقف کردن آپلودهای بیش از حد مجاز در منبع.

  • برای امنیت از Presigned URLs استفاده کنید باکت (bucket) خود را عمومی نکنید. گزینه "Block all public access" را روشن نگه دارید. در عوض، یک presigned URL تولید کنید. این کار به کاربر اجازه موقتی برای آپلود یک فایل خاص را می‌دهد. می‌توانید زمان انقضا تعیین کنید. برای فایل‌های کوچک از بازه‌های زمانی کوتاه و برای آپلود ویدیوهای حجیم از بازه‌های زمانی طولانی‌تر استفاده کنید.

  • آپلود را تأیید کنید هرگز به کلاینت اعتماد نکنید. پس از آپلود، از دستور HeadObject استفاده کنید تا بررسی کنید آیا فایل واقعاً در S3 وجود دارد و آیا حجم آن با سوابق شما مطابقت دارد یا خیر.

جریان عملیاتی (The Production Flow):

  1. کلاینت درخواست یک URL برای آپلود می‌کند.
  2. بک‌اند حجم، نوع و تکراری بودن فایل را بررسی می‌کند.
  3. بک‌اند یک presigned URL محدود شده (scoped) تولید می‌کند.
  4. کلاینت فایل را مستقیماً به S3 آپلود می‌کند.
  5. بک‌اند وجود فایل را از طریق HeadObject تأیید می‌کند.

سیستم‌هایی بسازید که به صورت پیش‌فرض امن باشند.

منبع: https://dev.to/surajrkhonde/aws-for-newbies-episode-2-3jg5