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.
Travailler avec Range and partNumber headers
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é. Au lieu de cela, votre AWS Lambda fonction doit 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-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.
É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 |
---|---|
|
|
|
|
|
|
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 :
-
Mapper le paramètre
Range
oupartNumber
demandé à l’objet transformé (recommandé)La méthode la plus fiable pour traiter les requêtes
Range
etpartNumber
consiste à effectuer les opérations suivantes :-
Récupérez l’objet complet à partir d’Amazon S3.
-
Transformez l’objet.
-
Appliquez le paramètre
Range
oupartNumber
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 exempledans le référentiel AWS Samples GitHub . -
-
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 :-
Votre fonction de transformation peut être appliquée à des plages d’objets partielles.
-
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ètreRange
est appliqué avant la transformation, il récupère uniquementabc
, puis rétablit les données et renvoiecba
. 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ètreRange
et renvoiegfe
. Étant donné que ces résultats sont différents, cette fonction ne doit pas appliquer le paramètreRange
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ètreRange
.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êteGetObject
. -
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; }
-