Aufgabe

Die Verwendung von Amazon S3 soll a) nicht öffentlich gemacht werden und/oder man b) möchte den Zugriff per zusätzlicher Authentifizierung absichern. Es gilt also, durch eine Anfrage per HTTP einen Download bei S3 anzustoßen und den Inhalt entsprechend zurückzuschreiben.

Option 1: Download auf Temp-File / Speicher

Zunächst kann man natürlich ganz allgemein den Download abstoßen, den Inhalt lokal auf dem Server in eine Datei packen und anschließend dem Client zurückzuschicken.

Problem 1
Selbst bei guter Anbindung des Servers an S3 muss man erst alles laden und erst bei Beendigung des Downloads kann man dem Benutzer die Datei schicken. Dieser Delay ist unschön.
Problem 2
Sollte die Datei größer sein, verbraucht man (unnötigerweise) Platz auf dem Server.
Problem 3
Eventuell ist es aus Sicherheitsgründen auch nicht wünschenswert.

Option 2: Download direkt auf Client speichern

Sobald der Download angestoßen wurde und Daten liefert, werden die Chunks (Buffer-Pakete) sofort dem Stream der laufenden HTTP-Anfrage rausgeschrieben. Damit wird sichergestellt, dass weder auf der lokalen Platte oder im Speicher des Servers unnötige Daten gespeichert werden müssen.

Code liegt bei GitHub, wo denn sonst.

Sonstiges

  • Die NodeJS Library knox setzt auf aws-sdk auf und bietet ein Wrapper um die AWS-S3-Response. Damit ist dies Lösung oben geringfügig einfacher zu realisieren.
  • Eine Alternative zu der ganzen Thematik können auch so genannte Signed URLs sein. Eine Signed URL auf S3-Content ermöglicht auch temporären Zugriff auf nicht öffentliche Dateien. Signed URLs sind relativ simpel, weil sie nur aus dem Expiry Date und einer Signatur (auf Basis des privaten Schlüssels des Owners) dessen bestehen.