Scaleway Object Storage als Laravel S3-Dateispeicher verwenden

Scaleway Object Storage ist ein S3-kompatibler Objektspeicherdienst der französischen Cloud-Plattform Scaleway. Scaleway Object Storage speichert Dateien automatisch in mehreren Verfügbarkeitszonen (Multi-AZ) und nutzt ausschließlich erneuerbare Energien für den Betrieb seiner Server. Dieses Tutorial ist eine Schritt-für-Schritt-Anleitung, wie man Dateien in Laravel in einem Scaleway Object Storage Bucket speichert.

Erstellen des Buckets

Scaleway bietet verschiedene Möglichkeiten, um Ressourcen wie einen Object-Storage-Bucket zu erstellen, z. B. das Webinterface, eine API, ein CLI-Tool und auch einen Terraform-Anbieter. In dieser Anleitung verwende ich die Weboberfläche, aber für komplexere Setups könnte es eine gute Idee sein, etwas wie den Terraform-Provider zu verwenden.

Wenn Sie also möchten, dass die Scaleway-Anmeldeinformationen, die Sie in Ihrer Laravel-Anwendung speichern, nur auf die Buckets zugreifen, müssen Sie ein neues Projekt erstellen, das nur die Buckets enthält. Scaleway arbeitet derzeit an dieser Einschränkung und hat bereits eine Lösung in der privaten Beta-Phase, aber im Moment müssen wir ein neues Projekt erstellen.

Die folgenden Screenshots sollen Ihnen zeigen, wie Sie ein Projekt erstellen können:

Ein Projekt erstellen - Teil 1

Ein Projekt erstellen - Teil 2

Gehen Sie in der linken Navigation auf "Object Storage" und klicken Sie auf "Bucket erstellen".

Wählen Sie einen eindeutigen Namen für den Bucket (dieser kann nicht geändert werden) und wählen Sie nun das Rechenzentrum aus, in dem Sie Ihren Bucket speichern möchten. Wenn Ihnen der Standort nicht so wichtig ist, würde ich mich für das französische Rechenzentrum entscheiden, da dort neue Funktionen zuerst bereitgestellt werden.

Sie müssen auch die Sichtbarkeit des Buckets auswählen. Dies ist etwas verwirrend, da dies nichts mit der Sichtbarkeit des Objekts im Bucket zu tun hat, sondern nur damit, ob es möglich ist, eine Liste der Objekte zu erhalten. Ich würde mich für "privat" entscheiden, auch wenn Sie vorhaben, die Objekte innerhalb des Buckets öffentlich zu machen.

Bucket erstellen

Nach der Erstellung können Sie "Bucket Versioning" aktivieren. Wenn diese Option aktiviert ist und Sie eine Datei löschen, wird sie nur als gelöscht markiert, so dass sie später wiederhergestellt werden kann.

Zugangsdaten erstellen

Gehen Sie zum "Project Dashboard" und dann zu "Credentials". Generieren Sie nun einen neuen API-Schlüssel und speichern Sie den Zugangsschlüssel und den geheimen Schlüssel für später. Sie werden in Umgebungsvariablen in Ihrem Laravel-Setup gespeichert.

Einen API-Schlüssel erstellen

Laravel konfigurieren

Für die Konfiguration verwenden wir eine Instanz von Laravel 9. Mit anderen Laravel-Versionen sollte es ähnlich funktionieren.

Bevor wir Laravel konfigurieren, müssen wir den S3-Treiber installieren.

composer require league/flysystem-aws-s3-v3 "^3.0"

Fügen Sie die folgenden Zeilen in das Array disks in der Konfigurationsdatei config/filesystems.php ein.

'object_storage' => [
		'driver' => 's3',
		'key' => env('OBJECT_STORAGE_ACCESS_KEY_ID'),
		'secret' => env('OBJECT_STORAGE_SECRET_ACCESS_KEY'),
		'region' => env('OBJECT_STORAGE_DEFAULT_REGION'),
		'bucket' => env('OBJECT_STORAGE_BUCKET'),
		'url' => env('OBJECT_STORAGE_URL'),
		'endpoint' => env('OBJECT_STORAGE_ENDPOINT'),
		'use_path_style_endpoint' => env('OBJECT_STORAGE_USE_PATH_STYLE_ENDPOINT', false),
		'visibility' => 'private',
		'throw' => false,
],

Damit dies funktioniert, müssen Sie auch die Umgebungsvariablen setzen. OBJECT_STORAGE_ACCESS_KEY_ID und OBJECT_STORAGE_SECRET_ACCESS_KEY sind die Anmeldedaten aus dem vorherigen Schritt. OBJECT_STORAGE_BUCKET ist der Name des von Ihnen gewählten Buckets. OBJECT_STORAGE_DEFAULT_REGION ist die Scaleway-Region des Buckets, die je nach Ihrer Wahl fr-par, nl-ams oder pl-waw ist.

OBJECT_STORAGE_ENDPOINT ist immer https://s3.fr-par.scw.cloud und OBJECT_STORAGE_USE_PATH_STYLE_ENDPOINT ist immer true.

Sie brauchen OBJECT_STORAGE_URL nur dann zu setzen, wenn Sie beabsichtigen, ein CDN vor dem Bucket zu verwenden. In diesem Fall setzen Sie OBJECT_STORAGE_URL auf etwas wie dies: https://cdn.someproject.com.

Die visibility ist auf private gesetzt, was bedeutet, dass wenn Sie die Sichtbarkeit nicht angeben, wenn Sie eine neue Datei über Laravel hinzufügen, wird die Datei auf private gesetzt. Wenn Sie diesen Bucket nur für öffentliche Assets wie CSS-Dateien oder öffentliche Bilder verwenden möchten, setzen Sie diese Einstellung auf public.

Sie können dies auch mehrfach mit verschiedenen Buckets tun. Achten Sie nur darauf, dass Sie für jeden neuen Bucket andere Umgebungsvariablen verwenden. Ich bevorzuge es, zwei Buckets zu erstellen, einen öffentlichen und einen privaten, um eine klarere Trennung zwischen öffentlich zugänglichen Dateien und privaten Dateien zu haben.

'object_storage_private' => [
		'driver' => 's3',
		'key' => env('OBJECT_STORAGE_PRIVATE_ACCESS_KEY_ID'),
		'secret' => env('OBJECT_STORAGE_PRIVATE_SECRET_ACCESS_KEY'),
		'region' => env('OBJECT_STORAGE_PRIVATE_DEFAULT_REGION'),
		'bucket' => env('OBJECT_STORAGE_PRIVATE_BUCKET'),
		'url' => env('OBJECT_STORAGE_PRIVATE_URL'),
		'endpoint' => env('OBJECT_STORAGE_PRIVATE_ENDPOINT'),
		'use_path_style_endpoint' => env('OBJECT_STORAGE_PRIVATE_USE_PATH_STYLE_ENDPOINT', false),
		'visibility' => 'private',
		'throw' => false,
],
'object_storage_public' => [
		'driver' => 's3',
		'key' => env('OBJECT_STORAGE_PUBLIC_ACCESS_KEY_ID'),
		'secret' => env('OBJECT_STORAGE_PUBLIC_SECRET_ACCESS_KEY'),
		'region' => env('OBJECT_STORAGE_PUBLIC_DEFAULT_REGION'),
		'bucket' => env('OBJECT_STORAGE_PUBLIC_BUCKET'),
		'url' => env('OBJECT_STORAGE_PUBLIC_URL'),
		'endpoint' => env('OBJECT_STORAGE_PUBLIC_ENDPOINT'),
		'use_path_style_endpoint' => env('OBJECT_STORAGE_PUBLIC_USE_PATH_STYLE_ENDPOINT', false),
		'visibility' => 'public',
		'throw' => false,
],

Irgendwelche Vorschläge?

Benutze den Chat in der rechten unteren Ecke