1

Ich habe ein Problem mit der Verwendung von API-Gateway als Proxy zu S3 (für die benutzerdefinierte Authentifizierung), da es nicht gut mit binären Daten gut (was ist a bekanntes Problem).AWS API-Gateway zu S3 - PUT Content-Encoding .Z Dateien

Ich lade in der Regel entweder. GZ oder. Z (Unix-Komprimierungsprogramm) Dateien. Soweit ich es verstehe, werden die Daten aufgrund von Codierungsproblemen nicht beibehalten. Ich bin nicht in der Lage, einen Weg zu finden, die Daten zurück in Binärdaten zu decodieren.

Ursprüngliches führendes Bytes \x1f\x8b\x08\x08\xb99\xbeW\x00\x03

Nach Durchlaufen API GW: ��9�W�

... Gefolgt von Dateinamen und dem Rest der Daten.

Eine Möglichkeit, dies zu umgehen, ist die Angabe von Content-Encoding im Header der PUT-Anfrage an API GW als 'gzip'. Dies zwingt API GW dazu, die Datei zu dekomprimieren, bevor sie an S3 weitergeleitet wird.

Das gleiche funktioniert nicht für .Z-Dateien, die mit dem Unix-Komprimierungsprogramm komprimiert wurden. Wo sollten Sie die Inhalts-Codierung als 'komprimieren' angeben.

Hat jemand einen Einblick darüber, was mit den Daten passiert, um etwas Licht in mein Problem zu bringen? Kennt jemand eine mögliche Problemumgehung, um die Kodierung meiner Daten während des Passierens von API GW zu erhalten (oder um es zu decodieren, sobald es in S3 ist)?

Offensichtlich konnte ich direkt auf die S3-API zugreifen (oder API GW eine vor-signierte URL für den Zugriff auf die S3-API zurückgeben), aber es gibt einige Gründe, warum ich das nicht möchte.

Ich sollte erwähnen, dass ich überhaupt nicht viel über Kodierung verstehe - Entschuldigung, wenn es einige offensichtliche Antworten auf einige meiner Fragen gibt.

Antwort

2

Es ist nicht gerade ein "Codierungs-Problem" - es ist die Tatsache, dass API-Gateway nur doesn't support binary data ("yet") ... so wird es potenziell binäre Daten korrumpieren, abhängig von den Besonderheiten der fraglichen Daten.

Hochladen als Content-Encoding: gzip wahrscheinlich Decodierung in einem Front-End-Komponente löst, die ist Lage ist, mit binären Daten handelt (gzip, schließlich, ist eine Standard-Codierung und ist binär), bevor die Anforderung Körper auf die Kern-Infrastruktur verläuft. .. aber Sie werden mit ziemlicher Sicherheit feststellen, dass dies ein Workaround ist, der nicht immer korrekte Ergebnisse liefert, abhängig von der spezifischen Nutzlast. Die Tatsache, dass es überhaupt funktioniert, scheint eher ein Fehler als ein Feature zu sein.

Für jetzt ist die einzige konsequent praktikable Option Base64-Codierung Ihrer Nutzlast, die seine Größe auf dem Draht um 33% erhöht (Base64-Codierung produziert 4 Bytes der Ausgabe für jede 3 Bytes der Eingabe), so ist es nicht viel einer Lösung. Base64 + gzip mit der entsprechenden Content-Encoding: gzip sollte auch funktionieren, was ein ziemlich alberner Vorschlag scheint (konvertiert eine komprimierte Datei in base64 dann gzipping das Ergebnis zu versuchen, seine Größe auf dem Draht zu reduzieren), sollte aber konsistent mit dem sein, was API Gateway derzeit liefern kann.

+0

Vielen Dank für Ihre Antwort. Ich arbeite gerade an der Umwandlung der Daten mit '$ util.base64Encode ($ input.body)' in einem Body Mapping Template für alles mit dem Content-Type 'application/x-gzip' (wird das selbe für' application/tun komprimieren "). Aber ich kann es nicht einfach dazu bringen, es zu transformieren und an eine Datei weiterzugeben. Ich verwende die Standardvorlage 'Method Request Passthrough' und ändere den 'body-json' mit' $ util.base64Encode'. Es speichert nur den JSON in der Datei. Obwohl das 'body-json'-Feld die transformierten Daten enthält. – unclemeat

+0

Nevermind - Ich sehe, dass Sie nur '$ util.base64Encode ($ input.body)' mit keiner anderen Information/json tun müssen. Danke noch einmal. – unclemeat

+1

Ich dachte über das Codieren auf dem Client, das Senden als eine urlencodierte Form und das Decodieren von einem Eingabeparameter in der Lambda-Funktion, API-Gateway glücklicherweise nicht bewusst zu lassen, was Sie taten, nicht an der Transformation teilnehmend. Ehrlich gesagt, scheint es potentiell mehr Ärger zu geben als es wert ist, bis die Plattform 8-Bit-sauber und oktent-agnostisch ist. –