Wenn Sie S3 zum Speichern von Daten aus Benutzer-Uploads verwenden, insbesondere in einer verteilten Umgebung, ist eine wichtige Überlegung die Tatsache, dass S3 "letztendlich konsistent" ist (obwohl einige Regionen Lese-nach-Schreib-konsistent sind). Dies hat zur Folge, dass Sie eine Datei möglicherweise erfolgreich hochladen. Wenn Sie jedoch unmittelbar danach prüfen, ob sie vorhanden ist, stellen Sie möglicherweise fest, dass sie nicht vorhanden ist. Dieses Problem ist bei Szenarien wie Aktualisierungen oder Löschvorgängen stärker ausgeprägt, bei denen selbst die Konsistenz zwischen Lesen und Schreiben nicht hilft.
Das Obige gilt für Ihre Uploads in S3, unabhängig davon, welchen Ansatz Sie wählen. Tatsächlich gilt dies für die meisten Probleme, die man von S3 erwarten kann - es ist weniger der Ansatz zum Speichern der Daten als vielmehr die Einschränkungen von S3, die wahrscheinlich am problematischsten sind.
S3fs verwendet die S3-API - genau wie das PHP (oder ein anderes) SDK. Darüber hinaus ist S3 für relativ hohe Parallelitätsraten ausgelegt. Abgesehen von den Konsistenzproblemen sollte es also kein Problem geben, es auf mehreren Instanzen zu mounten (denken Sie daran, dass es sich nicht um ein herkömmliches Dateisystem handelt - Probleme wie Sperren, usw. werden auf der S3-Seite behandelt).
Allerdings gibt es bei jeder Implementierung einige potenzielle Vor- und Nachteile:
S3fs:
- Keine Unterstützung für teilweise / blockierte Downloads (soweit ich weiß) - daher müssen Sie die vollständige Datei herunterladen, um einen Teil davon zu lesen - wahrscheinlich kein Problem, wenn Sie sie nur zum Speichern (und Bereitstellen) von Uploads verwenden.
- In C ++ geschrieben mögliche Leistungssteigerungen
- Ihre Anwendung profitiert von Updates für s3fs
- Implementiert das Caching (sowohl für vollständige Dateien als auch für Dateiinformationen) - hat das Potenzial, die Geschwindigkeit ein wenig zu verbessern und die Kosten zu senken
- Beschränkt auf die Funktionen, die die Sicherung freigibt
SDK:
- Enthüllt alle Funktionen, die S3 zu bieten hat. Abhängig von Ihrem Anwendungsfall kann dies ausreichen, um die Verwendung des SDK zu verdienen
- Potenziell engere Integration in Ihre Anwendung - Die zurückgegebenen Fehler usw. können es Ihrer Anwendung ermöglichen, fundiertere (und daher präzisere) Entscheidungen zu treffen
- Mögliche Vorteile müssen codiert werden - Ihre Anwendung muss sie nutzen und über zukünftige Änderungen an S3 auf dem Laufenden gehalten werden
- Mehr Komplexität und Overhead für Ihren Code
In Bezug auf "Sicherheit" können Sie "Verhinderung von Datenkorruption" oder "Verhinderung von nicht autorisiertem Zugriff" bedeuten. In Bezug auf Ersteres könnte das SDK ein wenig helfen, um mit eventueller Konsistenz umzugehen (in Form von ausführlicheren Fehlern), aber der zugrunde liegende Speicher ist der gleiche, und ich erwarte, dass die Unterschiede gering sind. In Bezug auf die Zugriffskontrolle können Sie IAM verwenden, um ein eingeschränktes Konto zu erstellen. Dieses Konto benötigt jedoch weiterhin Lese- / Schreibzugriff auf Ihre S3-Dateien. Beide sollten ausreichend sicher sein. In beiden Fällen muss Ihr System kompromittiert werden, um Zugriff auf Ihren S3-Bucket zu erhalten. Ich würde jedoch empfehlen, dies mit S3fs zu tun (da die Anmeldeinformationen normalerweise außerhalb des Webroots gespeichert sind und über überhaupt nicht zugänglich sind PHP) gibt es etwas bessere Sicherheit.
Persönliche Meinung: Ich würde s3fs für einen Fall bevorzugen, in dem es ein einzelnes Upload-Verzeichnis gibt (z. B. eine Site, die davon Gebrauch macht) und der Zugriff ziemlich einfach ist (nur Dateien hochladen und gelegentlich aktualisieren / löschen müssen). Wenn Sie einen komplexeren Zugriff benötigen (z. B. teilweise Downloads, mehrere Buckets usw.) oder das S3 SDK für andere Zwecke verwenden möchten, würde ich mich auch für die Uploads an das SDK halten.