

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
<a name="range-get-olap"></a>

**Note**  
Depuis le 7 novembre 2025, S3 Object Lambda n'est disponible que pour les clients existants qui utilisent actuellement le service, ainsi que pour certains AWS partenaires du réseau de partenaires (APN). Pour des fonctionnalités semblables à celles de S3 Object Lambda, cliquez ici : [Modification de la disponibilité d’Amazon S3 Object Lambda](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html).

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
<a name="range-get-olap-step-1"></a>

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-Range`, `GetObject-PartNumber`, `HeadObject-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](olap-create.md). 

## Étape 2 : implémenter la gestion de `Range` ou `partNumber` dans votre fonction Lambda
<a name="range-get-olap-step-2"></a>

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 `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](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration/blob/main/function/nodejs_20_x/src/response/range_mapper.ts) dans le référentiel AWS Samples GitHub .

1. **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.

   1. 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;
   }
   ```