2016-08-30 6 views
0

Ich habe eine iOS-App, die von AWS (EC2 und anderen Diensten) unterstützt wird. Aber ich habe eine Frage bezüglich des Hochladens von benutzergenerierten Dateien wie Bildern und Videos in das Backend. Ich denke entweder, sie direkt in S3-Buckets hochzuladen oder auf EC2 hochzuladen und EC2 sie an S3-Buckets weitergeben zu lassen. Ich lehne das Hochladen auf EC2 vor, weil ich nicht möchte, dass irgendjemand Schreibzugriff auf mein Dateisystem hat, aber dies wird wahrscheinlich viel schweres Heben für meine EC2-Instanz erfordern. Wie kann ich die Sicherheit ohne Verwendung temporärer URLs sicherstellen, wenn ich direkt auf S3 hochlade (ich verwende SDWebImage, um die Bilder herunterzuladen und zwischenzuspeichern, veranlassen temporäre URLs, dass SDWebImage dieselben Bilder herunterladen, anstatt sie von lokal abzurufen)? Irgendwelche Vorschläge werden sehr geschätzt.iOS mit AWS EC2-Endpunkt oder S3

Antwort

0

Also werden Sie dies über Lambda entkoppeln wollen.

Verwenden Sie nicht EC2. Eher unnötig.

einen S3-Bucket "app-was auch immer" genannt erstellen

Ihre Eimer privat halten. Sie müssen den Benutzern keinen Zugriff auf die Dinge geben. Sie können private mit generierten URLs sein. Jeder Benutzer habe seinen eigenen Ordner (das ist das Präfix).

Um ausgefallen zu sein, setzen Sie jedes Element in S3 vom Benutzerende. Lassen Sie jede Taste nach dem Zufallsprinzip mit der Formel 'arc4' von ios oder was auch immer Sie wollen, dann hängen Sie den Dateityp an. So blahblab.png

Setzen Sie ein Metadatenfeld mit der Datei thumbnail und den Wert des Dateinamens plus -thumb. So blahblah-thumb.png

Rekapit .: Sie laden eine einzelne Datei in S3 mit dem Metadatenfeld thumbnail. Das ist es.

Erstellen Sie dann eine Lambda-Funktion, die auf jede einzelne PUT-Datei von S3 reagiert. Wenn Sie Node.JS mögen, verwenden Sie das imagemagick-Modul (schön für Sie enthalten), um ein 128x128 Thumbnail oder was auch immer zu erzeugen. Die Lambda-Funktion empfängt die S3-Daten für die Datei. Ruft die Hauptdatei (Schlüsselname) für die Quelldatei ab, und die Miniatur-Metadaten werden als Ausgabe ausgegeben. Führen Sie Ihre IM-Funktion aus und legen Sie die Ausgabedatei in den S3-Bucket. Jetzt haben Sie zwei Dateien im Bucket. Groß.

Jetzt, wenn Sie diese Dateien auflisten, DONT DOWNLOAD JEDER. Abrufen der Metadaten aus der Datei und Abrufen eines presignedUrl für den Schlüssel in den Metadaten.

Dies wird schnell sein. Schauen Sie sich zum Beispiel HD Camera von iSkore im App Store an.

+0

Wenn der S3-Bucket privat ist, wie kann ich SDWebImage mit den URLs zum Herunterladen von Bildern verwenden? Der Zugang würde verweigert werden? – jackson

+0

Sie rufen 's3.getSignedUrl' und es bietet Ihnen eine temporäre Verbindung, die Sie an SDWebImage – iSkore

+0

ich sehe. Dieser Link ändert sich jedes Mal richtig? Wie kann SDWebImage das Bild dann zwischenspeichern? Da SDWebImage die URL als Schlüssel für die Abfrage von Festplatte und Arbeitsspeicher verwendet, ändert sich der Schlüssel bei einer Änderung der URL ebenfalls. Dann wird SDWebImage denken, dass es dieses Bild nie zuvor bekommen hat, also wird es es aus dem Internet herunterladen. – jackson

0

Es hängt wirklich davon ab, was Ihre Gründe für die Einschränkung sind. Wenn du der App die Erlaubnis gibst, das Bild auf deinen EC2-Server hochzuladen und es dann einfach an S3 weiterleitet, was gewinnst du? Mit S3 können Sie wichtige Vorabfixierungen verwenden, um Objekte basierend auf dem Benutzer einzuschränken (was bei Verwendung von Cognito zur Authentifizierung leicht ist). Zum Beispiel können Sie es so einrichten, dass Ihre S3-Struktur etwa /images/{userId}/myImage.jpg ist und jeder Benutzer nur in seinen Ordner hochladen kann. Sie können es ganz privat machen, oder Sie können andere Benutzer aus diesem Ordner lesen lassen, aber nicht schreiben ect ...

Einige Gedanken: -Sie schwarze Liste Benutzer könnte möglicherweise -Sie Anfragen drosseln könnte, oder prüfen und ablehnen bestimmte Bilder -Sie könnten ein komplizierteres Sicherheitsmodell als S3 bietet

Sie könnten API Gateway für die ersten beiden Anwendungsfälle verwenden.

Wenn Sie ec2 verwenden möchten, wird sich ja die vor-signierte URL ändern. Ich bin mir nicht sicher, wie SDWebImage funktioniert, daher kann ich seine Cache-Fähigkeit nicht kommentieren.