Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Diogo Dias

Min Read

13. März 2023

So migrieren Sie Paperclip-Assets zu Amazon S3

Vor Kurzem, nach der Bereitstellung einer Web-App auf einem dedizierten Server, wurde uns klar, dass der Festplattenspeicher in Zukunft ein Engpass für den Betrieb der Anwendung sein würde.

Es würde während der App-Nutzung einen exponentiellen Speicherplatz benötigen, da es irgendwann an vielen Standorten gleichzeitig verwendet wird, während gleichzeitig mit einem zentralen Server kommuniziert wird, der Hunderte von Megabyte an Ressourcen hochlädt.


Wir haben beschlossen, den Speicher von unserem dedizierten Server auf Amazon AWS S3 zu verlagern, um die Skalierbarkeit der Anwendung zu erhöhen.

Einfache Sachen, könnten wir zum jetzigen Zeitpunkt sagen. Ändern Sie einfach eine Konfiguration in Paperclip, um S3 zu verwenden.

blue arrow to the left
Imaginary Cloud logo

Das erste Problem

Nun, das Problem war, dass die App bereits in Produktion war, sodass wir aufgrund der Änderung alle vorhandenen Ressourcen auf S3 verschieben mussten, um Datenverluste zu verhindern (natürlich!).

Ein Problem innerhalb des Problems

Während unserer Recherche haben wir eine einfache Lösung gefunden, um alle Assets auf S3 zu migrieren. Die Lösung im Internet ist ziemlich selbsterklärend; schicken Sie einfach den Ordner, in dem Ihre Assets gespeichert sind, an den S3 (den bekannten öffentlich/system Ordner)!

Dies würde in einer Situation funktionieren, in der url Die Paperclip-Konfiguration wurde zuvor definiert. Die Standardeinstellung Schema das Paperclip verwendet, landet in einer Datei mit dem Speicherort wie:

Um zu verhindern, dass Sie Zeit verlieren, wenn Sie herausfinden, wo /000/000/ kam von, die Erklärung für alle führenden Nullen, und um eine flexible Lösung zu schaffen, haben wir beschlossen, unsere eigene Strategie zu entwickeln.

Anforderungen

  1. Wir müssen alle Modellanhänge verschieben;
  2. Wir müssen alle Stile bewahren;
  3. Dies muss erfolgen, ohne den Server zu sperren;
  4. Der S3-Bucket sollte je nach Rails-Umgebung (Test, Produktion, Staging) unterschiedlich sein;
  5. Wir müssen minimale Ausfallzeiten haben.

Lösung

Zuerst müssen wir in der Lage sein, die Konfiguration auf Paperclip so zu ändern, dass S3 nach der Migration verwendet wird und dass wir unseren Server während der Migration verwenden können (wir benötigen die Anhangsdateien).

Sehen wir uns ein typisches Modell mit Anhängen an:

 

Um das Modell für die Migration zum S3-Dienst vorzubereiten, müssen wir einen Switch hinzufügen, der einfach aktiviert werden kann.

Lass uns eine erstellen s3_migrate.yml Datei mit einer Konfiguration:


Von Zeile 1 bis 4 ist die normale Konfiguration für den Paperclip S3-Speicher, in Zeile 5 haben wir den Schalter hinzugefügt, um den S3 zu aktivieren.

Wenn es nicht aktiviert ist, sollte die Anwendung die Assets vom lokalen Server aus bereitstellen. Als Nächstes ändern wir unsere Modelldefinition, um diese Änderungen widerzuspiegeln.


In diesem Snippet speichern wir die Paperclip-Optionen in einem Hash (PAPERCLIP_STORAGE_OPTIONS) und laden Sie die Datei mit den Migrationsoptionen. Wir führen die S3-Einstellungen zusammen, wenn aktiviert wahr ist.

Im Moment haben wir unser Modell so vorbereitet, dass es nach Abschluss des Migrationsprozesses zu S3 wechselt.

MIGRATION

Um unsere Assets auf S3 zu migrieren, benötigen wir eine benutzerdefinierte Aufgabe, um die Aktion auszuführen. Hier ist das dafür verantwortliche Snippet.

Erstellen Sie eine Datei mit dem Namen paperclip_migrate.rake und zieh es an lib/aufgaben Ordner und fügen Sie den obigen Code ein.

Führen Sie die Aufgabe aus:


**Nach Abschluss der Migration müssen wir unsere s3_migrate.yml aktualisieren und den S3-Speicher aktivieren. **

Ändere einfach die Zeile aktiviertem zu wahr. Starte den Webserver neu und du bist fertig!

Hinweis 1: Die Pfadeinstellung in s3_migrate.yml sollte dem Wert in der Zeile 44 der Aufgabe entsprechen. Ändern Sie das entsprechend Ihrem Szenario.

Hinweis 2: Nachdem Sie die Migration abgeschlossen und sichergestellt haben, dass unsere Assets erfolgreich auf S3 migriert wurden, können Sie die Dateien löschen, die noch in öffentlich/system.

Fazit

Lassen Sie uns unsere Anforderungen für dieses Problem durchgehen und jede einzelne davon validieren.

1 - Wir müssen alle Modellanhänge verschieben

Da wir die Möglichkeit hinzufügen, die Klasse und die Objekte dynamisch zu spezifizieren, kann man die Aufgabe mit beliebigen Modellen ausführen, zum Beispiel:


Vollendet!

2 - Wir müssen alle Stile beibehalten

In unserer Aufgabe können wir, nachdem wir überprüft haben, ob sich mindestens ein Objekt in unserer Datenbank befindet, es abfragen, um alle definierten Stile abzurufen:

Es wird zurückgeben, was wir erwarten:

Vollendet!

3 - Dies muss erfolgen, ohne den Server zu sperren

Wir verwenden einen Rake-Task, um die Migration durchzuführen, damit sie ausgeführt werden kann, ohne die Verwendung der Anwendung in der Produktionsumgebung zu beeinträchtigen.

Vollendet!

4 — Der S3-Bucket sollte je nach Rails-Umgebung unterschiedlich sein

In unserem s3_migrate.yml wir definieren den Pfad der Vermögenswerte, um die zu nutzen Rails.env variabel, sodass die Assets entsprechend der Umgebung gespeichert werden, in der die Anwendung ausgeführt wird.

Vollendet!

5 — Wir brauchen minimale Ausfallzeiten

Wir benötigen nur einen einzigen Neustart des Webservers! Wir können also sagen, dass die Anforderung war...

Vollendet!

Und das ist so ziemlich alles, was Sie wissen müssen, um Paperclip-Assets von einem lokalen Server zu Amazon S3 zu migrieren.

Ready for a UX Audit? Book a free call

Fanden Sie diesen Artikel hilfreich? Diese könnten dir auch gefallen!

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
Diogo Dias
Diogo Dias

Erfahrung mit Backend-Systemen für das Web unter Verwendung modernster Technologien. Full-Stack-Entwickler und Produkthersteller. Ruby/Rails, NodeJS, ElectronJS.

Read more posts by this author

People who read this post, also found these interesting:

arrow left
arrow to the right
Dropdown caret icon