Utilisation des en-têtes Range et partNumber - Amazon Simple Storage Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation des en-têtes Range et partNumber

Lorsque vous travaillez avec des objets volumineux dans Amazon S3 Object Lambda, vous pouvez utiliser l'en-tête HTTP Range pour télécharger une plage d'octets spécifiée à partir d'un objet. Pour extraire différentes plages d'octets à partir d'un même objet, utilisez des connexions simultanées à Amazon S3. Spécifiez également le paramètre partNumber (entier compris entre 1 et 10 000) pour exécuter une demande « par plage » pour la partie spécifiée de l'objet.

Étant donné qu'il existe plusieurs façons de gérer une demande qui inclut le paramètre Range ou partNumber, S3 Object Lambda n'applique pas ces paramètres à l'objet transformé. Votre AWS Lambda fonction doit plutôt implémenter cette fonctionnalité selon les besoins de votre application.

Pour utiliser les paramètres Range et partNumber avec S3 Object Lambda, procédez comme suit :

  • Activez ces paramètres dans la configuration de vos points d'accès Object Lambda.

  • Écrivez une fonction Lambda capable de gérer les demandes qui incluent ces paramètres.

Les étapes suivantes expliquent comment procéder.

Étape 1 : Configurer votre point d'accès Object Lambda

Par défaut, les points d'accès Object Lambda répondent avec une erreur de code de statut HTTP 501 (Non implémenté) à toute requête GetObject ou HeadObject contenant un paramètre Range ou partNumber, que ce soit dans les en-têtes ou les paramètres de requête.

Pour permettre à un point d'accès Object Lambda d'accepter ces demandes, vous devez inclure GetObject-RangeGetObject-PartNumberHeadObject-Range ou HeadObject-PartNumber dans la section AllowedFeatures de la configuration de votre point d'accès Object Lambda. Pour plus d'informations sur la mise à jour de votre configuration de point d'accès Object Lambda, consultez Création de points d'accès Object Lambda.

Étape 2 : implémenter la gestion de Range ou partNumber dans votre fonction Lambda

Lorsque votre point d'accès Object Lambda appelle votre fonction Lambda avec une demande GetObject ou HeadObject par plage, le paramètre Range ou partNumber est inclus dans le contexte de l'événement. L'emplacement du paramètre dans le contexte d'événement dépend du paramètre utilisé et de la façon dont il a été inclus dans la demande d'origine au point d'accès Object Lambda, comme expliqué dans le tableau suivant.

Paramètre Emplacement du contexte d'événement

Range (en-tête)

userRequest.headers.Range

Range (paramètre de la demande)

userRequest.url (paramètre Range de la demande)

partNumber

userRequest.url (paramètre partNumber de la demande)

Important

L'URL pré-signée fournie pour votre point d'accès Object Lambda ne contient pas le paramètre Range ou partNumber de la demande d'origine. Consultez les options suivantes pour savoir comment gérer ces paramètres dans votre AWS Lambda fonction.

Après avoir extrait la valeur Range ou partNumber, vous pouvez adopter l'une des approches suivantes en fonction des besoins de votre application :

  1. Mapper le paramètre Range ou partNumber demandé à l'objet transformé (recommandé)

    La méthode la plus fiable pour traiter les requêtes Range et partNumber consiste à effectuer les opérations suivantes :

    • Récupérez l'objet complet à partir d'Amazon S3.

    • Transformez l'objet.

    • Appliquez le paramètre Range ou partNumber demandé à l'objet transformé.

    Pour ce faire, utilisez l'URL pré-signée fournie afin de récupérer l'objet entier d'Amazon S3, puis traitez l'objet au besoin. Pour un exemple de fonction Lambda qui traite un Range paramètre de cette manière, consultez cet exemple dans le référentiel AWS Samples GitHub .

  2. Mappez l'élément Range demandé sur l'URL pré-signée.

    Dans certains cas, votre fonction Lambda peut mapper l'élément Range demandé directement sur l'URL pré-signée pour récupérer uniquement une partie de l'objet à partir d'Amazon S3. Cette approche n'est appropriée que si votre transformation répond aux deux critères suivants :

    1. Votre fonction de transformation peut être appliquée à des plages d'objets partielles.

    2. L'application du paramètre Range avant ou après la fonction de transformation aboutit au même objet transformé.

    Par exemple, une fonction de transformation qui convertit tous les caractères d'un objet codé en ASCII en majuscules répond aux deux critères précédents. La transformation peut être appliquée à une partie d'un objet, et l'application du paramètre Range avant la transformation donne le même résultat que son application après la transformation.

    En revanche, une fonction qui rétablit les caractères d'un objet codé en ASCII ne répond pas à ces critères. Cette fonction répond au critère 1, car elle peut être appliquée à des plages d'objets partielles. Cependant, elle ne répond pas au critère 2, car le paramètre Range appliqué avant la transformation ne donne pas le même résultat que lorsqu'il est appliqué après la transformation.

    Prenons une demande d'application de la fonction aux trois premiers caractères d'un objet avec le contenu abcdefg. Si le paramètre Range est appliqué avant la transformation, il récupère uniquement abc, puis rétablit les données et renvoie cba. Mais si le paramètre est appliqué après la transformation, la fonction récupère l'objet entier, le rétablit, puis applique le paramètre Range et renvoie gfe. Étant donné que ces résultats sont différents, cette fonction ne doit pas appliquer le paramètre Range lors de la récupération de l'objet à partir d'Amazon S3. À la place, elle doit récupérer l'objet entier, effectuer la transformation, et seulement alors appliquer le paramètre Range.

    Avertissement

    Dans de nombreux cas, l'application du paramètre Range à l'URL pré-signée entraîne un comportement inattendu de la fonction Lambda ou du client demandeur. À moins que vous ne soyez sûr que votre application fonctionne correctement lorsque vous récupérez uniquement un objet partiel d'Amazon S3, nous vous recommandons de récupérer et de transformer des objets complets comme décrit précédemment dans l'approche A.

    Si votre application répond aux critères décrits précédemment dans l'approche B, vous pouvez simplifier votre AWS Lambda fonction en récupérant uniquement la plage d'objets demandée, puis en exécutant votre transformation sur cette plage.

    L'exemple de code Java suivant montre comment effectuer les opérations suivantes :

    • Récupérer l'en-tête Range de la requête GetObject.

    • Ajouter l'en-tête Range à l'URL pré-signée que Lambda peut utiliser pour récupérer la plage demandée à partir d'Amazon S3.

    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; }