Integration von S3 in deine Laravel-Anwendung

Laravel vereinfacht unser Leben in der Entwicklung in vielerlei Hinsicht – zum Beispiel mit der Integration von s3!

Dieses Thema wirkt auf den ersten Blick recht kompliziert, vielleicht ist es sogar ein Thema, um das man lieber einen Bogen macht. Schwierige Konfigurationen vorzunehmen und gleichzeitig wichtige Userdaten zu verwalten, kann erstmal überfordern.

Tatsächlich ist der Prozess relativ einfach, wenn klar ist, wie die Einstellungen konfiguriert werden.

Wir werden dich durch die praktische Integration des S3 Storage Service leiten, sodass dein Cloud Storage schon bald mit deiner Anwendung verbunden ist.

Warum solltest du S3 in deine Laravel-Anwendung integrieren?

Es gibt sehr viele Gründe, warum du S3 direkt in deine Laravel-Anwendung integrieren solltest. Einer der wichtigsten Gründe ist Skalierbarkeit. Durch eine direkte Integration kannst du deinen Speicher schnell und einfach an deine Bedürfnisse anpassen.

Für uns war der entscheidende Punkt, dass wir so einen einzelnen Storage für alle unsere Server verwenden können. Wir haben den Application Server von der restlichen Infrastruktur getrennt, sodass der Storage, genau wie die Datenbank und der Redis Cache, nun allein stehen. So haben wir ideale Bedingungen für Blue-Green-Deployment und Autoscaling.

Konfiguration des S3 Storage Service

Laravel stellt standardmäßig nahezu alles bereit, um AWS Bucket zu konfigurieren. Du kannst aber auch jeden weiteren S3-kompatiblen File Storage Service integrieren.

Deine .env-Datei beinhaltet zu Beginn die folgenden 5 Variablen: 

Zunächst fügst du “AWS_ENDPOINT” neu hinzu. AWS_USE_PATH_STYLE_ENDPOINT wird in diesem Artikel nicht benötigt.

Die Bezeichnung kannst du beliebig verändern, je nachdem, was zu deinem S3 Service passt, z.B. “OBS_ACCESS_KEY_ID” anstatt “AWS_ACCESS_KEY_ID”.

Denk nur daran, sie auch in config/filesystems.php zu ändern, da die eigentliche Konfiguration hier aus den Environment-Variablen zusammengebaut wird.

Weiter geht’s mit ein paar Beispielen dazu, wie du die bereits erwähnten 5 Variablen beziehen könntest.

Hier verwenden wir den OBS S3 Bucket der Open Telekom Cloud (OTC).

Was du dafür brauchst:

  • Einen Bucket
  • Einen Benutzeraccount mit Zugang zu diesem Bucket.

Auf deinem Dashboard unter der Storage-Zeile findest du “Object Storage Service” und klickst darauf.

Du solltest eine ähnliche Darstellung wie folgende vorfinden:

Danach klickst du auf “Create Bucket” und trägst die Informationen über den neuen Bucket ein.

Nun siehst du deinen neuen Bucket in der Liste auf dem “Object Storage Service”-Dashboard!

Mit Auswahl des Buckets erscheinen 3 der 5 Variablen, die du brauchst:

  • OBS_BUCKET
  • OBS_DEFAULT_REGION
  • OBS_ENDPOINT

 

Hinweis: Füge https:// vor OBS_ENDPOINT hinzu, falls es fehlt.

Für den kommenden Teil gehen wir davon aus, dass OTCs IAM User Management genutzt wird und du einen Account verwendest, der  Zugriff auf den erstellten Bucket hat.

Die letzten 2 Variablen müssen für den Nutzer unten links unter “My Credentials” generiert werden:

So wird eine .csv-Datei erstellt, die eine “Access Key ID” und einen “Secret Access Key” beinhaltet, welche du als “OBS_ACCESS_KEY_ID” und “OBS_SECRET_ACCESS_KEY” deiner .env hinzufügst.

Dieser Access Key ist an den Nutzeraccount gekoppelt. Sollte der Nutzer keinen Zugriff auf den Bucket haben, müssen die Bucket ACLs und Policies angepasst werden.

Die .env ist jetzt fertig, sodass du deine Applikation fertigstellen und anfangen kannst, deinen S3 Bucket zu nutzen.

Konfiguration in Laravel

Bevor du mit deiner konfigurierten S3 Disk loslegen kannst, musst du ein Composer Package installieren:

composer require --with-all-dependencies league/flysystem-aws-s3-v3 "^1.0"

Laravel nutzt dies im Hintergrund, wenn du eine Datei über den S3 Driver speicherst.

Eine Datei speichern

Nun zu dem Teil, auf den du sicher schon gewartet hast: Wie kann der neue S3 Storage verwendet werden?

Wir nehmen an, dass du schon einen funktionierenden File Uploader hast. Darum kümmern wir uns gleich um den Controller.

Dafür gibt es verschiedene Ansätze, aber wir halten es einfach.

Sagen wir, du hast ein Image Model und eine image Tabelle, in der die wichtigen Informationen über die Images, die hochgeladen werden, gespeichert sind.

Dein Controller sollte dann in etwa so aussehen:

Wichtig ist hier, dass du die zu verwendende Disk spezifizieren kannst, die du in der config/filesystems.php konfiguriert hast.

Mit Laravels Storage Facade kannst du nun auf einfache Weise Dateien in deinem S3 Bucket speichern!

Ein weiteres tolles Feature, das Laravel bietet, ist die url($path)-Methode, die die Remote URL von deinem S3 Bucket zurückgibt.

 

Außerdem ist es möglich, eine Datei auf dem S3 Bucket durch die store()-Methode auf dem UploadedFile-Objekt wie folgt zu speichern: 

Danach erscheint ein neuer Ordner “test/images/” im Bucket Dashboard, der auch die gespeicherte Datei beinhaltet.

Dateien über Laravel abrufen

Mit Hilfe von Laravels Storage Facade ist es einfach, die Datei abzurufen:

Des Weiteren kann geprüft werden, ob die Datei im S3 Bucket existiert:

Und selbstverständlich kann sie auch aus dem S3 Bucket gelöscht werden:

Hinweis

Die Remote S3 URL funktioniert nicht, wenn das Image als “private” gespeichert ist (was standardmäßig der Fall ist).

Aus diesem Grund bekommst du die 403-Meldung, wenn du die Remote URL direkt nutzen willst. Laravel hat hierfür eine Antwort.

Du brauchst lediglich eine Route, die einen Stream des Images zurückgibt.

Laravels Route Model Binding bietet die komfortable Möglichkeit, diese Route für jedes beliebige Image zu nutzen, indem du der Route Query die Image ID übergibst.

Auf diese Weise ziehst du erst das Image aus dem S3 Bucket und gibst es dann über die Response zurück. So kannst du die Route direkt als “src” im <img> verwenden. 

Fazit

Wir hoffen, dass wir dir näher bringen konnten, wie du deinen S3 Storage Service in deiner Laravel Application integrierst. 

Auf diesen Grundlagen kannst du nach Bedarf aufbauen, zum Beispiel indem du ein Image öffentlich speicherst, um die Remote 3 URL direkt zu nutzen und so deine Performance zu optimieren.

Sehr zu empfehlen ist auch die Laravel-Dokumentation, die dir bei vielen Fragen von Nutzen sein wird: https://laravel.com/docs/9.x/filesystem.

Wobei können wir dich unterstützen?

Neues Projekt

Du hast eine Idee für eine digitale Lösung und suchst einen Partner, der dich begleitet?

Verstärkung für dein Projekt

Du hast bereits eine Anwendung und suchst Verstärkung in der Entwicklung?

Artikel teilen

Mehr aus unserem Blog

5 Jahre Lean Ocean – Das Interview

Vor 5 Jahren ist Lean Ocean in einem WG-Zimmer gestartet. Und heute hat das Unternehmen nichts von seinem Startup Flair verloren – nur die Büros sind schicker geworden.
Im Video-Interview werfen unsere Geschäftsführer Oliver und Stephan zusammen einen Blick auf die Entwicklung von Lean Ocean, gemeinsame Meilensteine und was die Arbeit bei Lean Ocean prägt.

Ein Tag als Softwareentwickler bei Lean Ocean

Was macht eigentlich ein Softwareentwickler bei Lean Ocean und wie sieht ein üblicher Arbeitstag aus? Das erzählt dir Norbert im folgenden Blogartikel! Wir haben Norbert, einen unserer Developer, einen Tag lang begleitet und über die Schulter geschaut. Vom ersten Kaffee zum wohlverdienten Feierabend– hier erhältst du spannende Einblicke in einen abwechslungsreichen Arbeitstag.

Von der Idee zum Feature

Wie sieht es eigentlich bei Lean Ocean hinter dem Code aus? Wie läuft so ein Projekt ab und wie wird aus einer Idee dann ein richtiges Feature? In diesem Artikel beantworten dir Oliver und Tom die wichtigsten Fragen zu unserem brandneuen Format #behindthecode. Als erstes geht Oliver als CTO von Lean Ocean auf den Entwicklungsprozess von Features ein und dann gibt uns unser Projektmanager Tom noch ein paar Antworten.

Picture of Oliver Holz

Oliver Holz

holz@lean-ocean.com