it-swarm.com.de

Wie kann ich einen S3-Bucket in eine EC2-Instanz einbinden und mit PHP darauf schreiben?

Ich arbeite an einem Projekt, das in Amazon Web Services gehostet wird. Das Server-Setup besteht aus zwei EC2-Instanzen, einem Elastic Load Balancer und einem zusätzlichen Elastic Block Store, in dem sich die Webanwendung befindet. Das Projekt ist Angeblich S3 für die Speicherung von Dateien, die Benutzer hochladen. Um dieser Frage willen werde ich den S3-Bucket static.example.com Nennen.

Ich habe versucht, s3fs ( https://code.google.com/p/s3fs/wiki/FuseOverAmazon ), RioFS ( https: //github.com/skoobe/riofs ) und s3ql ( https://code.google.com/p/s3ql/ ). s3fs Stellt das Dateisystem bereit, lässt mich aber nicht in den Bucket schreiben (Ich habe diese Frage zu SO gestellt: Wie kann ich ein S3-Volume mit den richtigen Berechtigungen mithilfe von Fuse bereitstellen). RioFS stellt das Dateisystem bereit und lässt mich von der Shell aus in den Bucket schreiben, aber Dateien, die mit PHP) gespeichert wurden, werden nicht im Bucket angezeigt (ich habe ein Problem geöffnet) mit dem Projekt auf GitHub). s3ql wird den Bucket mounten, aber keine der Dateien, die sich bereits im Bucket befinden, werden im Dateisystem angezeigt.

Dies sind die Mount-Befehle, die ich verwendet habe:

s3fs static.example.com -ouse_cache=/tmp,allow_other /mnt/static.example.com
riofs -o allow_other http://s3.amazonaws.com static.example.com /mnt/static.example.com
s3ql mount.s3ql s3://static.example.com /mnt/static.example.com

Ich habe auch versucht, diese S3-Klasse zu verwenden: https://github.com/tpyo/Amazon-s3-php-class/ und dieses FuelPHP-spezifische S3-Paket: https: // github.com/tomschlick/fuel-s . Ich konnte mit dem FuelPHP-Paket die verfügbaren Buckets und Dateien auflisten, aber das Speichern der Dateien im Bucket schlug fehl (aber es trat kein Fehler auf).

Haben Sie jemals einen S3-Bucket auf einem lokalen Linux-Dateisystem gemountet und PHP zum erfolgreichen Schreiben einer Datei in den Bucket verwendet? Welche Tools haben Sie verwendet? Wenn Sie eines der oben genannten verwendet haben tools, welche version hast du benutzt?

[~ # ~] edit [~ # ~] Ich wurde informiert, dass das Problem, das ich mit RioFS auf GitHub geöffnet habe, behoben wurde . Obwohl ich mich für die Verwendung von S3 REST API entschieden habe, anstatt zu versuchen, einen Bucket als Volume bereitzustellen, scheint RioFS eine gangbare Option zu sein heutzutage.

54
Ben Harold

Haben Sie jemals einen S3-Bucket auf einem lokalen Linux-Dateisystem gemountet?

Nein, es macht Spaß zu testen, aber ich würde es nicht in die Nähe eines Produktionssystems lassen. Es ist viel besser, eine Bibliothek für die Kommunikation mit S3 zu verwenden. Hier ist der Grund:

  1. Fehler werden nicht ausgeblendet. Ein Dateisystem hat nur wenige Fehlercodes, die es Ihnen senden kann, um auf ein Problem hinzuweisen. Eine S3-Bibliothek gibt Ihnen die genaue Fehlermeldung von Amazon, damit Sie verstehen, was los ist, protokollieren, Eckfälle behandeln usw.
  2. Eine Bibliothek benötigt weniger Speicher. Auf Dateisystemebenen werden viele zufällige Elemente zwischengespeichert, die Sie häufig nie wieder verwenden. Eine Bibliothek gibt Ihnen die Kontrolle darüber, was zwischengespeichert und nicht zwischengespeichert werden soll.
  3. Erweiterung. Wenn Sie jemals etwas Besonderes tun müssen (eine Zugriffssteuerungsliste für eine Datei festlegen, einen signierten Link erstellen, Versionierung, Lebenszyklus, Haltbarkeit ändern usw.), müssen Sie Ihre Dateisystemabstraktion sichern und trotzdem eine Bibliothek verwenden.
  4. Timing und Wiederholungsversuche. Ein Teil der Anforderungen ist zufällig fehlerhaft und kann wiederholt werden. Manchmal möchten Sie möglicherweise viele Versuche wiederholen, manchmal möchten Sie lieber schnell einen Fehler machen. Ein Dateisystem gibt Ihnen keine detaillierte Kontrolle, eine Bibliothek jedoch.

Die Quintessenz ist, dass S3 unter Sicherung ein ndichte Abstraktion ist. S3 hat (oder braucht) keine Verzeichnisse. Dateisysteme wurden nicht für Milliarden von Dateien erstellt. Ihre Berechtigungsmodelle sind nicht kompatibel. Sie verschwenden viel Energie von S3, indem Sie versuchen, es in ein Dateisystem zu integrieren.

Zwei zufällige PHP Bibliotheken für das Gespräch mit S3:

https://github.com/KnpLabs/Gaufrette

https://aws.Amazon.com/sdkforphp/ - Diese Option ist hilfreich, wenn Sie nicht nur S3 verwenden, sondern auch eine der oben genannten ausgefallenen Anforderungen ausführen müssen.

51

Häufig ist es vorteilhaft, Dateien auf das EBS-Volume zu schreiben und anschließend öffentliche Anforderungen für die Weiterleitung der Datei (en) durch CloudFront CDN zu erzwingen.

Auf diese Weise ist es viel einfacher, wenn die App Transformationen an der Datei vornehmen muss, diese auf dem lokalen Laufwerk und im lokalen System auszuführen und dann die Anforderung zu erzwingen, dass die transformierten Dateien über CloudFront aus Origin abgerufen werden.

z.B. Wenn Ihr Benutzer ein Bild für einen Avatar hochlädt und das Avatar-Bild mehrere Iterationen für Größe und Zuschneiden benötigt, kann Ihre App diese auf dem lokalen Volume erstellen. Alle öffentlichen Anforderungen für die Datei erfolgen jedoch über eine Origin-Pull-Anforderung in der Cloud . Auf diese Weise haben Sie maximale Flexibilität, um die ursprüngliche Datei (oder eine optimierte Version der Datei) beizubehalten. Bei nachfolgenden Benutzeranforderungen kann entweder eine vorhandene Version von Cloud Front Edge abgerufen werden, oder Cloud Front leitet die Anforderung zurück an die App und erstellen Sie alle erforderlichen Iterationen.

Ein elementares Beispiel hierfür ist WordPress, mit dem Sie von jedem hochgeladenen Grafikbild eine Version in mehreren Größen/Ausschnitten erstellen und das Original beibehalten können (vorbehaltlich Dateigrößenbeschränkungen und/oder Plugin-Transformationen). CDN-fähige WordPress Plugins wie W3 Total Cache schreiben Anforderungen zum Abrufen durch CDN um, sodass die App nur eindeutige Iterationen für erste Anforderungen erstellen muss. Browser-Caching hinzufügen URL-Versionierung ( http : //domain.tld/datei.php? x12 ) verfeinert und nutzt die CDN-Funktionalität weiter.

Wenn Sie sich Sorgen über eine schnelle Erweiterung der Dateigröße oder der Inodes von EBS-Volumes machen, können Sie einen Bereinigungsprozess für selten angeforderte oder veraltete Dateien automatisieren.

2
PlayGod