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

Utilisation des en-têtes Range et partNumber

Note

À compter du 7 novembre 2025, S3 Object Lambda sera réservé aux clients existants qui utilisent actuellement le service, ainsi qu’à certains partenaires AWS Partner Network (APN). Si vous souhaitez utiliser le service, veuillez vous y inscrire avant le 7 novembre 2025. Pour des fonctionnalités semblables à celles de S3 Object Lambda, cliquez ici : Modification de la disponibilité d’Amazon S3 Object Lambda.

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é. À la place, votre fonction AWS Lambda doit implémenter cette fonctionnalité en fonction des 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 invoque 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 de la demande Range)

partNumber

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

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 découvrir comment gérer ces paramètres dans votre fonction AWS Lambda.

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 voir une fonction Lambda qui traite un paramètre Range de cette façon, 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 fonction AWS Lambda en extrayant uniquement la plage d’objet 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; }