Arbeiten mit Range- und partNumber-Headern - Amazon Simple Storage Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Arbeiten mit Range- und partNumber-Headern

Wenn Sie mit großen Objekten in Amazon S3 Object Lambda arbeiten, können Sie den Range-HTTP-Header verwenden, um einen bestimmten Bytebereich von einem Objekt herunterzuladen. Sie können gleichzeitige Verbindungen zu Amazon S3 verwenden, um verschiedene Bytebereiche aus demselben Objekt abzurufen. Sie können auch den partNumber-Parameter (eine Ganzzahl zwischen 1 und 10 000) verwenden, der eine „ranged“ Anforderung für das angegebene Teil des Objekts ausführt.

Weil es mehrere Möglichkeiten gibt, eine Anforderung zu bearbeiten, die den Range- oder partNumber-Parameter beinhaltet, wendet S3 Object Lambda diese Parameter nicht auf das transformierte Objekt an. Stattdessen muss Ihre AWS Lambda Funktion diese Funktionalität nach Bedarf für Ihre Anwendung implementieren.

Wenn Sie die Parameter Range und partNumber mit S3 Object Lambda verwenden möchten, gehen Sie wie folgt vor:

  • Aktivieren Sie diese Parameter in der Konfiguration Ihres Object Lambda Access Point.

  • Schreiben Sie eine Lambda-Funktion, die Anforderungen verarbeiten kann, die diese Parameter enthalten.

In den folgenden Schritten wird beschrieben, wie Sie dies erreichen.

Schritt 1: Konfigurieren Ihres Object Lambda Access Point

Standardmäßig antworten Object Lambda Access Points mit dem HTTP-Statuscodefehler 501 (Nicht implementiert) auf jede GetObject- oder HeadObject-Anforderung, die entweder in den Headern oder in den Abfrageparametern einen Range- oder partNumber-Parameter enthält.

Damit ein Object-Lambda-Zugriffspunkt solche Anforderungen annehmen kann, müssen Sie GetObject-RangeGetObject-PartNumberHeadObject-Range oder HeadObject-PartNumber in den AllowedFeatures-Abschnitt die Konfiguration Ihres Object-Lambda-Zugangspunkts einschließen. Weitere Informationen zur Aktualisierung der Konfiguration Ihres Object Lambda Access Point finden Sie unter Erstellen von Objekt-Lambda-Zugriffspunkten.

Schritt 2: Implementieren Sie das Range oder partNumber in Ihrer Lambda-Funktion

Wenn Ihr Object Lambda Access Point Ihre Lambda-Funktion mit einer GetObject- oder HeadObject-Bereichsanforderung aufruft, ist der Range- oder partNumber-Parameter im Ereigniskontext enthalten. Die Position des Parameters im Ereigniskontext hängt davon ab, welcher Parameter verwendet wurde und wie er in die ursprüngliche Anforderung an den Object Lambda Access Point aufgenommen wurde, wie in der folgenden Tabelle erläutert.

Parameter Ort des Ereigniskontexts

Range (Header)

userRequest.headers.Range

Range (Abfrageparameter)

userRequest.url (Abfrageparameter Range)

partNumber

userRequest.url (Abfrageparameter partNumber)

Wichtig

Die bereitgestellte vorsignierte URL für Ihren Object Lambda Access Point enthält nicht den Range- oder partNumber-Parameter aus der ursprünglichen Anforderung. In den folgenden Optionen erfahren Sie, wie Sie diese Parameter in Ihrer AWS Lambda Funktion handhaben können.

Nachdem Sie den Range- oder partNumber-Wert extrahiert haben, können Sie einen der folgenden Ansätze wählen, basierend auf den Anforderungen Ihrer Anwendung:

  1. Ordnen Sie den angeforderten Range- oder partNumber-Wert dem transformierten Objekt zu (empfohlen).

    Die zuverlässigste Art, Range- oder partNumber-Anforderungen zu bearbeiten, ist folgende:

    • Rufen Sie das vollständige Objekt aus Amazon S3 ab.

    • Transformieren Sie das Objekt.

    • Wenden Sie die angeforderten Range- oder partNumber-Parameter auf das transformierte Objekt an.

    Verwenden Sie dazu die bereitgestellte vorsignierte URL, um das gesamte Objekt von Amazon S3 abzurufen und das Objekt dann nach Bedarf zu verarbeiten. Ein Beispiel für eine Lambda-Funktion, die einen Range Parameter auf diese Weise verarbeitet, finden Sie in diesem Beispiel im AWS GitHub Samples-Repository.

  2. Ordnen Sie den angeforderten Range der vorsignierten URL zu.

    In einigen Fällen kann Ihre Lambda-Funktion den angeforderten Range direkt der vorsignierten URL zuordnen, um nur einen Teil des Objekts von Amazon S3 abzurufen. Dieser Ansatz ist nur dann geeignet, wenn Ihre Transformation die beiden folgenden Kriterien erfüllt:

    1. Ihre Transformationsfunktion kann auf partielle Objektbereiche angewendet werden.

    2. Das Anwenden der Range-Parameter vor oder nach der Transformationsfunktion führt zu demselben transformierten Objekt.

    Beispielsweise erfüllt eine Transformationsfunktion, die alle Zeichen in einem ASCII-kodierten Objekt in Großbuchstaben konvertiert, beide vorhergehenden Kriterien. Die Transformation kann auf einen Teil eines Objekts angewendet werden, und durch Anwenden des Range-Parameters vor der Transformation wird das gleiche Ergebnis erzielt wie beim Anwenden des Parameters nach der Transformation.

    Im Gegensatz dazu erfüllt eine Funktion, die die Zeichen in einem ASCII-kodierten Objekt umkehrt, diese Kriterien nicht. Eine solche Funktion erfüllt Kriterium 1, da sie auf partielle Objektbereiche angewendet werden kann. Sie erfüllt jedoch nicht Kriterium 2, da das Anwenden des Range-Parameters vor der Transformation andere Ergebnisse erzielt als das Anwenden des Parameters nach der Transformation.

    Betrachten Sie eine Anforderung, die Funktion auf die ersten drei Zeichen eines Objekts mit dem Inhalt abcdefg anzuwenden. Das Anwenden des Range-Parameters vor der Transformation ruft nur abcab und kehrt dann die Daten um und gibt cba zurück. Wenn der Parameter jedoch nach der Transformation angewendet wird, ruft die Funktion das gesamte Objekt ab, kehrt es um und wendet dann den Range-Parameter, um gfe zurückzugeben. Da diese Ergebnisse unterschiedlich sind, sollte diese Funktion den Range-Parameter beim Abrufen des Objekts von Amazon S3 nicht anwenden. Stattdessen sollte es das gesamte Objekt abrufen, die Transformation durchführen und erst dann den Range-Parameter anwenden.

    Warnung

    In vielen Fällen führt die Anwendung des Range-Parameters für die vorsignierte URL zu einem unerwarteten Verhalten durch die Lambda-Funktion oder den anfordernden Client. Wenn Sie nicht sicher sind, dass Ihre Anwendung ordnungsgemäß funktioniert, wenn Sie nur ein Teilobjekt von Amazon S3 abrufen, empfehlen wir Ihnen, vollständige Objekte abzurufen und zu transformieren, wie zuvor in Ansatz A beschrieben.

    Wenn Ihre Anwendung die zuvor in Ansatz B beschriebenen Kriterien erfüllt, können Sie Ihre AWS Lambda Funktion vereinfachen, indem Sie nur den angeforderten Objektbereich abrufen und dann Ihre Transformation für diesen Bereich ausführen.

    Im folgenden Java-Codebeispiel wird folgende Vorgehensweise gezeigt:

    • Rufen Sie den Range-Header aus der GetObject-Anforderung ab.

    • Fügen Sie der vorsignierten URL den Range-Header hinzu, mit dem Lambda den angeforderten Bereich von Amazon S3 abrufen kann.

    private HttpRequest.Builder applyRangeHeader(ObjectLambdaEvent event, HttpRequest.Builder presignedRequest) { var header = event.getUserRequest().getHeaders().entrySet().stream() .filter(e -> e.getKey().toLowerCase(Locale.ROOT).equals("range")) .findFirst(); // Add check in the query string itself. header.ifPresent(entry -> presignedRequest.header(entry.getKey(), entry.getValue())); return presignedRequest; }