AWS dla początkujących: S3, deduplikacja i presigned URLs

Przestań budować zabawki. Zacznij budować systemy produkcyjne.

Jeśli Twój serwer jest tymczasowy, Twoje pliki nie mogą znajdować się na jego dysku. Potrzebujesz AWS S3. S3 to pamięć obiektowa (object storage). Działa niezależnie od Twoich serwerów. Dzięki temu Twoje pliki przetrwają nawet wtedy, gdy serwer ulegnie awarii lub zostanie usunięty.

Oto jak zbudować profesjonalny proces przesyłania plików:

  • Korzystaj z S3 Buckets i Keys Bucket to Twój kontener. Key to pełna ścieżka do pliku. S3 nie posiada prawdziwych folderów. Używa prefiksów w płaskiej strukturze. Możesz organizować pliki według typu, np. images/ lub documents/, aby zachować porządek.

  • Wdróż deduplikację treści Nie płacisz dwa razy za ten sam plik. Użyj algorytmu SHA-256, aby stworzyć unikalny odcisk palca dla każdego pliku. Jeśli dwóch użytkowników prześle dokładnie ten sam obraz, hash będzie identyczny. Przed przesłaniem do S3 sprawdź obecność tego hasha w bazie danych. Jeśli hash już istnieje, ponownie wykorzystaj istniejący plik.

  • Przesyłaj duże pliki strumieniowo Nigdy nie ładuj 200 MB wideo do pamięci RAM serwera tylko po to, aby obliczyć jego hash. Użyj strumieni (streams) w Node.js, aby przetwarzać pliki małymi fragmentami. Dzięki temu serwer będzie działał szybko i unikniesz awarii.

  • Wymuszaj limity rozmiaru plików Sprawdzenie po stronie frontendu służy jedynie poprawie doświadczenia użytkownika (UX). Nie jest to zabezpieczenie. Musisz wymuszać limity rozmiaru na trzech poziomach: • Po stronie klienta (dla UX). • Walidacja po stronie backendu, aby wcześnie odrzucać błędne żądania. • Warunki S3 za pomocą presigned URLs, aby zatrzymać zbyt duże przesyłanie u źródła.

  • Używaj presigned URLs dla bezpieczeństwa Nie udostępniaj swojego bucketu publicznie. Pozostaw włączoną opcję „Block all public access”. Zamiast tego wygeneruj presigned URL. Daje on użytkownikowi tymczasowe uprawnienie do przesłania jednego, konkretnego pliku. Możesz ustawić czas wygaśnięcia. Stosuj krótkie okna czasowe dla małych plików i dłuższe dla dużych przesyłek wideo.

  • Weryfikuj przesyłanie Nigdy nie ufaj klientowi. Po przesłaniu pliku użyj komendy HeadObject, aby sprawdzić, czy plik faktycznie istnieje w S3 i czy jego rozmiar zgadza się z Twoimi zapisami.

Proces produkcyjny:

  1. Klient żąda adresu URL do przesyłania.
  2. Backend waliduje rozmiar, typ i sprawdza duplikaty.
  3. Backend generuje ograniczony zakresem (scoped) presigned URL.
  4. Klient przesyła plik bezpośrednio do S3.
  5. Backend potwierdza istnienie pliku za pomocą HeadObject.

Buduj systemy, które są bezpieczne domyślnie.

Źródło: https://dev.to/surajrkhonde/aws-for-newbies-episode-2-3jg5