

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.

# Personnalisez à la périphérie avec CloudFront Functions
<a name="cloudfront-functions"></a>

Avec CloudFront Functions, vous pouvez écrire des fonctions légères JavaScript pour des personnalisations de CDN à grande échelle et sensibles à la latence. Vos fonctions peuvent manipuler les demandes et les réponses qui circulent CloudFront, effectuer une authentification et une autorisation de base, générer des réponses HTTP à la périphérie, etc. L'environnement d'exécution CloudFront Functions offre des temps de démarrage inférieurs à la milliseconde, s'adapte immédiatement pour traiter des millions de requêtes par seconde et est hautement sécurisé. CloudFront Functions est une fonctionnalité native de CloudFront, ce qui signifie que vous pouvez créer, tester et déployer votre code entièrement en interne CloudFront.

Lorsque vous associez une CloudFront fonction à une CloudFront distribution, CloudFront intercepte les demandes et les réponses à des emplacements CloudFront périphériques et les transmet à votre fonction. Vous pouvez appeler CloudFront Functions lorsque les événements suivants se produisent :
+ Quand CloudFront reçoit une demande d'un téléspectateur (demande du téléspectateur)
+ Before CloudFront renvoie la réponse au spectateur (réponse du spectateur)
+ Pendant l'établissement de la connexion TLS (demande de connexion) - actuellement disponible pour les connexions TLS mutuelles (MTLS)

Pour plus d'informations sur CloudFront les fonctions, consultez les rubriques suivantes :

**Topics**
+ [

# Tutoriel : Création d'une fonction simple avec CloudFront Functions
](functions-tutorial.md)
+ [

# Tutoriel : Création d'une CloudFront fonction incluant des valeurs clés
](functions-tutorial-kvs.md)
+ [

# Écriture du code de la fonction
](writing-function-code.md)
+ [

# Création de fonctions
](create-function.md)
+ [

# Fonctions de test
](test-function.md)
+ [

# Mise à jour de fonctions
](update-function.md)
+ [

# Publication de fonctions
](publish-function.md)
+ [

# Association de fonctions à des distributions
](associate-function.md)
+ [

# Amazon CloudFront KeyValueStore
](kvs-with-functions.md)

# Tutoriel : Création d'une fonction simple avec CloudFront Functions
<a name="functions-tutorial"></a>

Ce didacticiel explique comment démarrer avec CloudFront Functions. Vous pouvez créer une fonction simple qui redirige l’utilisateur vers une autre URL et renvoie également un en-tête de réponse personnalisé.

**Contents**
+ [

## Conditions préalables
](#functions-tutorial-prerequisites)
+ [

## Créer la fonction
](#functions-tutorial-create)
+ [

## Vérification de la fonction
](#functions-tutorial-verify)

## Conditions préalables
<a name="functions-tutorial-prerequisites"></a>

Pour utiliser CloudFront Functions, vous avez besoin d'une CloudFront distribution. Si vous n'en avez pas, consultez [Commencez avec une distribution CloudFront standard](GettingStarted.SimpleDistribution.md).

## Créer la fonction
<a name="functions-tutorial-create"></a>

Vous pouvez utiliser la CloudFront console pour créer une fonction simple qui redirige le lecteur vers une autre URL et renvoie également un en-tête de réponse personnalisé. 

**Pour créer une CloudFront fonction**

1. Connectez-vous à la CloudFront console AWS Management Console et ouvrez-la à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Dans le panneau de navigation, choisissez **Fonctions**, puis **Créer une fonction**. 

1. Sur la page **Créer une fonction**, pour **Nom**, entrez un nom de fonction tel que*MyFunctionName*.

1. (Facultatif) Dans **Description**, saisissez une description pour la fonction, par exemple, **Simple test function**.

1. Pour **Runtime**, conservez la JavaScript version sélectionnée par défaut.

1. Choisissez **Créer une fonction**.

1. Copiez le code de fonction suivant. Ce code de fonction redirige l'utilisateur vers une URL différente et renvoie également un en-tête de réponse personnalisé.

   ```
   function handler(event) {
       // NOTE: This example function is for a viewer request event trigger. 
       // Choose viewer request for event trigger when you associate this function with a distribution. 
       var response = {
           statusCode: 302,
           statusDescription: 'Found',
           headers: {
               'cloudfront-functions': { value: 'generated-by-CloudFront-Functions' },
               'location': { value: 'https://aws.amazon.com/cloudfront/' }
           }
       };
       return response;
   }
   ```

1. Dans **Code de fonction**, collez le code dans l’éditeur de code pour remplacer le code par défaut.

1. Sélectionnez **Enregistrer les modifications**.

1. (Facultatif) vous pouvez tester la fonction avant de la publier. Ce didacticiel ne décrit pas comment tester une fonction. Pour de plus amples informations, veuillez consulter [Fonctions de test](test-function.md).

1. Choisissez l’onglet **Publier**, puis sélectionnez **Publier la fonction**. Vous *devez* publier la fonction avant de pouvoir l'associer à votre CloudFront distribution.

1. Vous pouvez ensuite associer la fonction à une distribution ou à un comportement de cache. Sur la *MyFunctionName* page, choisissez l'onglet **Publier**. 
**Avertissement**  
Dans les étapes suivantes, choisissez une distribution ou un comportement de cache utilisé pour les tests. N’associez pas cette fonction de test à une distribution ou un comportement de cache utilisé en production.

1. Choisissez **Ajouter une association**. 

1. Dans la boîte de dialogue **Association**, choisissez une distribution et/ou un comportement de cache. Pour **Type d’événement**, conservez la valeur par défaut.

1. Choisissez **Ajouter une association**.

   La table **Distributions associées** indique la distribution associée. 

1. Attendez quelques minutes pour que la distribution associée termine son déploiement. Pour vérifier le statut de la distribution, sélectionnez la distribution dans la table **Distributions associées** et choisissez **Afficher une distribution**.

   Lorsque l'état de la distribution est **Déployé**, vous êtes prêt à vérifier que la fonction fonctionne.

## Vérification de la fonction
<a name="functions-tutorial-verify"></a>

Après avoir déployé la fonction, vous pouvez vérifier qu’elle fonctionne pour votre distribution.

**Pour vérifier la fonction**

1. Dans votre navigateur web, accédez au nom de domaine de votre distribution (par exemple, `https://d111111abcdef8.cloudfront.net`).

   La fonction renvoie une redirection vers le navigateur, de sorte que le navigateur ouvre automatiquement `https://aws.amazon.com/cloudfront/`.

1. Dans une fenêtre de ligne de commande, vous pouvez utiliser un outil tel que **curl** pour envoyer une demande au nom de domaine de votre distribution.

   ```
   curl -v https://d111111abcdef8.cloudfront.net/
   ```

   La réponse affiche la réponse de redirection (`302 Found`) et les en-têtes de réponse personnalisés ajoutés par la fonction. Votre réponse peut ressembler à l’exemple suivant.  
**Example**  

   ```
   curl -v https://d111111abcdef8.cloudfront.net/
   > GET / HTTP/1.1
   > Host: d111111abcdef8.cloudfront.net
   > User-Agent: curl/7.64.1
   > Accept: */*
   >
   < HTTP/1.1 302 Found
   < Server: CloudFront
   < Date: Tue, 16 Mar 2021 18:50:48 GMT
   < Content-Length: 0
   < Connection: keep-alive
   < Location: https://aws.amazon.com/cloudfront/
   < Cloudfront-Functions: generated-by-CloudFront-Functions
   < X-Cache: FunctionGeneratedResponse from cloudfront
   < Via: 1.1 3035b31bddaf14eded329f8d22cf188c.cloudfront.net (CloudFront)
   < X-Amz-Cf-Pop: PHX50-C2
   < X-Amz-Cf-Id: ULZdIz6j43uGBlXyob_JctF9x7CCbwpNniiMlmNbmwzH1YWP9FsEHg==
   ```

# Tutoriel : Création d'une CloudFront fonction incluant des valeurs clés
<a name="functions-tutorial-kvs"></a>

Ce didacticiel explique comment inclure des valeurs clés dans une CloudFront fonction. Les valeurs de clés font partie d’une paire clé-valeur. Vous incluez le nom (provenant de la paire clé-valeur) dans le code de la fonction. Lorsque la fonction s'exécute, CloudFront remplace le nom par la valeur. 

Les paires clé-valeur sont des variables stockées dans un magasin de clés-valeurs. Lorsque vous utilisez une clé dans votre fonction (à la place de valeurs codées en dur), votre fonction est plus flexible. Vous pouvez modifier la valeur de la clé sans avoir à déployer de modifications de code. Les paires clé-valeur peuvent également réduire la taille de votre fonction. Pour de plus amples informations, veuillez consulter [Amazon CloudFront KeyValueStore](kvs-with-functions.md).

**Contents**
+ [

## Conditions préalables
](#functions-kvs-tutorial-prerequisites)
+ [

## Création du magasin de clés-valeurs
](#functions-kvs-tutorial-kvs-step)
+ [

## Ajout des paires clé-valeur au magasin de clés-valeurs
](#add-key-value-pairs-to-store)
+ [

## Association du magasin de clés-valeurs à la fonction
](#functions-kvs-tutorial-functions-step)
+ [

## Test et publication du code de la fonction
](#test-and-publish-function-code)

## Conditions préalables
<a name="functions-kvs-tutorial-prerequisites"></a>

Si vous découvrez les CloudFront fonctions et le magasin de valeurs clés pour la première fois, nous vous recommandons de suivre le didacticiel dans[Tutoriel : Création d'une fonction simple avec CloudFront Functions](functions-tutorial.md).

Une fois ce didacticiel terminé, vous pouvez suivre celui-ci pour étendre la fonction que vous avez créée. Pour ce didacticiel, nous vous recommandons de commencer par créer le magasin de clés-valeurs. 

## Création du magasin de clés-valeurs
<a name="functions-kvs-tutorial-kvs-step"></a>

Commencez par créer le magasin de clés-valeurs à utiliser pour votre fonction.

**Pour créer le magasin de clés-valeurs**

1. Planifiez les paires clé-valeur que vous souhaitez inclure dans la fonction. Notez les noms de clés. Les paires clé-valeur que vous souhaitez utiliser dans une fonction doivent se trouver dans un même magasin de clés-valeurs. 

1. Décidez de l’ordre de travail. Il existe deux façons de procéder :
   + Créez un magasin de clés-valeurs et ajoutez-y les paires clé-valeur. Créez (ou modifiez) ensuite la fonction et incorporez les noms des clés.
   + Ou, créez (ou modifiez) la fonction et incorporez les noms des clés que vous voulez utiliser. Créez ensuite un magasin de clés-valeurs et ajoutez les paires clé-valeur.

1. Connectez-vous à la CloudFront console AWS Management Console et ouvrez-la à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Dans le volet de navigation, choisissez **Functions**, puis sélectionnez l'**KeyValueStores**onglet.

1. Choisissez **Créer KeyValueStore** et saisissez les champs suivants :
   + Entrez un nom et une description facultative pour le magasin. 
   + Laissez **URI S3** vide. Dans ce didacticiel, vous saisirez manuellement les paires clé-valeur. 

1. Choisissez **Créer**. La page de détails du nouveau magasin de clés-valeurs apparaît. Cette page inclut une section **Paires clé-valeur** qui est actuellement vide.

## Ajout des paires clé-valeur au magasin de clés-valeurs
<a name="add-key-value-pairs-to-store"></a>

Ensuite, ajoutez manuellement une liste de paires clé-valeur au magasin de clés-valeurs que vous avez créé précédemment.

**Pour ajouter des paires clé-valeur au magasin de clés-valeurs**

1. Dans la section **Paires clé-valeur**, choisissez le bouton **Ajouter des paires clé-valeur**. 

1. Choisissez **Ajouter une paire** et entrez une clé et une valeur. Cochez la case pour confirmer vos modifications et répétez cette étape pour en ajouter d’autres.

1. Lorsque vous avez terminé, choisissez **Enregistrer les modifications** pour enregistrer les paires clé-valeur dans le magasin de clés-valeurs. Dans la boîte de dialogue de confirmation, choisissez **Terminé**.

Vous disposez désormais d’un magasin de clés-valeurs qui contient un groupe de paires clé-valeur. 



## Association du magasin de clés-valeurs à la fonction
<a name="functions-kvs-tutorial-functions-step"></a>

Vous avez maintenant créé le magasin de clés-valeurs. Vous avez également créé ou modifié une fonction qui inclut les noms des clés à partir du magasin de clés-valeurs. Vous pouvez maintenant associer le magasin de clés-valeurs et la fonction. Vous créez cette association à partir de la fonction. 

**Pour associer le magasin de clés-valeurs à la fonction**

1. Dans le volet de navigation, choisissez **Fonctions**. L’onglet **Fonctions** apparaît en haut, par défaut. 

1. Choisissez le nom de la fonction, puis dans la KeyValueStore section **Associé**, sélectionnez **Associer existant KeyValueStore**.

1. Sélectionnez le magasin de valeurs clés, puis choisissez **Associer KeyValueStore**. 

**Note**  
Vous pouvez associer un seul magasin de clés-valeurs à chaque fonction.

## Test et publication du code de la fonction
<a name="test-and-publish-function-code"></a>

Après avoir associé le magasin de clés-valeurs à votre fonction, vous pouvez tester et publier le code de la fonction. Vous devez tester le code de la fonction chaque fois que vous le modifiez, y compris lorsque vous effectuez les opérations suivantes :
+ Association d’un magasin de clés-valeurs à la fonction.
+ Modification de la fonction et de son magasin de clés-valeurs pour inclure une nouvelle paire clé-valeur.
+ Modification de la valeur d’une paire clé-valeur.

**Pour tester et publier le code de la fonction**

1. Pour en savoir plus sur la façon de tester une fonction, consultez [Fonctions de test](test-function.md). Assurez-vous de choisir de tester la fonction dans la phase `DEVELOPMENT`.

1. Publiez la fonction lorsque vous êtes prêt à l’utiliser (avec les paires clé-valeur nouvelles ou révisées) dans un environnement `LIVE`. 

   Lorsque vous publiez, CloudFront copie la version de la fonction de la `DEVELOPMENT` scène vers la scène en direct. La fonction possède le nouveau code et est associée au magasin de clés-valeurs. (Il n’est pas nécessaire de répéter l’association, dans la phase en direct.)

   Pour en savoir plus sur la façon de publier la fonction, consultez [Publication de fonctions](publish-function.md). 

# Écriture du code de la fonction
<a name="writing-function-code"></a>

Vous pouvez utiliser CloudFront Functions pour écrire des fonctions légères dans le cadre de personnalisations JavaScript de CDN à grande échelle et sensibles à la latence. Votre code de fonction peut manipuler les demandes et les réponses qui circulent CloudFront, effectuer une authentification et une autorisation de base, générer des réponses HTTP à la périphérie, etc.

Pour vous aider à écrire du code de fonction pour CloudFront Functions, consultez les rubriques suivantes. Pour des exemples de code, voir [CloudFront Exemples de fonctions pour CloudFront](service_code_examples_cloudfront_functions_examples.md) et le [amazon-cloudfront-functions référentiel](https://github.com/aws-samples/amazon-cloudfront-functions) sur GitHub.

**Topics**
+ [

# Détermination de l’objectif de la fonction
](function-code-choose-purpose.md)
+ [Structure d’évènements](functions-event-structure.md)
+ [JavaScript fonctionnalités d'exécution](functions-javascript-runtime-features.md)
+ [

# Méthodes d’aide pour les magasins de clés-valeurs
](functions-custom-methods.md)
+ [

# Méthodes d’assistance pour la modification de l’origine
](helper-functions-origin-modification.md)
+ [

# Méthodes d'assistance pour les propriétés de CloudFront SaaS Manager
](saas-specific-logic-function-code.md)
+ [

# Utilisation de async et await
](async-await-syntax.md)
+ [

# Support CWT pour Functions CloudFront
](cwt-support-cloudfront-functions.md)
+ [

# Méthodes d'assistance générales
](general-helper-methods.md)

# Détermination de l’objectif de la fonction
<a name="function-code-choose-purpose"></a>

Avant d'écrire votre code de fonction, déterminez le but de votre fonction. La plupart des CloudFront fonctions de Functions ont l'un des objectifs suivants.

**Topics**
+ [

## Modification de la requête HTTP dans un type d'événement de demande de visionnage
](#function-code-modify-request)
+ [

## Génération d'une réponse HTTP dans un type d'événement de demande de visionnage
](#function-code-generate-response)
+ [

## Modification de la réponse HTTP dans un type d'événement de demande de visionnage
](#function-code-modify-response)
+ [

## Valider les connexions mTLS dans un type d'événement de demande de connexion
](#function-code-connection-request)
+ [

## Informations connexes
](#related-information-cloudfront-functions-purpose)

Quel que soit le but de votre fonction, `handler` est le point d'entrée pour n'importe quelle fonction. Il ne prend qu'un seul argument appelé`event`, qui est transmis à la fonction par CloudFront. `event` est un objet JSON qui contient une représentation de la requête HTTP (et la réponse, si votre fonction modifie la réponse HTTP). 

## Modification de la requête HTTP dans un type d'événement de demande de visionnage
<a name="function-code-modify-request"></a>

Votre fonction peut modifier la requête HTTP envoyée CloudFront par le visualiseur (client) et renvoyer la demande modifiée CloudFront pour un traitement continu. Par exemple, votre code de fonction peut normaliser la [clé de cache](understanding-the-cache-key.md) ou modifier les en-têtes de requêtes.

Après avoir créé et publié une fonction qui modifie la demande HTTP, veillez à ajouter une association pour le type d’événement *demande de l’utilisateur*. Pour de plus amples informations, veuillez consulter [Créer la fonction](functions-tutorial.md#functions-tutorial-create). Cela permet à la fonction de s'exécuter chaque fois qu' CloudFront elle reçoit une demande d'un visualiseur, avant de vérifier si l'objet demandé se trouve dans le CloudFront cache.

**Example Exemple**  
Le pseudocode suivant montre la structure d'une fonction qui modifie la requête HTTP.  

```
function handler(event) {
    var request = event.request;

    // Modify the request object here.

    return request;
}
```
La fonction renvoie l'`request`objet modifié à CloudFront. CloudFrontpoursuit le traitement de la demande renvoyée en vérifiant la CloudFront présence d'un accès au cache et en envoyant la demande à l'origine si nécessaire.

## Génération d'une réponse HTTP dans un type d'événement de demande de visionnage
<a name="function-code-generate-response"></a>

Votre fonction peut générer une réponse HTTP à la périphérie et la renvoyer directement au visualiseur (client) sans vérifier la présence d'une réponse en cache ni aucun autre traitement par CloudFront. Par exemple, votre code de fonction peut rediriger la requête vers une nouvelle URL, ou vérifier l'autorisation et renvoyer une réponse `401` ou `403` à des requêtes non autorisées.

Lorsque vous créez une fonction qui génère une réponse HTTP, veillez à choisir le type d'évènement *requête utilisateur*. Cela signifie que la fonction s'exécute chaque fois qu' CloudFront elle reçoit une demande d'un utilisateur, avant CloudFront de poursuivre le traitement de la demande.

**Example Exemple**  
Le pseudocode suivant montre la structure d'une fonction qui génère une réponse HTTP.  

```
function handler(event) {
    var request = event.request;

    var response = ...; // Create the response object here,
                        // using the request properties if needed.

    return response;
}
```
La fonction renvoie un `response` objet à CloudFront, qui revient CloudFront immédiatement au visualiseur sans vérifier le CloudFront cache ni envoyer de demande à l'origine.

## Modification de la réponse HTTP dans un type d'événement de demande de visionnage
<a name="function-code-modify-response"></a>

Votre fonction peut modifier la réponse HTTP avant de l' CloudFront envoyer au visualiseur (client), que la réponse provienne du CloudFront cache ou de l'origine. Par exemple, votre code de fonction peut ajouter ou modifier des en-têtes de réponse, des codes de statut et le contenu du corps.

Lorsque vous créez une fonction qui modifie la réponse HTTP, veillez à choisir le type d'évènement *réponse utilisateur*. Cela signifie que la fonction s'exécute avant de CloudFront renvoyer une réponse au visualiseur, que la réponse provienne du CloudFront cache ou de l'origine.

**Example Exemple**  
Le pseudocode suivant montre la structure d'une fonction qui modifie la réponse HTTP.  

```
function handler(event) {
    var request = event.request;
    var response = event.response;

    // Modify the response object here,
    // using the request properties if needed.

    return response;
}
```
La fonction renvoie l'`response`objet modifié à CloudFront, qui revient CloudFront immédiatement au visualiseur.

## Valider les connexions mTLS dans un type d'événement de demande de connexion
<a name="function-code-connection-request"></a>

Les fonctions de connexion sont un type de CloudFront fonctions qui s'exécutent pendant les connexions TLS pour fournir une logique de validation et d'authentification personnalisée. Les fonctions de connexion sont actuellement disponibles pour les connexions TLS mutuelles (mTLS), où vous pouvez valider les certificats clients et implémenter une logique d'authentification personnalisée au-delà de la validation standard des certificats. Les fonctions de connexion s'exécutent pendant le processus de prise de contact TLS et peuvent autoriser ou refuser des connexions en fonction des propriétés des certificats, des adresses IP des clients ou d'autres critères.

Après avoir créé et publié une fonction de connexion, assurez-vous d'ajouter une association pour le type d'événement de *demande de connexion* avec une distribution compatible MTLS. Cela permet à la fonction de s'exécuter chaque fois qu'un client tente d'établir une connexion mTLS avec CloudFront.

**Example**  
Le pseudocode suivant montre la structure d'une fonction de connexion :  

```
function connectionHandler(connection) {
    // Validate certificate and connection properties here.
    
    if (/* validation passes */) {
        connection.allow();
    } else {
        connection.deny();
    }
}
```
La fonction utilise des méthodes d'assistance pour déterminer s'il convient d'autoriser ou de refuser la connexion. Contrairement aux fonctions de demande et de réponse de l'utilisateur, les fonctions de connexion ne peuvent pas modifier les requêtes ou les réponses HTTP.

## Informations connexes
<a name="related-information-cloudfront-functions-purpose"></a>

Pour plus d'informations sur l'utilisation des CloudFront fonctions, consultez les rubriques suivantes :
+ [Structure d’évènements](functions-event-structure.md)
+ [JavaScript fonctionnalités d'exécution](functions-javascript-runtime-features.md)
+ [CloudFront Exemples de fonctions ](service_code_examples_cloudfront_functions_examples.md)
+ [Restrictions sur les fonctions périphériques](edge-functions-restrictions.md)

# CloudFront Fonctions et structure des événements
<a name="functions-event-structure"></a>

CloudFront Functions transmet un `event` objet à votre code de fonction en entrée lors de l'exécution de la fonction. Lorsque vous [testez une fonction](test-function.md), vous créez l'objet `event` et le transférez à votre fonction. Lorsque vous créez un objet `event` pour tester une fonction, vous pouvez omettre les champs `distributionDomainName`, `distributionId` et `requestId` de l'objet `context`. Assurez-vous que les noms des en-têtes sont en minuscules, ce qui est toujours le cas dans l'`event`objet que CloudFront Functions transmet à votre fonction en production.

La section suivante présente une vue d'ensemble de la structure de cet objet d'évènement. 

```
{
    "version": "1.0",
    "context": {
        <context object>
    },
    "viewer": {
        <viewer object>
    },
    "request": {
        <request object>
    },
    "response": {
        <response object>
    }
}
```

Pour plus d’informations, consultez les rubriques suivantes :

**Topics**
+ [

## Champ Version
](#functions-event-structure-version)
+ [

## Objet Contexte
](#functions-event-structure-context)
+ [

## Structure des événements de connexion
](#functions-event-structure-connection)
+ [

## Objet Utilisateur
](#functions-event-structure-viewer)
+ [

## Objet Requête
](#functions-event-structure-request)
+ [

## Objet Réponse
](#functions-event-structure-response)
+ [

## Code de statut et corps
](#functions-event-structure-status-body)
+ [

## Structure d'une chaîne de requête, d'un en-tête ou d'un cookie
](#functions-event-structure-query-header-cookie)
+ [

## Exemple d'objet de réponse
](#functions-response-structure-example)
+ [

## Exemple d'objet d'événement
](#functions-event-structure-example)

## Champ Version
<a name="functions-event-structure-version"></a>

Le `version` champ contient une chaîne qui indique la version de l'objet d'événement CloudFront Functions. La version actuelle est `1.0`.

## Objet Contexte
<a name="functions-event-structure-context"></a>

L'objet `context` contient des informations contextuelles sur l'évènement. Il inclut les champs suivants :

**`distributionDomainName`**  
Le nom CloudFront de domaine (par exemple, d111111abcdef8.cloudfront.net) de la distribution standard associée à l'événement.  
Le champ `distributionDomainName` n’apparaît que lorsque votre fonction est invoquée pour les distributions standard.

**`endpoint`**  
Le nom CloudFront de domaine (par exemple, d111111abcdef8.cloudfront.net) du groupe de connexion associé à l'événement.  
Le champ `endpoint` n’apparaît que lorsque votre fonction est invoquée pour les distributions multi-locataires.

**`distributionId`**  
L'ID de la distribution (par EDFDVBD6 exemple, EXAMPLE) associée à l'événement.

**`eventType`**  
Le type d'évènement, `viewer-request` ou `viewer-response`.

**`requestId`**  
Chaîne qui identifie de manière unique une CloudFront demande (et la réponse associée).

## Structure des événements de connexion
<a name="functions-event-structure-connection"></a>

Les fonctions de connexion reçoivent une structure d'événements différente de celle des fonctions de visualisation. Pour des informations détaillées sur la structure des événements de connexion et le format de réponse, consultez[Associer une fonction CloudFront de connexion](connection-functions.md).

## Objet Utilisateur
<a name="functions-event-structure-viewer"></a>

L'objet `viewer` comporte un champ `ip` dont la valeur est l'adresse IP de l'utilisateur (client) qui a envoyé la requête. Si la requête utilisateur a été envoyée via un proxy HTTP ou un équilibreur de charge, la valeur correspond à l'adresse IP du proxy ou de l'équilibreur de charge.

## Objet Requête
<a name="functions-event-structure-request"></a>

L'`request`objet contient une représentation d'une requête viewer-to-CloudFront HTTP. Dans l'`event`objet transmis à votre fonction, l'`request`objet représente la demande réelle CloudFront reçue du visualiseur.

Si votre code de fonction renvoie un `request` objet à CloudFront, il doit utiliser cette même structure.

L'objet `request` comporte les champs suivants :

**`method`**  
Méthode HTTP de la demande. Si votre code de fonction renvoie une `request`, il ne peut pas modifier ce champ. Il s'agit du seul champ en lecture seule de l'objet `request`.

**`uri`**  
Chemin d’accès relatif de l’objet demandé.   
Si votre fonction modifie la valeur `uri`, les règles suivantes s’appliquent :  
+ La nouvelle valeur `uri` doit commencer par une barre oblique (`/`).
+ Lorsqu'une fonction modifie la valeur `uri`, elle change l'objet que l'utilisateur demande.
+ Quand une fonction modifie la valeur `uri`, elle *ne modifie pas* le comportement de cache pour la demande ni l'origine vers laquelle la demande d'origine est envoyée.

**`querystring`**  
Objet qui représente la chaîne de requête dans la requête. Si la demande n'inclut pas de chaîne de requête, l'objet `request` inclut néanmoins un objet `querystring` vide.  
L'objet `querystring` comporte un champ pour chaque paramètre de chaîne de requête dans la requête.

**`headers`**  
Objet qui représente les en-têtes HTTP dans la requête. Si la requête contient des en-têtes `Cookie`, ces derniers ne font pas partie de l'objet `headers`. Les cookies sont représentés séparément dans l'objet `cookies`.  
L'objet `headers` comporte un champ pour chaque en-tête de la requête. Les noms des en-têtes sont convertis en minuscules ASCII dans l’objet d’événement, et les noms des en-têtes doivent être en minuscules ASCII lorsqu’ils sont ajoutés par votre code de fonction. Lorsque CloudFront Functions reconvertit l'objet d'événement en requête HTTP, la première lettre de chaque mot dans les noms d'en-tête est en majuscule, s'il s'agit d'une lettre ASCII. CloudFront Functions n'applique aucune modification aux symboles non ASCII dans les noms d'en-tête. Par exemple, `TÈst-header` deviendra `tÈst-header` à l’intérieur de la fonction. Le symbole non ASCII `È` est inchangé.  
Les mots sont séparés par un trait d’union (`-`). Par exemple, si votre code de fonction ajoute un en-tête nommé`example-header-name`, il le CloudFront convertit en en-tête `Example-Header-Name` dans la requête HTTP.

**`cookies`**  
Objet qui représente les cookies dans la requête (en-têtes `Cookie`).  
L'objet `cookies` comporte un champ pour chaque cookie dans la requête.

Pour plus d'informations sur la structure des chaînes de requêtes, des en-têtes et des cookies, consultez [Structure d'une chaîne de requête, d'un en-tête ou d'un cookie](#functions-event-structure-query-header-cookie).

Pour un exemple d’objet `event`, consultez [Exemple d'objet d'événement](#functions-event-structure-example).

## Objet Réponse
<a name="functions-event-structure-response"></a>

L'`response`objet contient une représentation d'une réponse CloudFront-to-viewer HTTP. Dans l'`event`objet transmis à votre fonction, l'`response`objet représente la réponse réelle CloudFront de l'utilisateur à une demande de consultation.

Si votre code de fonction renvoie un objet `response`, il doit utiliser cette même structure.

L'objet `response` comporte les champs suivants :

**`statusCode`**  
Code de statut HTTP de la réponse. Cette valeur est un entier, pas une chaîne.  
Votre fonction peut générer ou modifier le `statusCode`.

**`statusDescription`**  
Description de l’état HTTP de la réponse. Si votre code de fonction génère une réponse, ce champ est facultatif.

**`headers`**  
Objet qui représente les en-têtes HTTP dans la réponse. Si la réponse contient des en-têtes `Set-Cookie`, ces derniers ne font pas partie de l'objet `headers`. Les cookies sont représentés séparément dans l'objet `cookies`.  
L'objet `headers` comporte un champ pour chaque en-tête de la réponse. Les noms des en-têtes sont convertis en minuscules dans l'objet d'événement, et les noms des en-têtes doivent être en minuscules lorsqu'ils sont ajoutés par votre code de fonction. Lorsque CloudFront Functions reconvertit l'objet d'événement en réponse HTTP, la première lettre de chaque mot des noms d'en-tête est mise en majuscule. Les mots sont séparés par un trait d’union (`-`). Par exemple, si votre code de fonction ajoute un en-tête nommé`example-header-name`, il le CloudFront convertit en `Example-Header-Name` dans la réponse HTTP.

**`cookies`**  
Objet qui représente les cookies dans la réponse (en-têtes `Set-Cookie`).  
L'objet `cookies` comporte un champ pour chaque cookie dans la réponse.

**`body`**  
L'ajout du champ `body` est facultatif et il ne sera pas présent dans l'objet `response` à moins que vous ne le spécifiiez dans votre fonction. Votre fonction n'a pas accès au corps d'origine renvoyé par le CloudFront cache ou l'origine. Si vous ne spécifiez pas le `body` champ dans votre fonction de réponse du spectateur, le corps d'origine renvoyé par le CloudFront cache ou l'origine est renvoyé au visualiseur.  
Si vous CloudFront souhaitez renvoyer un corps personnalisé au visualiseur, spécifiez le contenu du corps dans le `data` champ et le codage du corps dans le `encoding` champ. Vous pouvez spécifier le codage sous forme de texte brut (`"encoding": "text"`) ou de contenu codé en Base64 (`"encoding": "base64"`).  
Comme raccourci, vous pouvez également spécifier le contenu du corps directement dans le champ `body` (`"body": "<specify the body content here>"`). Dans ce cas, omettez les `encoding` champs `data` et. CloudFront traite le corps comme du texte brut dans ce cas.    
`encoding`  
Codage du contenu de `body` (champ `data`). Les seuls encodages valides sont `text` et `base64`.  
Si vous spécifiez `encoding` as `base64` mais que le corps n'est pas valide en base64, CloudFront renvoie une erreur.  
`data`  
Contenu de `body`.

Pour plus d'informations sur les codes de statut modifiés et le contenu du corps, consultez [Code de statut et corps](#functions-event-structure-status-body).

Pour plus d'informations sur la structure des en-têtes et des cookies, consultez [Structure d'une chaîne de requête, d'un en-tête ou d'un cookie](#functions-event-structure-query-header-cookie).

Pour un exemple d’objet `response`, consultez [Exemple d'objet de réponse](#functions-response-structure-example).

## Code de statut et corps
<a name="functions-event-structure-status-body"></a>

Avec CloudFront Functions, vous pouvez mettre à jour le code d'état de la réponse du lecteur, remplacer l'intégralité du corps de la réponse par un nouveau ou supprimer le corps de la réponse. Parmi les scénarios courants de mise à jour de la réponse du spectateur après avoir évalué certains aspects de la réponse provenant du CloudFront cache ou de l'origine, citons les suivants :
+ Modification du statut pour définir un code de statut HTTP 200 et création d'un contenu de corps statique à renvoyer à l'utilisateur.
+ Modification du statut pour définir un code de statut HTTP 301 ou 302 afin de rediriger l'utilisateur vers un autre site Web.
+ Décider de diffuser ou de supprimer le corps de la réponse d'utilisateur.

**Note**  
Si l'origine renvoie une erreur HTTP supérieure ou égale à 400, la CloudFront fonction ne sera pas exécutée. Pour de plus amples informations, veuillez consulter [Restrictions sur toutes les fonctions périphériques](edge-function-restrictions-all.md).

Lorsque vous travaillez avec la réponse HTTP, CloudFront Functions n'a pas accès au corps de la réponse. Vous pouvez remplacer le contenu du corps en lui attribuant la valeur souhaitée, ou supprimer le corps en définissant une valeur vide. Si vous ne mettez pas à jour le champ body de votre fonction, le corps d'origine renvoyé par le CloudFront cache ou l'origine est renvoyé au visualiseur.

**Astuce**  
Lorsque vous utilisez CloudFront des fonctions pour remplacer un corps, veillez à aligner les en-têtes correspondants, tels que`content-encoding`, ou `content-type``content-length`, sur le nouveau contenu du corps.   
Par exemple, si l' CloudFront origine ou le cache sont renvoyés `content-encoding: gzip` mais que la fonction de réponse de l'utilisateur définit un corps en texte brut, la fonction doit également modifier `content-type` les en-têtes `content-encoding` et en conséquence.

Si votre CloudFront fonction est configurée pour renvoyer une erreur HTTP de 400 ou plus, votre lecteur ne verra pas la [page d'erreur personnalisée](creating-custom-error-pages.md) que vous avez spécifiée pour le même code d'état.

## Structure d'une chaîne de requête, d'un en-tête ou d'un cookie
<a name="functions-event-structure-query-header-cookie"></a>

Les chaînes de requête, les en-têtes et les cookies partagent la même structure. Les chaînes de requête peuvent apparaître dans les demandes. Les en-têtes apparaissent dans les demandes et les réponses. Les cookies apparaissent dans les demandes et les réponses.

Chaque chaîne de requête, en-tête ou cookie est un champ unique au sein de l'objet parent `querystring`, `headers` ou `cookies`. Le nom du champ est le nom de la chaîne de requête, de l'en-tête ou du cookie. Chaque champ comporte une propriété `value` avec la valeur de la chaîne de requête, de l'en-tête ou du cookie.

**Contents**
+ [

### Valeurs de chaînes de requête ou objets de chaîne de requête
](#functions-event-structure-query)
+ [

### Considérations spéciales pour les en-têtes
](#functions-event-structure-headers)
+ [

### Dupliquer les chaînes de requêtes, les en-têtes et les cookies (tableau `multiValue`)
](#functions-event-structure-multivalue)
+ [

### Attributs de cookies
](#functions-event-structure-cookie-attributes)

### Valeurs de chaînes de requête ou objets de chaîne de requête
<a name="functions-event-structure-query"></a>

Une fonction peut renvoyer une valeur de chaîne de requête en plus d'un objet de chaîne de requête. La valeur de chaîne de requête peut être utilisée pour organiser les paramètres de chaîne de requête dans n'importe quel ordre personnalisé. 

**Example Exemple**  
Pour modifier une chaîne de requête dans le code d’une fonction, utilisez un code analogue au suivant.  

```
var request = event.request; 
request.querystring = 'ID=42&Exp=1619740800&TTL=1440&NoValue=&querymv=val1&querymv=val2,val3';
```

### Considérations spéciales pour les en-têtes
<a name="functions-event-structure-headers"></a>

Pour les en-têtes uniquement, les noms des en-têtes sont convertis en minuscules dans l'objet d'événement, et les noms des en-têtes doivent être en minuscules lorsqu'ils sont ajoutés par votre code de fonction. Lorsque CloudFront Functions reconvertit l'objet d'événement en requête ou réponse HTTP, la première lettre de chaque mot des noms d'en-tête est mise en majuscule. Les mots sont séparés par un trait d’union (`-`). Par exemple, si votre code de fonction ajoute un en-tête nommé`example-header-name`, il le CloudFront convertit `Example-Header-Name` dans la requête ou la réponse HTTP.

**Example Exemple**  
Examinez l’en-tête `Host` suivant dans une demande HTTP.  

```
Host: video.example.com
```
Cet en-tête est représenté comme suit dans l'objet `request` :  

```
"headers": {
    "host": {
        "value": "video.example.com"
    }
}
```
Pour accéder à l'en-tête `Host` dans votre code de fonction, utilisez le code comme suit :  

```
var request = event.request;
var host = request.headers.host.value;
```
Pour ajouter ou modifier un en-tête dans votre code de fonction, utilisez le code suivant (ce code ajoute un en-tête nommé `X-Custom-Header` avec la valeur `example value`) :  

```
var request = event.request;
request.headers['x-custom-header'] = {value: 'example value'};
```

### Dupliquer les chaînes de requêtes, les en-têtes et les cookies (tableau `multiValue`)
<a name="functions-event-structure-multivalue"></a>

Une requête ou une réponse HTTP peut contenir plusieurs chaînes de requêtes, en-têtes ou cookies portant le même nom. Dans ce cas, les chaînes de requêtes, les en-têtes ou les cookies en double sont regroupés dans un champ de l'objet `request` ou `response`, mais ce champ comporte une propriété supplémentaire nommée `multiValue`. La propriété `multiValue` contient un tableau avec les valeurs de chacun des en-têtes, cookies ou chaînes de requêtes dupliqués.

**Example Exemple**  
Imaginons une requête HTTP qui inclut les en-têtes `Accept` suivants.  

```
Accept: application/json
Accept: application/xml
Accept: text/html
```
Ces en-têtes sont représentés comme suit dans l’objet `request`.  

```
"headers": {
    "accept": {
        "value": "application/json",
        "multiValue": [
            {
                "value": "application/json"
            },
            {
                "value": "application/xml"
            },
            {
                "value": "text/html"
            }
        ]
    }
}
```

**Note**  
La première valeur d’en-tête (dans ce cas, `application/json`) est répétée dans les propriétés `value` et `multiValue`. Cela vous permet d'accéder à *toutes* les valeurs en faisant une boucle dans le tableau `multiValue`.

Si le code de votre fonction modifie une chaîne de requête, un en-tête ou un cookie contenant un `multiValue` tableau, CloudFront Functions applique les règles suivantes pour appliquer les modifications :

1. Si le tableau `multiValue` existe et comporte des modifications, ces dernières sont appliquées. Le premier élément de la propriété `value` est ignoré.

1. Sinon, toute modification apportée à la propriété `value` est appliquée, et les valeurs suivantes (si elles existent) restent inchangées.

La propriété `multiValue` est utilisée uniquement lorsque la requête ou la réponse HTTP contient des chaînes de requêtes, des en-têtes ou des cookies en double portant le même nom, comme indiqué dans l'exemple précédent. Toutefois, s'il existe plusieurs valeurs dans un seul en-tête, cookie ou chaîne de requête, la propriété `multiValue` n'est pas utilisée.

**Example Exemple**  
Prenons l’exemple d’une demande avec un en-tête `Accept` contenant trois valeurs.  

```
Accept: application/json, application/xml, text/html
```
Cet en-tête est représenté comme suit dans l’objet `request`.  

```
"headers": {
    "accept": {
        "value": "application/json, application/xml, text/html"
    }
}
```

### Attributs de cookies
<a name="functions-event-structure-cookie-attributes"></a>

Dans un en-tête `Set-Cookie` d'une réponse HTTP, l'en-tête contient la paire nom-valeur du cookie et éventuellement un ensemble d'attributs séparés par des points-virgules. 

**Example Exemple**  

```
Set-Cookie: cookie1=val1; Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT
```
Dans l'objet `response`, ces attributs sont représentés dans la propriété `attributes` du champ cookie. Par exemple, l'en-tête `Set-Cookie` précédent est représenté comme suit :  

```
"cookie1": {
    "value": "val1",
    "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT"
}
```

## Exemple d'objet de réponse
<a name="functions-response-structure-example"></a>

L'exemple suivant montre un objet `response` (la sortie d'une fonction de réponse d'utilisateur) dans lequel le corps a été remplacé par une fonction de réponse d'utilisateur.

```
{
  "response": {
    "statusCode": 200,
    "statusDescription": "OK",
    "headers": {
      "date": {
        "value": "Mon, 04 Apr 2021 18:57:56 GMT"
      },
      "server": {
        "value": "gunicorn/19.9.0"
      },
      "access-control-allow-origin": {
        "value": "*"
      },
      "access-control-allow-credentials": {
        "value": "true"
      },
      "content-type": {
        "value": "text/html"
      },
      "content-length": {
        "value": "86"
      }
    },
    "cookies": {
      "ID": {
        "value": "id1234",
        "attributes": "Expires=Wed, 05 Apr 2021 07:28:00 GMT"
      },
      "Cookie1": {
        "value": "val1",
        "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT",
        "multiValue": [
          {
            "value": "val1",
            "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT"
          },
          {
            "value": "val2",
            "attributes": "Path=/cat; Domain=example.com; Expires=Wed, 10 Jan 2021 07:28:00 GMT"
          }
        ]
      }
    },
    
    // Adding the body field is optional and it will not be present in the response object
    // unless you specify it in your function.
    // Your function does not have access to the original body returned by the CloudFront
    // cache or origin.
    // If you don't specify the body field in your viewer response function, the original
    // body returned by the CloudFront cache or origin is returned to viewer.

     "body": {
      "encoding": "text",
      "data": "<!DOCTYPE html><html><body><p>Here is your custom content.</p></body></html>"
    }
  }
}
```

## Exemple d'objet d'événement
<a name="functions-event-structure-example"></a>

L'exemple suivant illustre un objet `event` complet. Il s’agit d’un exemple d’invocation pour une distribution standard, et non pour une distribution multi-locataires. Pour les distributions multi-locataires, le `endpoint` champ est utilisé à la place de `distributionDomainName` La valeur de `endpoint` est le nom de CloudFront domaine (par exemple, d111111abcdef8.cloudfront.net) du groupe de connexion associé à l'événement.

**Note**  
L'objet `event` représente l'entrée de votre fonction. Votre fonction renvoie uniquement l'objet `request` ou `response`, et non l'objet `event` complet.

```
{
    "version": "1.0",
    "context": {
        "distributionDomainName": "d111111abcdef8.cloudfront.net",
        "distributionId": "EDFDVBD6EXAMPLE",
        "eventType": "viewer-response",
        "requestId": "EXAMPLEntjQpEXAMPLE_SG5Z-EXAMPLEPmPfEXAMPLEu3EqEXAMPLE=="
    },
    "viewer": {"ip": "198.51.100.11"},
    "request": {
        "method": "GET",
        "uri": "/media/index.mpd",
        "querystring": {
            "ID": {"value": "42"},
            "Exp": {"value": "1619740800"},
            "TTL": {"value": "1440"},
            "NoValue": {"value": ""},
            "querymv": {
                "value": "val1",
                "multiValue": [
                    {"value": "val1"},
                    {"value": "val2,val3"}
                ]
            }
        },
        "headers": {
            "host": {"value": "video.example.com"},
            "user-agent": {"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"},
            "accept": {
                "value": "application/json",
                "multiValue": [
                    {"value": "application/json"},
                    {"value": "application/xml"},
                    {"value": "text/html"}
                ]
            },
            "accept-language": {"value": "en-GB,en;q=0.5"},
            "accept-encoding": {"value": "gzip, deflate, br"},
            "origin": {"value": "https://website.example.com"},
            "referer": {"value": "https://website.example.com/videos/12345678?action=play"},
            "cloudfront-viewer-country": {"value": "GB"}
        },
        "cookies": {
            "Cookie1": {"value": "value1"},
            "Cookie2": {"value": "value2"},
            "cookie_consent": {"value": "true"},
            "cookiemv": {
                "value": "value3",
                "multiValue": [
                    {"value": "value3"},
                    {"value": "value4"}
                ]
            }
        }
    },
    "response": {
        "statusCode": 200,
        "statusDescription": "OK",
        "headers": {
            "date": {"value": "Mon, 04 Apr 2021 18:57:56 GMT"},
            "server": {"value": "gunicorn/19.9.0"},
            "access-control-allow-origin": {"value": "*"},
            "access-control-allow-credentials": {"value": "true"},
            "content-type": {"value": "application/json"},
            "content-length": {"value": "701"}
        },
        "cookies": {
            "ID": {
                "value": "id1234",
                "attributes": "Expires=Wed, 05 Apr 2021 07:28:00 GMT"
            },
            "Cookie1": {
                "value": "val1",
                "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT",
                "multiValue": [
                    {
                        "value": "val1",
                        "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT"
                    },
                    {
                        "value": "val2",
                        "attributes": "Path=/cat; Domain=example.com; Expires=Wed, 10 Jan 2021 07:28:00 GMT"
                    }
                ]
            }
        }
    }
}
```

# JavaScript fonctionnalités d'exécution pour CloudFront Functions
<a name="functions-javascript-runtime-features"></a>

L'environnement JavaScript d'exécution CloudFront Functions est compatible avec [ECMAScript (ES) version 5.1](https://www.ecma-international.org/ecma-262/5.1/) et prend également en charge certaines fonctionnalités des versions ES 6 à 12.

Pour la plupart des up-to-date fonctionnalités, nous vous recommandons JavaScript d'utiliser Runtime 2.0. 

Les fonctionnalités JavaScript d'exécution 2.0 présentent les modifications suivantes par rapport à la version 1.0 :
+ Les méthodes du module Buffer sont disponibles
+ Les méthodes de prototype de chaîne non standard suivantes ne sont pas disponibles :
  + `String.prototype.bytesFrom()`
  + `String.prototype.fromBytes()`
  + `String.prototype.fromUTF8()`
  + `String.prototype.toBytes()`
  + `String.prototype.toUTF8()`
+ Voici les nouveautés du module cryptographique :
  + `hash.digest()` : le type de retour est remplacé par `Buffer` si aucun encodage n’est fourni
  + `hmac.digest()` : le type de retour est remplacé par `Buffer` si aucun encodage n’est fourni
+ Pour plus d’informations sur les nouvelles fonctionnalités supplémentaires, consultez [JavaScript fonctionnalités d'exécution 2.0 pour CloudFront Functions](functions-javascript-runtime-20.md).

**Topics**
+ [JavaScript fonctionnalités de Runtime 1.0](functions-javascript-runtime-10.md)
+ [JavaScript fonctionnalités de Runtime 2.0](functions-javascript-runtime-20.md)

# JavaScript fonctionnalités de Runtime 1.0 pour CloudFront Functions
<a name="functions-javascript-runtime-10"></a>

L'environnement JavaScript d'exécution CloudFront Functions est compatible avec [ECMAScript (ES) version 5.1](https://262.ecma-international.org/5.1/) et prend également en charge certaines fonctionnalités des versions ES 6 à 9. Il fournit également des méthodes non standard qui ne font pas partie des spécifications ES. 

Les rubriques suivantes répertorient toutes les fonctions de langages prises en charge.

**Topics**
+ [

## Fonctions de base
](#writing-functions-javascript-features-core)
+ [

## Objets primitifs
](#writing-functions-javascript-features-primitive-objects)
+ [

## Objets intégrés
](#writing-functions-javascript-features-builtin-objects)
+ [

## Types d’erreurs
](#writing-functions-javascript-features-error-types)
+ [

## Globals
](#writing-functions-javascript-features-globals)
+ [

## Modules intégrés
](#writing-functions-javascript-features-builtin-modules)
+ [

## Fonctions limitées
](#writing-functions-javascript-features-restricted-features)

## Fonctions de base
<a name="writing-functions-javascript-features-core"></a>

Les fonctions de base suivantes d'ES sont prises en charge.

**Types**  
Tous les types ES 5.1 sont pris en charge, notamment les valeurs booléennes, les nombres, les chaînes, les objets, les tableaux, les fonctions, les constructeurs de fonctions et les expressions régulières.

**Opérateurs**  
Tous les opérateurs ES 5.1 sont pris en charge.  
L’opérateur d’exponentiation ES 7 (`**`) est pris en charge.

**Instructions**  
Les instructions `const` et `let` ne sont pas prises en charge.
Les instructions ES 5.1 suivantes sont prises en charge :  
+ `break`
+ `catch`
+ `continue`
+ `do-while`
+ `else`
+ `finally`
+ `for`
+ `for-in`
+ `if`
+ `return`
+ `switch`
+ `throw`
+ `try`
+ `var`
+ `while`
+ Instructions étiquetées

**Littéraux**  
Les littéraux de modèles ES 6 sont pris en charge : chaînes multiligne, interpolation d'expression et modèles d'imbrication.

**Fonctions**  
Toutes les fonctions ES 5.1 sont prises en charge.  
Les fonctions de flèche ES 6 ainsi que la syntaxe des paramètres du reste ES 6 sont prises en charge.

**Unicode**  
Le texte source et les littéraux de chaînes peuvent contenir des caractères Unicode. Les séquences d’échappement de points de code Unicode de six caractères (par exemple `\uXXXX`) sont également prises en charge.

**Mode strict**  
Les fonctions opèrent en mode strict par défaut. Vous n’avez donc pas besoin d’ajouter une instruction `use strict` dans votre code de fonction. Elles ne peuvent pas être modifiées.

## Objets primitifs
<a name="writing-functions-javascript-features-primitive-objects"></a>

Les objets primitifs suivants d'ES sont pris en charge.

**Objet**  
Les méthodes ES 5.1 suivantes sur les objets sont prises en charge :  
+ `create` (sans liste de propriétés)
+ `defineProperties`
+ `defineProperty`
+ `freeze`
+ `getOwnPropertyDescriptor`
+ `getOwnPropertyNames`
+ `getPrototypeOf`
+ `hasOwnProperty`
+ `isExtensible`
+ `isFrozen`
+ `prototype.isPrototypeOf`
+ `isSealed`
+ `keys`
+ `preventExtensions`
+ `prototype.propertyIsEnumerable`
+ `seal`
+ `prototype.toString`
+ `prototype.valueOf`
Les méthodes ES 6 suivantes sur les objets sont prises en charge :  
+ `assign`
+ `is`
+ `prototype.setPrototypeOf`
Les méthodes ES 8 suivantes sur les objets sont prises en charge :  
+ `entries`
+ `values`

**String**  
Les méthodes ES 5.1 suivantes sur les chaînes sont prises en charge :  
+ `fromCharCode`
+ `prototype.charAt`
+ `prototype.concat`
+ `prototype.indexOf`
+ `prototype.lastIndexOf`
+ `prototype.match`
+ `prototype.replace`
+ `prototype.search`
+ `prototype.slice`
+ `prototype.split`
+ `prototype.substr`
+ `prototype.substring`
+ `prototype.toLowerCase`
+ `prototype.trim`
+ `prototype.toUpperCase`
Les méthodes ES 6 suivantes sur les chaînes sont prises en charge :  
+ `fromCodePoint`
+ `prototype.codePointAt`
+ `prototype.endsWith`
+ `prototype.includes`
+ `prototype.repeat`
+ `prototype.startsWith`
Les méthodes ES 8 suivantes sur les chaînes sont prises en charge :  
+ `prototype.padStart`
+ `prototype.padEnd`
Les méthodes ES 9 suivantes sur les chaînes sont prises en charge :  
+ `prototype.trimStart`
+ `prototype.trimEnd`
Les méthodes non standard suivantes sur les chaînes sont prises en charge :  
+ `prototype.bytesFrom(array | string, encoding)`

  Crée une chaîne d'octets à partir d'un tableau d'octets ou d'une chaîne encodée. Les options d'encodage de chaînes sont `hex`, `base64` et `base64url`.
+ `prototype.fromBytes(start[, end])`

  Crée une chaîne Unicode à partir d'une chaîne d'octets où chaque octet est remplacé par le point de code Unicode correspondant.
+ `prototype.fromUTF8(start[, end])`

  Crée une chaîne Unicode à partir d'une chaîne d'octets encodée en UTF-8. Si l'encodage est incorrect, il renvoie `null`.
+ `prototype.toBytes(start[, end])`

  Crée une chaîne d'octets à partir d'une chaîne Unicode. Tous les caractères doivent être dans la plage [0,255]. Dans le cas contraire, `null` est renvoyé.
+ `prototype.toUTF8(start[, end])`

  Crée une chaîne d'octets encodée en UTF-8 à partir d'une chaîne Unicode.

**Nombre**  
Toutes les méthodes ES 5.1 sur les nombres sont prises en charge.  
Les méthodes ES 6 suivantes sur les nombres sont prises en charge :  
+ `isFinite`
+ `isInteger`
+ `isNaN`
+ `isSafeInteger`
+ `parseFloat`
+ `parseInt`
+ `prototype.toExponential`
+ `prototype.toFixed`
+ `prototype.toPrecision`
+ `EPSILON`
+ `MAX_SAFE_INTEGER`
+ `MAX_VALUE`
+ `MIN_SAFE_INTEGER`
+ `MIN_VALUE`
+ `NEGATIVE_INFINITY`
+ `NaN`
+ `POSITIVE_INFINITY`

## Objets intégrés
<a name="writing-functions-javascript-features-builtin-objects"></a>

Les objets intégrés suivants d'ES sont pris en charge.

**Mathématiques**  
Toutes les méthodes mathématiques ES 5.1 sont prises en charge.  
Dans l'environnement d'exécution de CloudFront Functions, l'`Math.random()`implémentation utilise `arc4random` OpenBSD prédéfini avec l'horodatage de l'exécution de la fonction.
Les méthodes mathématiques ES 6 suivantes sont prises en charge :  
+ `acosh`
+ `asinh`
+ `atanh`
+ `cbrt`
+ `clz32`
+ `cosh`
+ `expm1`
+ `fround`
+ `hypot`
+ `imul`
+ `log10`
+ `log1p`
+ `log2`
+ `sign`
+ `sinh`
+ `tanh`
+ `trunc`
+ `E`
+ `LN10`
+ `LN2`
+ `LOG10E`
+ `LOG2E`
+ `PI`
+ `SQRT1_2`
+ `SQRT2`

**Date**  
Toutes les fonctions `Date` ES 5.1 sont prises en charge.  
Pour des raisons de sécurité, `Date` renvoie toujours la même valeur (l’heure de début de la fonction) pendant la durée de vie d’une même exécution de la fonction. Pour plus d’informations, consultez [Fonctions limitées](#writing-functions-javascript-features-restricted-features).

**Fonction**  
Les méthodes `apply`, `bind` et `call` sont prises en charge.  
Les constructeurs de fonctions ne sont pas pris en charge.

**Expressions régulières**  
Toutes les fonctions d'expression régulière ES 5.1 sont prises en charge. Le langage d’expression régulière est compatible Perl. Les groupes de capture nommés ES 9 sont pris en charge.

**JSON**  
Toutes les fonctions JSON ES 5.1 sont prises en charge, notamment `parse` et `stringify`.

**Array**  
Les méthodes ES 5.1 suivantes sur les tableaux sont prises en charge :  
+ `isArray`
+ `prototype.concat`
+ `prototype.every`
+ `prototype.filter`
+ `prototype.forEach`
+ `prototype.indexOf`
+ `prototype.join`
+ `prototype.lastIndexOf`
+ `prototype.map`
+ `prototype.pop`
+ `prototype.push`
+ `prototype.reduce`
+ `prototype.reduceRight`
+ `prototype.reverse`
+ `prototype.shift`
+ `prototype.slice`
+ `prototype.some`
+ `prototype.sort`
+ `prototype.splice`
+ `prototype.unshift`
Les méthodes ES 6 suivantes sur les tableaux sont prises en charge :  
+ `of`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.find`
+ `prototype.findIndex`
Les méthodes ES 7 suivantes sur les tableaux sont prises en charge :  
+ `prototype.includes`

**Tableaux typés**  
Les tableaux typés ES 6 suivants sont pris en charge :  
+ `Int8Array`
+ `Uint8Array`
+ `Uint8ClampedArray`
+ `Int16Array`
+ `Uint16Array`
+ `Int32Array`
+ `Uint32Array`
+ `Float32Array`
+ `Float64Array`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.join`
+ `prototype.set`
+ `prototype.slice`
+ `prototype.subarray`
+ `prototype.toString`

**ArrayBuffer**  
Les méthodes suivantes sur `ArrayBuffer` sont prises en charge :  
+ `prototype.isView`
+ `prototype.slice`

**Promesse**  
Les méthodes suivantes sur les promesses sont prises en charge :  
+ `reject`
+ `resolve`
+ `prototype.catch`
+ `prototype.finally`
+ `prototype.then`

**Cryptographie**  
Le module cryptographique fournit des aides standard en matière de hachage et de code d'authentification de message basé sur le hachage (HMAC). Vous pouvez charger le module en utilisant `require('crypto')`. Le module fournit les méthodes suivantes, qui se comportent exactement comme leurs homologues Node.js :  
+ `createHash(algorithm)`
+ `hash.update(data)`
+ `hash.digest([encoding])`
+ `createHmac(algorithm, secret key)`
+ `hmac.update(data)`
+ `hmac.digest([encoding])`
Pour plus d'informations, consultez [Cryptographie (hachage et HMAC)](#writing-functions-javascript-features-builtin-modules-crypto) dans la section Modules intégrés.

**Console**  
Il s'agit d'un objet d'aide pour le débogage. Il ne prend en charge que la méthode `log()`, pour enregistrer les messages de journaux.  
CloudFront Les fonctions ne prennent pas en charge la syntaxe des virgules, telle que`console.log('a', 'b')`. Utilisez plutôt le format `console.log('a' + ' ' + 'b')`.

## Types d’erreurs
<a name="writing-functions-javascript-features-error-types"></a>

Les objets d’erreurs suivants sont pris en charge :
+ `Error`
+ `EvalError`
+ `InternalError`
+ `MemoryError`
+ `RangeError`
+ `ReferenceError`
+ `SyntaxError`
+ `TypeError`
+ `URIError`

## Globals
<a name="writing-functions-javascript-features-globals"></a>

L’objet `globalThis` est pris en charge.

Les fonctions globales ES 5.1 suivantes sont prises en charge :
+ `decodeURI`
+ `decodeURIComponent`
+ `encodeURI`
+ `encodeURIComponent`
+ `isFinite`
+ `isNaN`
+ `parseFloat`
+ `parseInt`

Les constantes globales suivantes sont prises en charge :
+ `NaN`
+ `Infinity`
+ `undefined`

## Modules intégrés
<a name="writing-functions-javascript-features-builtin-modules"></a>

Les modules intégrés suivants sont pris en charge.

**Topics**
+ [

### Cryptographie (hachage et HMAC)
](#writing-functions-javascript-features-builtin-modules-crypto)
+ [

### Chaîne de requête
](#writing-functions-javascript-features-builtin-modules-query-string)

### Cryptographie (hachage et HMAC)
<a name="writing-functions-javascript-features-builtin-modules-crypto"></a>

Le module cryptographique (`crypto`) fournit des aides standard en matière de hachage et de code d’authentification de message basé sur le hachage (HMAC). Vous pouvez charger le module en utilisant `require('crypto')`. Le module fournit les méthodes suivantes, qui se comportent exactement comme leurs homologues Node.js.

**Méthodes de hachage**

`crypto.createHash(algorithm)`  
Crée et renvoie un objet de hachage que vous pouvez utiliser pour générer des résumés de hachage à l’aide de l’algorithme donné : `md5`, `sha1` ou `sha256`.

`hash.update(data)`  
Met à jour le contenu de hachage avec les `data` données

`hash.digest([encoding])`  
Calcule le résumé de toutes les données transmises à l’aide de `hash.update()`. L’encodage peut être `hex`, `base64` ou `base64url`.

**Méthodes HMAC**

`crypto.createHmac(algorithm, secret key)`  
Crée et renvoie un objet HMAC qui utilise le `algorithm` et la `secret key` donnés. L’algorithme peut être `md5`, `sha1` ou `sha256`.

`hmac.update(data)`  
Met à jour le contenu HMAC avec les `data` données.

`hmac.digest([encoding])`  
Calcule le résumé de toutes les données transmises à l’aide de `hmac.update()`. L’encodage peut être `hex`, `base64` ou `base64url`.

### Chaîne de requête
<a name="writing-functions-javascript-features-builtin-modules-query-string"></a>

**Note**  
L'[objet d'événement CloudFront Functions](functions-event-structure.md) analyse automatiquement les chaînes de requête d'URL pour vous. Cela signifie que, dans la plupart des cas, vous n'avez pas besoin d'utiliser ce module.

Le module de chaînes de requêtes (`querystring`) fournit des méthodes d’analyse et de formatage des chaînes de requêtes URL. Vous pouvez charger le module en utilisant `require('querystring')`. Le module fournit les méthodes suivantes :

`querystring.escape(string)`  
Encode par URL la `string` donnée, en renvoyant une chaîne de requêtes échappée. La méthode est utilisée par `querystring.stringify()` et ne doit pas être utilisée directement.

`querystring.parse(string[, separator[, equal[, options]]])`  
Analyse une chaîne de requêtes (`string`) et renvoie un objet.  
Le paramètre `separator` est une sous-chaîne permettant de délimiter les paires clé-valeur dans la chaîne de requêtes. Par défaut, il s’agit de `&`.  
Le paramètre `equal` est une sous-chaîne permettant de délimiter les clés et les valeurs dans la chaîne de requêtes. Par défaut, il s’agit de `=`.  
Le paramètre `options` est un objet avec les clés suivantes :    
`decodeURIComponent function`  
Fonction pour décoder les caractères encodés en pourcentage dans la chaîne de requêtes. Par défaut, il s’agit de `querystring.unescape()`.  
`maxKeys number`  
Nombre maximal de clés à analyser. Par défaut, il s’agit de `1000`. Utilisez une valeur de `0` pour supprimer les limitations pour le comptage des clés.
Par défaut, les caractères encodés en pourcentage dans la chaîne de requêtes sont supposés utiliser l'encodage UTF-8. Les séquences UTF-8 non valides sont remplacées par le caractère de remplacement `U+FFFD`.  
Par exemple, pour la chaîne de requêtes suivante :  

```
'name=value&abc=xyz&abc=123'
```
La valeur renvoyée de `querystring.parse()` est :  

```
{
name: 'value',
abc: ['xyz', '123']
}
```
`querystring.decode()` est un alias pour `querystring.parse()`.

`querystring.stringify(object[, separator[, equal[, options]]])`  
Sérialise un `object` et renvoie une chaîne de requêtes.  
Le paramètre `separator` est une sous-chaîne permettant de délimiter les paires clé-valeur dans la chaîne de requêtes. Par défaut, il s’agit de `&`.  
Le paramètre `equal` est une sous-chaîne permettant de délimiter les clés et les valeurs dans la chaîne de requêtes. Par défaut, il s’agit de `=`.  
Le paramètre `options` est un objet avec les clés suivantes :    
`encodeURIComponent function`  
Fonction à utiliser pour convertir des caractères non sûrs pour une URL en encodage en pourcentage dans la chaîne de requêtes. Par défaut, il s’agit de `querystring.escape()`.
Par défaut, les caractères qui nécessitent un encodage en pourcentage dans la chaîne de requêtes sont encodés en UTF-8. Pour utiliser un encodage différent, spécifiez l’option `encodeURIComponent`.  
Par exemple, pour le code suivant :  

```
querystring.stringify({ name: 'value', abc: ['xyz', '123'], anotherName: '' });
```
La valeur renvoyée est :  

```
'name=value&abc=xyz&abc=123&anotherName='
```
`querystring.encode()` est un alias pour `querystring.stringify()`.

`querystring.unescape(string)`  
Décode les caractères encodés en pourcentage URL dans la `string` donnée, en renvoyant une chaîne de requêtes non échappée. Cette méthode est utilisée par `querystring.parse()` et ne doit pas être utilisée directement.

## Fonctions limitées
<a name="writing-functions-javascript-features-restricted-features"></a>

Les fonctionnalités JavaScript linguistiques suivantes ne sont pas prises en charge ou sont restreintes pour des raisons de sécurité.

**Évaluation dynamique du code**  
L'évaluation dynamique du code n'est pas prise en charge. Les deux constructeurs `eval()` et `Function` renvoient une erreur en cas de tentative. Par exemple, `const sum = new Function('a', 'b', 'return a + b')` renvoie une erreur.

**Temporisateurs**  
Les fonctions `setTimeout()`, `setImmediate()` et `clearTimeout()` ne sont pas prises en charge. Il n'y a aucune disposition relative au report ou au produit dans une exécution de fonction. Votre fonction doit s'exécuter de manière synchrone jusqu'à la fin.

**Horodatages**  
Pour des raisons de sécurité, il n'y a pas d'accès aux temporisateurs haute résolution. Toutes les méthodes `Date` pour interroger l’heure actuelle retournent toujours la même valeur pendant la durée de vie d’une même exécution de la fonction. L'horodatage renvoyé est l'heure à laquelle la fonction a commencé à s'exécuter. Par conséquent, vous ne pouvez pas mesurer le temps écoulé dans votre fonction.

**Accès au système de fichiers**  
Il n’y a pas d’accès au système de fichiers. Par exemple, il n’y a pas de module `fs` pour l’accès au système de fichiers comme dans Node.js.

**Accès au traitement**  
Il n’y a aucun accès au traitement. Par exemple, il n’existe pas d’objet global `process` pour accéder aux informations de traitement, comme c’est le cas dans Node.js.

**Variables d’environnement**  
Il n’y a aucun accès aux variables d’environnement.   
Vous pouvez plutôt créer une banque CloudFront KeyValueStore de données centralisée de paires clé-valeur pour vos fonctions. CloudFront CloudFront KeyValueStore permet des mises à jour dynamiques de vos données de configuration sans qu'il soit nécessaire de déployer des modifications de code. Vous devez utiliser [JavaScript Runtime 2.0](functions-javascript-runtime-20.md) pour utiliser CloudFront KeyValueStore. Pour de plus amples informations, veuillez consulter [Amazon CloudFront KeyValueStore](kvs-with-functions.md).

**Accès réseau**  
Les appels réseau ne sont pas pris en charge. Par exemple, XHR, HTTP(S) et socket ne sont pas pris en charge.

# JavaScript fonctionnalités d'exécution 2.0 pour CloudFront Functions
<a name="functions-javascript-runtime-20"></a>

L'environnement JavaScript d'exécution CloudFront Functions est compatible avec [ECMAScript (ES) version 5.1](https://262.ecma-international.org/5.1/) et prend également en charge certaines fonctionnalités des versions ES 6 à 12. Il fournit également des méthodes non standard qui ne font pas partie des spécifications ES. Les rubriques suivantes répertorient toutes les fonctionnalités de cet environnement d’exécution.

**Topics**
+ [

## Fonctions de base
](#writing-functions-javascript-features-core-20)
+ [

## Objets primitifs
](#writing-functions-javascript-features-primitive-objects-20)
+ [

## Objets intégrés
](#writing-functions-javascript-features-builtin-objects-20)
+ [

## Types d’erreurs
](#writing-functions-javascript-features-error-types-20)
+ [

## Globals
](#writing-functions-javascript-features-globals-20)
+ [

## Modules intégrés
](#writing-functions-javascript-features-builtin-modules-20)
+ [

## Fonctions limitées
](#writing-functions-javascript-features-restricted-features-20)

## Fonctions de base
<a name="writing-functions-javascript-features-core-20"></a>

Les fonctions de base suivantes d'ES sont prises en charge.

**Types**  
Tous les types ES 5.1 sont pris en charge, notamment les valeurs booléennes, les nombres, les chaînes, les objets, les tableaux, les fonctions et les expressions régulières.

**Opérateurs**  
Tous les opérateurs ES 5.1 sont pris en charge.  
L’opérateur d’exponentiation ES 7 (`**`) est pris en charge.

**Instructions**  
Les instructions ES 5.1 suivantes sont prises en charge :  
+ `break`
+ `catch`
+ `continue`
+ `do-while`
+ `else`
+ `finally`
+ `for`
+ `for-in`
+ `if`
+ `label`
+ `return`
+ `switch`
+ `throw`
+ `try`
+ `var`
+ `while`
Les instructions ES 6 suivantes sont prises en charge :  
+ `const`
+ `let`
Les instructions ES 8 suivantes sont prises en charge :  
+ `async`
+ `await`
`async`, `await``const`, et `let` sont pris en charge dans JavaScript Runtime 2.0.  
`await` ne peut être utilisé qu’à l’intérieur de fonctions `async`. Les arguments et fermetures `async` ne sont pas pris en charge.

**Littéraux**  
Les littéraux de modèles ES 6 sont pris en charge : chaînes multiligne, interpolation d'expression et modèles d'imbrication.

**Fonctions**  
Toutes les fonctions ES 5.1 sont prises en charge.  
Les fonctions de flèche ES 6 ainsi que la syntaxe des paramètres du reste ES 6 sont prises en charge.

**Unicode**  
Le texte source et les littéraux de chaînes peuvent contenir des caractères Unicode. Les séquences d’échappement de points de code Unicode de six caractères (par exemple `\uXXXX`) sont également prises en charge.

**Mode strict**  
Les fonctions opèrent en mode strict par défaut. Vous n’avez donc pas besoin d’ajouter une instruction `use strict` dans votre code de fonction. Elles ne peuvent pas être modifiées.

## Objets primitifs
<a name="writing-functions-javascript-features-primitive-objects-20"></a>

Les objets primitifs suivants d'ES sont pris en charge.

**Objet**  
Les méthodes ES 5.1 suivantes sur les objets sont prises en charge :  
+ `Object.create()` (sans liste de propriétés)
+ `Object.defineProperties()`
+ `Object.defineProperty()`
+ `Object.freeze()`
+ `Object.getOwnPropertyDescriptor()`
+ `Object.getOwnPropertyDescriptors()`
+ `Object.getOwnPropertyNames()`
+ `Object.getPrototypeOf()`
+ `Object.isExtensible()`
+ `Object.isFrozen()`
+ `Object.isSealed()`
+ `Object.keys()`
+ `Object.preventExtensions()`
+ `Object.seal()`
Les méthodes ES 6 suivantes sur les objets sont prises en charge :  
+ `Object.assign()`
Les méthodes ES 8 suivantes sur les objets sont prises en charge :  
+ `Object.entries()`
+ `Object.values()`
Les méthodes de prototype d’ES 5.1 suivantes sur les objets sont prises en charge :  
+ `Object.prototype.hasOwnProperty()`
+ `Object.prototype.isPrototypeOf()`
+ `Object.prototype.propertyIsEnumerable()`
+ `Object.prototype.toString()`
+ `Object.prototype.valueOf()`
Les méthodes de prototype d’ES 6 suivantes sur les objets sont prises en charge :  
+ `Object.prototype.is()`
+ `Object.prototype.setPrototypeOf()`

**String**  
Les méthodes ES 5.1 suivantes sur les chaînes sont prises en charge :  
+ `String.fromCharCode()`
Les méthodes ES 6 suivantes sur les chaînes sont prises en charge :  
+ `String.fromCodePoint()`
Les méthodes de prototype d’ES 5.1 suivantes sur les chaînes sont prises en charge :  
+ `String.prototype.charAt()`
+ `String.prototype.concat()`
+ `String.prototype.indexOf()`
+ `String.prototype.lastIndexOf()`
+ `String.prototype.match()`
+ `String.prototype.replace()`
+ `String.prototype.search()`
+ `String.prototype.slice()`
+ `String.prototype.split()`
+ `String.prototype.substr()`
+ `String.prototype.substring()`
+ `String.prototype.toLowerCase()`
+ `String.prototype.trim()`
+ `String.prototype.toUpperCase()`
Les méthodes de prototype d’ES 6 suivantes sur les chaînes sont prises en charge :  
+ `String.prototype.codePointAt()`
+ `String.prototype.endsWith()`
+ `String.prototype.includes()`
+ `String.prototype.repeat()`
+ `String.prototype.startsWith()`
Les méthodes de prototype d’ES 8 suivantes sur les chaînes sont prises en charge :  
+ `String.prototype.padStart()`
+ `String.prototype.padEnd()`
Les méthodes de prototype d’ES 9 suivantes sur les chaînes sont prises en charge :  
+ `String.prototype.trimStart()`
+ `String.prototype.trimEnd()`
Les méthodes de prototype d’ES 12 suivantes sur les chaînes sont prises en charge :  
+ `String.prototype.replaceAll()`
**Note**  
`String.prototype.replaceAll()`est nouveau dans JavaScript Runtime 2.0.

**Number**  
TOUS les nombres d’ES 5 sont pris en charge.  
Les propriétés d’ES 6 suivantes sur les nombres sont prises en charge :  
+ `Number.EPSILON`
+ `Number.MAX_SAFE_INTEGER`
+ `Number.MIN_SAFE_INTEGER`
+ `Number.MAX_VALUE`
+ `Number.MIN_VALUE`
+ `Number.NaN`
+ `Number.NEGATIVE_INFINITY`
+ `Number.POSITIVE_INFINITY`
Les méthodes ES 6 suivantes sur les nombres sont prises en charge :  
+ `Number.isFinite()`
+ `Number.isInteger()`
+ `Number.isNaN()`
+ `Number.isSafeInteger()`
+ `Number.parseInt()`
+ `Number.parseFloat()`
Les méthodes de prototype d’ES 5.1 suivantes sur les nombres sont prises en charge :  
+ `Number.prototype.toExponential()`
+ `Number.prototype.toFixed()`
+ `Number.prototype.toPrecision()`
Les séparateurs numériques d’ES 12 sont pris en charge.  
Les séparateurs numériques ES 12 sont nouveaux dans JavaScript Runtime 2.0.

## Objets intégrés
<a name="writing-functions-javascript-features-builtin-objects-20"></a>

Les objets intégrés suivants d'ES sont pris en charge.

**Mathématiques**  
Toutes les méthodes mathématiques ES 5.1 sont prises en charge.  
Dans l'environnement d'exécution de CloudFront Functions, l'`Math.random()`implémentation utilise `arc4random` OpenBSD prédéfini avec l'horodatage de l'exécution de la fonction.
Les propriétés mathématiques d’ES 6 suivantes sont prises en charge :  
+ `Math.E`
+ `Math.LN10`
+ `Math.LN2`
+ `Math.LOG10E`
+ `Math.LOG2E`
+ `Math.PI`
+ `Math.SQRT1_2`
+ `Math.SQRT2`
Les méthodes mathématiques ES 6 suivantes sont prises en charge :  
+ `Math.abs()`
+ `Math.acos()`
+ `Math.acosh()`
+ `Math.asin()`
+ `Math.asinh()`
+ `Math.atan()`
+ `Math.atan2()`
+ `Math.atanh()`
+ `Math.cbrt()`
+ `Math.ceil()`
+ `Math.clz32()`
+ `Math.cos()`
+ `Math.cosh()`
+ `Math.exp()`
+ `Math.expm1()`
+ `Math.floor()`
+ `Math.fround()`
+ `Math.hypot()`
+ `Math.imul()`
+ `Math.log()`
+ `Math.log1p()`
+ `Math.log2()`
+ `Math.log10()`
+ `Math.max()`
+ `Math.min()`
+ `Math.pow()`
+ `Math.random()`
+ `Math.round()`
+ `Math.sign()`
+ `Math.sinh()`
+ `Math.sin()`
+ `Math.sqrt()`
+ `Math.tan()`
+ `Math.tanh()`
+ `Math.trunc()`

**Date**  
Toutes les fonctions `Date` ES 5.1 sont prises en charge.  
Pour des raisons de sécurité, `Date` renvoie toujours la même valeur (l’heure de début de la fonction) pendant la durée de vie d’une même exécution de la fonction. Pour plus d’informations, consultez [Fonctions limitées](functions-javascript-runtime-10.md#writing-functions-javascript-features-restricted-features).

**Fonction**  
Les méthodes de prototype d’ES 5.1 suivantes sont prises en charge :  
+ `Function.prototype.apply()`
+ `Function.prototype.bind()`
+ `Function.prototype.call()`
Les constructeurs de fonctions ne sont pas pris en charge.

**Expressions régulières**  
Toutes les fonctions d'expression régulière ES 5.1 sont prises en charge. Le langage d’expression régulière est compatible Perl.  
Les propriétés d’accesseur de prototype d’ES 5.1 suivantes sont prises en charge :  
+ `RegExp.prototype.global`
+ `RegExp.prototype.ignoreCase`
+ `RegExp.protoype.multiline`
+ `RegExp.protoype.source`
+ `RegExp.prototype.sticky`
+ `RegExp.prototype.flags`
**Note**  
`RegExp.prototype.sticky`et `RegExp.prototype.flags` sont nouveaux dans JavaScript Runtime 2.0.
Les méthodes de prototype d’ES 5.1 suivantes sont prises en charge :  
+ `RegExp.prototype.exec()`
+ `RegExp.prototype.test()`
+ `RegExp.prototype.toString()`
+ `RegExp.prototype[@@replace]()`
+ `RegExp.prototype[@@split]()`
**Note**  
`RegExp.prototype[@@split]()`est nouveau dans JavaScript Runtime 2.0.
Les propriétés d’instance d’ES 5.1 suivantes sont prises en charge :  
+ `lastIndex`
Les groupes de capture nommés ES 9 sont pris en charge.

**JSON**  
Les méthodes d’ES 5.1 suivantes sont prises en charge :  
+ `JSON.parse()`
+ `JSON.stringify()`

**Array**  
Les méthodes ES 5.1 suivantes sur les tableaux sont prises en charge :  
+ `Array.isArray()`
Les méthodes ES 6 suivantes sur les tableaux sont prises en charge :  
+ `Array.of()`
Les méthodes de prototype d’ES 5.1 suivantes sont prises en charge :  
+ `Array.prototype.concat()`
+ `Array.prototype.every()`
+ `Array.prototype.filter()`
+ `Array.prototype.forEach()`
+ `Array.prototype.indexOf()`
+ `Array.prototype.join()`
+ `Array.prototype.lastIndexOf()`
+ `Array.prototype.map()`
+ `Array.prototype.pop()`
+ `Array.prototype.push()`
+ `Array.prototype.reduce()`
+ `Array.prototype.reduceRight()`
+ `Array.prototype.reverse()`
+ `Array.prototype.shift()`
+ `Array.prototype.slice()`
+ `Array.prototype.some()`
+ `Array.prototype.sort()`
+ `Array.prototype.splice()`
+ `Array.prototype.unshift()`
Les méthodes de prototype d’ES 6 suivantes sont prises en charge :  
+ `Array.prototype.copyWithin()`
+ `Array.prototype.fill()`
+ `Array.prototype.find()`
+ `Array.prototype.findIndex()`
Les méthodes de prototype d’ES 7 suivantes sont prises en charge :  
+ `Array.prototype.includes()`

**Tableaux typés**  
Les constructeurs de tableaux typés d’ES 6 suivants sont pris en charge :  
+ `Float32Array`
+ `Float64Array`
+ `Int8Array`
+ `Int16Array`
+ `Int32Array`
+ `Uint8Array`
+ `Uint8ClampedArray`
+ `Uint16Array`
+ `Uint32Array`
Les méthodes d’ES 6 suivantes sont prises en charge :  
+ `TypedArray.from()`
+ `TypedArray.of()`
**Note**  
`TypedArray.from()`et `TypedArray.of()` sont nouveaux dans JavaScript Runtime 2.0.
Les méthodes de prototype d’ES 6 suivantes sont prises en charge :  
+ `TypedArray.prototype.copyWithin()`
+ `TypedArray.prototype.every()`
+ `TypedArray.prototype.fill()`
+ `TypedArray.prototype.filter()`
+ `TypedArray.prototype.find()`
+ `TypedArray.prototype.findIndex()`
+ `TypedArray.prototype.forEach()`
+ `TypedArray.prototype.includes()`
+ `TypedArray.prototype.indexOf()`
+ `TypedArray.prototype.join()`
+ `TypedArray.prototype.lastIndexOf()`
+ `TypedArray.prototype.map()`
+ `TypedArray.prototype.reduce()`
+ `TypedArray.prototype.reduceRight()`
+ `TypedArray.prototype.reverse()`
+ `TypedArray.prototype.some()`
+ `TypedArray.prototype.set()`
+ `TypedArray.prototype.slice()`
+ `TypedArray.prototype.sort()`
+ `TypedArray.prototype.subarray()`
+ `TypedArray.prototype.toString()`
**Note**  
`TypedArray.prototype.every()`,`TypedArray.prototype.fill()`,`TypedArray.prototype.filter()`,`TypedArray.prototype.find()`,`TypedArray.prototype.findIndex()`,,`TypedArray.prototype.forEach()`,`TypedArray.prototype.includes()`,`TypedArray.prototype.indexOf()`,`TypedArray.prototype.join()`,`TypedArray.prototype.lastIndexOf()`,`TypedArray.prototype.map()`,`TypedArray.prototype.reduce()`,`TypedArray.prototype.reduceRight()`,`TypedArray.prototype.reverse()`, et `TypedArray.prototype.some()` sont nouveaux dans JavaScript Runtime 2.0.

**ArrayBuffer**  
Les méthodes ES 6 suivantes ArrayBuffer sont prises en charge :  
+ `isView()`
Les méthodes de prototypage ES 6 suivantes ArrayBuffer sont prises en charge :  
+ `ArrayBuffer.prototype.slice()`

**Promesse**  
Les méthodes d’ES 6 suivantes sur les promesses sont prises en charge :  
+ `Promise.all()`
+ `Promise.allSettled()`
+ `Promise.any()`
+ `Promise.reject()`
+ `Promise.resolve()`
+ `Promise.race()`
**Note**  
`Promise.all()`, `Promise.allSettled()``Promise.any()`, et `Promise.race()` sont nouveaux dans JavaScript Runtime 2.0.
Les méthodes de prototype d’ES 6 suivantes sur les promesses sont prises en charge :  
+ `Promise.prototype.catch()`
+ `Promise.prototype.finally()`
+ `Promise.prototype.then()`

**DataView**  
Les méthodes de prototype d’ES 6 suivantes sont prises en charge :  
+ `DataView.prototype.getFloat32()`
+ `DataView.prototype.getFloat64()`
+ `DataView.prototype.getInt16()`
+ `DataView.prototype.getInt32()`
+ `DataView.prototype.getInt8()`
+ `DataView.prototype.getUint16()`
+ `DataView.prototype.getUint32()`
+ `DataView.prototype.getUint8()`
+ `DataView.prototype.setFloat32()`
+ `DataView.prototype.setFloat64()`
+ `DataView.prototype.setInt16()`
+ `DataView.prototype.setInt32()`
+ `DataView.prototype.setInt8()`
+ `DataView.prototype.setUint16()`
+ `DataView.prototype.setUint32()`
+ `DataView.prototype.setUint8()`
**Note**  
Toutes les méthodes de prototypage de Dataview ES 6 sont nouvelles dans JavaScript Runtime 2.0.

**Symbol**  
Les méthodes d’ES 6 suivantes sont prises en charge :  
+ `Symbol.for()`
+ `Symbol.keyfor()`
**Note**  
Toutes les méthodes Symbol ES 6 sont nouvelles dans JavaScript Runtime 2.0.

**TextDecoder**  
Les méthodes de prototype suivantes sont prises en charge :  
+ `TextDecoder.prototype.decode()`
Les propriétés d’accesseur de prototype suivantes sont prises en charge :  
+ `TextDecoder.prototype.encoding`
+ `TextDecoder.prototype.fatal`
+ `TextDecoder.prototype.ignoreBOM`

**TextEncoder**  
Les méthodes de prototype suivantes sont prises en charge :  
+ `TextEncoder.prototype.encode()`
+ `TextEncoder.prototype.encodeInto()`

**Console**  
Il s'agit d'un objet d'aide pour le débogage. Il ne prend en charge que la méthode `log()`, pour enregistrer les messages de journaux.  
CloudFront Les fonctions ne prennent pas en charge la syntaxe des virgules, telle que`console.log('a', 'b')`. Utilisez plutôt le format `console.log('a' + ' ' + 'b')`.

## Types d’erreurs
<a name="writing-functions-javascript-features-error-types-20"></a>

Les objets d’erreurs suivants sont pris en charge :
+ `Error`
+ `EvalError`
+ `InternalError`
+ `RangeError`
+ `ReferenceError`
+ `SyntaxError`
+ `TypeError`
+ `URIError`

## Globals
<a name="writing-functions-javascript-features-globals-20"></a>

L’objet `globalThis` est pris en charge.

Les fonctions globales ES 5.1 suivantes sont prises en charge :
+ `decodeURI()`
+ `decodeURIComponent()`
+ `encodeURI()`
+ `encodeURIComponent()`
+ `isFinite()`
+ `isNaN()`
+ `parseFloat()`
+ `parseInt()`

Les fonctions globales d’ES 6 suivantes sont prises en charge :
+ `atob()`
+ `btoa()`
**Note**  
`atob()`et `btoa()` sont nouveaux dans JavaScript Runtime 2.0.

Les constantes globales suivantes sont prises en charge :
+ `NaN`
+ `Infinity`
+ `undefined`
+ `arguments`

## Modules intégrés
<a name="writing-functions-javascript-features-builtin-modules-20"></a>

Les modules intégrés suivants sont pris en charge.

**Topics**
+ [

### Buffer
](#writing-functions-javascript-features-builtin-modules-buffer-20)
+ [

### Chaîne de requête
](#writing-functions-javascript-features-builtin-modules-query-string-20)
+ [

### Cryptographie
](#writing-functions-javascript-features-builtin-modules-crypto-20)

### Buffer
<a name="writing-functions-javascript-features-builtin-modules-buffer-20"></a>

Le module fournit les méthodes suivantes :
+ `Buffer.alloc(size[, fill[, encoding]])`

  Allouez un élément `Buffer`.
  + `size` : taille du tampon. Entrez un entier.
  + `fill`: Facultatif. Entrez une chaîne, un élément `Buffer`, un élément Uint8Array ou un entier. La valeur par défaut est `0`. 
  + `encoding`: Facultatif. Quand `fill` est une chaîne, entrez l’une des valeurs suivantes : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.allocUnsafe(size)`

  Allouez un élément `Buffer` non initialisé.
  + `size` : entrez un entier.
+ `Buffer.byteLength(value[, encoding])`

  Renvoie la longueur d’une valeur, en octets.
  + `value`: chaîne, `Buffer` TypedArray, Dataview ou Arraybuffer.
  + `encoding`: Facultatif. Quand `value` est une chaîne, entrez l’une des valeurs suivantes : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.compare(buffer1, buffer2)`

  Comparez deux éléments `Buffer` pour faciliter le tri des tableaux. Renvoie `0` s’ils sont identiques, `-1` si `buffer1` figure en premier, ou `1` si `buffer2` figure en premier.
  + `buffer1` : entrez un élément `Buffer`.
  + `buffer2` : entrez un autre élément `Buffer`.
+ `Buffer.concat(list[, totalLength])`

  Concaténez plusieurs éléments `Buffer`. Renvoie `0` s’il n’y en a aucun. Renvoie jusqu’à `totalLength`.
  + `list` : entrez une liste d’éléments `Buffer`. Notez que cela sera tronqué à `totalLength`.
  + `totalLength`: Facultatif. Entrez un entier non signé. Utilisez la somme des instances `Buffer` dans la liste si le paramètre est vide.
+ `Buffer.from(array)`

  Créez un élément `Buffer` à partir d’un tableau.
  + `array` : entrez un tableau d’octets de `0` à `255`. 
+ `Buffer.from(arrayBuffer, byteOffset[, length]))`

  Créez une vue à partir de `arrayBuffer`, en commençant par le décalage `byteOffset` avec la longueur `length`.
  + `arrayBuffer` : entrez un tableau `Buffer`.
  + `byteOffset` : entrez un entier.
  + `length`: Facultatif. Entrez un entier.
+ `Buffer.from(buffer)`

  Créez une copie de l’élément `Buffer`.
  + `buffer` : entrez un élément `Buffer`.
+ `Buffer.from(object[, offsetOrEncoding[, length]])`

  Créez un élément `Buffer` à partir d’un objet. Renvoie `Buffer.from(object.valueOf(), offsetOrEncoding, length)` si `valueOf()` n’est pas égal à l’objet.
  + `object` : entrez un objet.
  + `offsetOrEncoding`: Facultatif. Entrez un entier ou une chaîne d’encodage.
  + `length`: Facultatif. Entrez un entier.
+ `Buffer.from(string[, encoding])`

  Créez un élément `Buffer` à partir d’une chaîne.
  + `string` : entrez une chaîne.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.isBuffer(object)`

  Vérifiez si `object` est un tampon. Renvoie `true` ou `false`.
  + `object` : entrez un objet.
+ `Buffer.isEncoding(encoding)`

  Vérifiez si `encoding` est pris en charge. Renvoie `true` ou `false`.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.

Le module fournit les méthodes de prototype de tampon suivantes :
+ `Buffer.prototype.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])`

  Comparez `Buffer` avec la cible. Renvoie `0` s’ils sont identiques, `1` si `buffer` figure en premier, ou `-1` si `target` figure en premier.
  + `target` : entrez un élément `Buffer`.
  + `targetStart`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `targetEnd`: Facultatif. Entrez un entier. La valeur par défaut est la longueur `target`.
  + `sourceStart`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `sourceEnd`: Facultatif. Entrez un entier. La valeur par défaut est la longueur de `Buffer`.
+ `Buffer.prototype.copy(target[, targetStart[, sourceStart[, sourceEnd]]])`

  Copiez le tampon dans `target`.
  + `target` : entrez un élément `Buffer` ou `Uint8Array`.
  + `targetStart`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `sourceStart`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `sourceEnd`: Facultatif. Entrez un entier. La valeur par défaut est la longueur de `Buffer`.
+ `Buffer.prototype.equals(otherBuffer)`

  Comparez `Buffer` à `otherBuffer`. Renvoie `true` ou `false`.
  + `otherBuffer` : entrez une chaîne.
+ `Buffer.prototype.fill(value[, offset[, end][, encoding])`

  Remplissez `Buffer` avec `value`.
  + `value` : entrez une chaîne, `Buffer` ou un entier.
  + `offset`: Facultatif. Entrez un entier.
  + `end`: Facultatif. Entrez un entier.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.prototype.includes(value[, byteOffset][, encoding])`

  Recherchez `value` dans `Buffer`. Renvoie `true` ou `false`.
  + `value` : entrez une chaîne, un élément `Buffer`, `Uint8Array` ou un entier.
  + `byteOffset`: Facultatif. Entrez un entier.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.prototype.indexOf(value[, byteOffset][, encoding])`

  Recherchez le premier élément `value` dans `Buffer`. Retourne `index` s’il est trouvé ou `-1` dans le cas contraire.
  + `value` : entrez une chaîne, `Buffer`, Unit8Array ou un entier compris entre 0 et 255. 
  + `byteOffset`: Facultatif. Entrez un entier.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants si `value` est une chaîne : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.prototype.lastIndexOf(value[, byteOffset][, encoding])`

  Recherchez le dernier élément `value` dans `Buffer`. Retourne `index` s’il est trouvé ou `-1` dans le cas contraire.
  + `value` : entrez une chaîne, `Buffer`, Unit8Array ou un entier compris entre 0 et 255. 
  + `byteOffset`: Facultatif. Entrez un entier.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants si `value` est une chaîne : `utf8`, `hex`, `base64`, `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.prototype.readInt8(offset)`

  Lisez `Int8` à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readIntBE(offset, byteLength)`

  Lisez `Int` dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
  + `byteLength`: Facultatif. Entrez un entier compris entre `1` et `6`.
+ `Buffer.prototype.readInt16BE(offset)`

  Lisez `Int16` dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readInt32BE(offset)`

  Lisez `Int32` dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readIntLE(offset, byteLength)`

  Lisez `Int` dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.readInt16LE(offset)`

  Lisez `Int16` dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readInt32LE(offset)`

  Lisez `Int32` dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readUInt8(offset)`

  Lisez `UInt8` à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readUIntBE(offset, byteLength)`

  Lisez `UInt` dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.readUInt16BE(offset)`

  Lisez `UInt16` dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
+ 
  + `offset` : entrez un entier.
+ `Buffer.prototype.readUInt32BE(offset)`

  Lisez `UInt32` dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readUIntLE(offset, byteLength)`

  Lisez `UInt` dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.readUInt16LE(offset)`

  Lisez `UInt16` dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readUInt32LE(offset)`

  Lisez `UInt32` dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset` : entrez un entier.
+ `Buffer.prototype.readDoubleBE([offset])`

  Lisez une valeur double 64 bits dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset`: Facultatif. Entrez un entier.
+ `Buffer.prototype.readDoubleLE([offset])`

  Lisez une valeur double 64 bits dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset`: Facultatif. Entrez un entier.
+ `Buffer.prototype.readFloatBE([offset])`

  Lisez une valeur float 32 bits dans l’ordre gros-boutiste à la position `offset` à partir de `Buffer`.
  + `offset`: Facultatif. Entrez un entier.
+ `Buffer.prototype.readFloatLE([offset])`

  Lisez une valeur float 32 bits dans l’ordre petit-boutiste à la position `offset` à partir de `Buffer`.
  + `offset`: Facultatif. Entrez un entier.
+ `Buffer.prototype.subarray([start[, end]])`

  Renvoie une copie de l’élément `Buffer` décalée et recadrée avec de nouveaux éléments `start` et `end`.
  + `start`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `end`: Facultatif. Entrez un entier. La valeur par défaut est la longueur du tampon.
+ `Buffer.prototype.swap16()`

  Échangez l’ordre des octets du tableau `Buffer` en le traitant comme un tableau de nombres de 16 bits. La longueur de `Buffer` doit être divisible par 2, sans quoi vous recevrez une erreur.
+ `Buffer.prototype.swap32()`

  Échangez l’ordre des octets du tableau `Buffer` en le traitant comme un tableau de nombres de 32 bits. La longueur de `Buffer` doit être divisible par 4, sans quoi vous recevrez une erreur.
+ `Buffer.prototype.swap64()`

  Échangez l’ordre des octets du tableau `Buffer` en le traitant comme un tableau de nombres de 64 bits. La longueur de `Buffer` doit être divisible par 8, sans quoi vous recevrez une erreur.
+ `Buffer.prototype.toJSON()`

  Renvoie l’élément `Buffer` au format JSON. 
+ `Buffer.prototype.toString([encoding[, start[, end]]])`

  Convertissez l’élément `Buffer`, de `start` à `end`, en chaîne encodée.
  + `encoding`: Facultatif. Entrez l’un des éléments suivants : `utf8`, `hex`, `base64` ou `base64url`. La valeur par défaut est `utf8`.
  + `start`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `end`: Facultatif. Entrez un entier. La valeur par défaut est la longueur du tampon.
+ `Buffer.prototype.write(string[, offset[, length]][, encoding])`

  Écrivez l’élément `string` encodé dans `Buffer` s’il y a de l’espace, ou un élément `string` tronqué s’il n’y a pas assez d’espace.
  + `string` : entrez une chaîne.
  + `offset`: Facultatif. Entrez un entier. La valeur par défaut est 0.
  + `length`: Facultatif. Entrez un entier. La valeur par défaut est la longueur de la chaîne.
  + `encoding`: Facultatif. Entrez éventuellement l’un des éléments suivants : `utf8`, `hex`, `base64` ou `base64url`. La valeur par défaut est `utf8`.
+ `Buffer.prototype.writeInt8(value, offset, byteLength)`

  Écrivez l’élément `value` `Int8` de `byteLength` à la position `offset` dans l’élément `Buffer`.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeIntBE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeInt16BE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeInt32BE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeIntLE(offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeInt16LE(offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeInt32LE(offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUInt8(value, offset, byteLength)`

  Écrivez l’élément `value` `UInt8` de `byteLength` à la position `offset` dans `Buffer`.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUIntBE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUInt16BE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUInt32BE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUIntLE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUInt16LE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeUInt32LE(value, offset, byteLength)`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `value` : entrez un entier.
  + `offset` : entrez un entier.
  + `byteLength` : entrez un entier entre `1` et `6`.
+ `Buffer.prototype.writeDoubleBE(value, [offset])`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset`: Facultatif. Entrez un entier. La valeur par défaut est 0.
+ `Buffer.prototype.writeDoubleLE(value, [offset])`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `value` : entrez un entier.
  + `offset`: Facultatif. Entrez un entier. La valeur par défaut est 0.
+ `Buffer.prototype.writeFloatBE(value, [offset])`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre gros-boutiste.
  + `value` : entrez un entier.
  + `offset`: Facultatif. Entrez un entier. La valeur par défaut est 0.
+ `Buffer.prototype.writeFloatLE(value, [offset])`

  Écrivez `value` à la position `offset` dans `Buffer` en utilisant l’ordre petit-boutiste.
  + `value` : entrez un entier.
  + `offset`: Facultatif. Entrez un entier. La valeur par défaut est 0.

Les méthodes d’instance suivantes sont prises en charge :
+ `buffer[index]`

  Obtenez et définissez l’octet (byte) à la position `index` dans l’élément `Buffer`. 
  + Obtenez un nombre entre `0` et `255`. Ou définissez un nombre entre `0` et `255`.

Les propriétés d’instance suivantes sont prises en charge :
+ `buffer`

  Obtenez l’objet `ArrayBuffer` pour le tampon. 
+ `byteOffset`

  Obtenez l’élément `byteOffset` de l’objet `Arraybuffer` du tampon.
+ `length`

  Obtenez le nombre d’octets du tampon.

**Note**  
Toutes les méthodes du module Buffer sont nouvelles dans JavaScript Runtime 2.0.

### Chaîne de requête
<a name="writing-functions-javascript-features-builtin-modules-query-string-20"></a>

**Note**  
L'[objet d'événement CloudFront Functions](functions-event-structure.md) analyse automatiquement les chaînes de requête d'URL pour vous. Cela signifie que, dans la plupart des cas, vous n'avez pas besoin d'utiliser ce module.

Le module de chaînes de requêtes (`querystring`) fournit des méthodes d’analyse et de formatage des chaînes de requêtes URL. Vous pouvez charger le module en utilisant `require('querystring')`. Le module fournit les méthodes suivantes :

`querystring.escape(string)`  
Encode par URL la `string` donnée, en renvoyant une chaîne de requêtes échappée. La méthode est utilisée par `querystring.stringify()` et ne doit pas être utilisée directement.

`querystring.parse(string[, separator[, equal[, options]]])`  
Analyse une chaîne de requêtes (`string`) et renvoie un objet.  
Le paramètre `separator` est une sous-chaîne permettant de délimiter les paires clé-valeur dans la chaîne de requêtes. Par défaut, il s’agit de `&`.  
Le paramètre `equal` est une sous-chaîne permettant de délimiter les clés et les valeurs dans la chaîne de requêtes. Par défaut, il s’agit de `=`.  
Le paramètre `options` est un objet avec les clés suivantes :    
`decodeURIComponent function`  
Fonction pour décoder les caractères encodés en pourcentage dans la chaîne de requêtes. Par défaut, il s’agit de `querystring.unescape()`.  
`maxKeys number`  
Nombre maximal de clés à analyser. Par défaut, il s’agit de `1000`. Utilisez une valeur de `0` pour supprimer les limitations pour le comptage des clés.
Par défaut, les caractères encodés en pourcentage dans la chaîne de requêtes sont supposés utiliser l'encodage UTF-8. Les séquences UTF-8 non valides sont remplacées par le caractère de remplacement `U+FFFD`.  
Par exemple, pour la chaîne de requêtes suivante :  

```
'name=value&abc=xyz&abc=123'
```
La valeur renvoyée de `querystring.parse()` est :  

```
{
name: 'value',
abc: ['xyz', '123']
}
```
`querystring.decode()` est un alias pour `querystring.parse()`.

`querystring.stringify(object[, separator[, equal[, options]]])`  
Sérialise un `object` et renvoie une chaîne de requêtes.  
Le paramètre `separator` est une sous-chaîne permettant de délimiter les paires clé-valeur dans la chaîne de requêtes. Par défaut, il s’agit de `&`.  
Le paramètre `equal` est une sous-chaîne permettant de délimiter les clés et les valeurs dans la chaîne de requêtes. Par défaut, il s’agit de `=`.  
Le paramètre `options` est un objet avec les clés suivantes :    
`encodeURIComponent function`  
Fonction à utiliser pour convertir des caractères non sûrs pour une URL en encodage en pourcentage dans la chaîne de requêtes. Par défaut, il s’agit de `querystring.escape()`.
Par défaut, les caractères qui nécessitent un encodage en pourcentage dans la chaîne de requêtes sont encodés en UTF-8. Pour utiliser un encodage différent, spécifiez l’option `encodeURIComponent`.  
Par exemple, pour le code suivant :  

```
querystring.stringify({ name: 'value', abc: ['xyz', '123'], anotherName: '' });
```
La valeur renvoyée est :  

```
'name=value&abc=xyz&abc=123&anotherName='
```
`querystring.encode()` est un alias pour `querystring.stringify()`.

`querystring.unescape(string)`  
Décode les caractères encodés en pourcentage URL dans la `string` donnée, en renvoyant une chaîne de requêtes non échappée. Cette méthode est utilisée par `querystring.parse()` et ne doit pas être utilisée directement.

### Cryptographie
<a name="writing-functions-javascript-features-builtin-modules-crypto-20"></a>

Le module cryptographique (`crypto`) fournit des aides standard en matière de hachage et de code d’authentification de message basé sur le hachage (HMAC). Vous pouvez charger le module en utilisant `require('crypto')`.

**Méthodes de hachage**

`crypto.createHash(algorithm)`  
Crée et renvoie un objet de hachage que vous pouvez utiliser pour générer des résumés de hachage à l’aide de l’algorithme donné : `md5`, `sha1` ou `sha256`.

`hash.update(data)`  
Met à jour le contenu de hachage avec les `data` données

`hash.digest([encoding])`  
Calcule le résumé de toutes les données transmises à l’aide de `hash.update()`. L’encodage peut être `hex`, `base64` ou `base64url`.

**Méthodes HMAC**

`crypto.createHmac(algorithm, secret key)`  
Crée et renvoie un objet HMAC qui utilise le `algorithm` et la `secret key` donnés. L’algorithme peut être `md5`, `sha1` ou `sha256`.

`hmac.update(data)`  
Met à jour le contenu HMAC avec les `data` données.

`hmac.digest([encoding])`  
Calcule le résumé de toutes les données transmises à l’aide de `hmac.update()`. L’encodage peut être `hex`, `base64` ou `base64url`.

## Fonctions limitées
<a name="writing-functions-javascript-features-restricted-features-20"></a>

Les fonctionnalités JavaScript linguistiques suivantes ne sont pas prises en charge ou sont restreintes pour des raisons de sécurité.

**Évaluation dynamique du code**  
L'évaluation dynamique du code n'est pas prise en charge. Les deux constructeurs `eval()` et `Function` renvoient une erreur en cas de tentative. Par exemple, `const sum = new Function('a', 'b', 'return a + b')` renvoie une erreur.

**Temporisateurs**  
Les fonctions `setTimeout()`, `setImmediate()` et `clearTimeout()` ne sont pas prises en charge. Il n'y a aucune disposition relative au report ou au produit dans une exécution de fonction. Votre fonction doit s'exécuter de manière synchrone jusqu'à la fin.

**Horodatages**  
Pour des raisons de sécurité, il n'y a pas d'accès aux temporisateurs haute résolution. Toutes les méthodes `Date` pour interroger l’heure actuelle retournent toujours la même valeur pendant la durée de vie d’une même exécution de la fonction. L'horodatage renvoyé est l'heure à laquelle la fonction a commencé à s'exécuter. Par conséquent, vous ne pouvez pas mesurer le temps écoulé dans votre fonction.

**Accès au système de fichiers**  
Il n’y a pas d’accès au système de fichiers. Par exemple, il n’y a pas de module `fs` pour l’accès au système de fichiers comme dans Node.js.

**Accès au traitement**  
Il n’y a aucun accès au traitement. Par exemple, il n’existe pas d’objet global `process` pour accéder aux informations de traitement, comme c’est le cas dans Node.js.

**Variables d’environnement**  
Il n’y a aucun accès aux variables d’environnement. Vous pouvez plutôt créer une banque CloudFront KeyValueStore de données centralisée de paires clé-valeur pour vos fonctions. CloudFront CloudFront KeyValueStore permet des mises à jour dynamiques de vos données de configuration sans qu'il soit nécessaire de déployer des modifications de code. Pour de plus amples informations, veuillez consulter [Amazon CloudFront KeyValueStore](kvs-with-functions.md).

**Accès réseau**  
Les appels réseau ne sont pas pris en charge. Par exemple, XHR, HTTP(S) et socket ne sont pas pris en charge.

# Méthodes d’aide pour les magasins de clés-valeurs
<a name="functions-custom-methods"></a>

**Note**  
Les appels à la méthode d'assistance au stockage des valeurs clés depuis CloudFront Functions ne déclenchent aucun événement de AWS CloudTrail données. Ces événements ne sont pas enregistrés dans l'historique des CloudTrail événements. Pour de plus amples informations, veuillez consulter [Journalisation des appels CloudFront d'API Amazon à l'aide AWS CloudTrail](logging_using_cloudtrail.md).

Cette section s'applique si vous utilisez le [CloudFront Key Value Store](kvs-with-functions.md) pour inclure des valeurs clés dans la fonction que vous créez. CloudFront Functions possède un module qui fournit trois méthodes d'assistance pour lire les valeurs du magasin de valeurs clés.

Pour utiliser ce module dans le code de fonction, assurez-vous d’avoir [associé un magasin de clés-valeurs](kvs-with-functions-associate.md) à la fonction. 

Ajoutez ensuite les instructions suivantes dans les premières lignes du code de fonction :

```
import cf from 'cloudfront';
const kvsHandle = cf.kvs();
```



## Méthode `get()`
<a name="functions-custom-methods-get"></a>

Utilisez cette méthode pour renvoyer la valeur associée au nom de clé que vous spécifiez. 

**Demande**

```
get("key", options);
```
+ `key` : nom de la clé dont la valeur doit être extraite
+ `options` : vous disposez d’une option, `format`. Elle garantit que la fonction analyse correctement les données. Valeurs possibles :
  + `string`: UTF8 encodé (par défaut)
  + `json` 
  + `bytes` : tampon de données binaires brutes

**Exemple de demande**

```
const value = await kvsHandle.get("myFunctionKey", { format: "string"});
```

**Réponse**

La réponse est une `promise` qui aboutit à une valeur au format demandé en grâce aux `options`. Par défaut, la valeur est renvoyée sous forme de chaîne.

### Gestion des erreurs
<a name="error-handling-exists-method"></a>

La méthode `get()` renvoie une erreur lorsque la clé que vous avez demandée n’existe pas dans le magasin de clés-valeurs associé. Pour gérer ce cas d’utilisation, vous pouvez ajouter un bloc `try` et `catch` à votre code.

**Avertissement**  
L’utilisation de combinateurs de promesses (par exemple : `Promise.all`, `Promise.any`) ainsi que de méthodes de chaînage de promesses (par exemple : `then` et `catch`) peut entraîner une utilisation élevée de la mémoire de la fonction. Si votre fonction dépasse le quota de [mémoire de fonction maximale](cloudfront-limits.md#limits-functions), elle ne pourra pas s’exécuter. Pour éviter cette erreur, nous vous recommandons d’utiliser la syntaxe `await` de manière séquentielle ou en boucle pour demander plusieurs valeurs.  
**Exemple**  

```
var value1 = await kvs.get('key1');
var value2 = await kvs.get('key2');
```
Actuellement, l’utilisation de combinateurs de promesses pour obtenir plusieurs valeurs n’améliore pas les performances, comme dans l’exemple suivant.  

```
var values = await Promise.all([kvs.get('key1'), kvs.get('key2'),]);
```

## Méthode `exists()`
<a name="functions-custom-methods-exists"></a>

Utilisez cette méthode pour déterminer si la clé existe ou non dans le magasin de clés-valeurs.

**Demande**

```
exists("key");
```

**Exemple de demande**

```
const exist = await kvsHandle.exists("myFunctionkey");
```

**Réponse**

La réponse est une `promise` qui renvoie une valeur booléenne (`true` ou `false`). Cette valeur indique si la clé existe ou non dans le magasin de clés-valeurs.

## Méthode `meta()`
<a name="functions-custom-methods-meta"></a>

Utilisez cette méthode pour renvoyer les métadonnées concernant le magasin de clés-valeurs.

**Demande**

```
meta();
```

**Exemple de demande**

```
const meta = await kvsHandle.meta();
```

**Réponse**

La réponse est un élément `promise` qui se résout à un objet doté des propriétés suivantes :
+ `creationDateTime` : date et heure de création du magasin de clés-valeurs, au format ISO 8601.
+ `lastUpdatedDateTime` : date et heure de la dernière synchronisation du magasin de clés-valeurs depuis la source, au format ISO 8601. La valeur n’inclut pas la durée de propagation jusqu’à la périphérie.
+ `keyCount` : nombre total de clés dans le magasin de clés-valeurs après la dernière synchronisation depuis la source.

**Exemple de réponse**

```
{keyCount:3,creationDateTime:2023-11-30T23:07:55.765Z,lastUpdatedDateTime:2023-12-15T03:57:52.411Z}
```

# Méthodes d’assistance pour la modification de l’origine
<a name="helper-functions-origin-modification"></a>

Cette section s'applique si vous mettez à jour ou modifiez dynamiquement l'origine utilisée dans la demande dans votre code CloudFront Functions. Vous pouvez mettre à jour l'origine uniquement à *la CloudFront demande du spectateur*. CloudFront Functions possède un module qui fournit des méthodes d'assistance pour mettre à jour ou modifier dynamiquement l'origine.

Pour utiliser ce module, créez une CloudFront fonction à l'aide de JavaScript Runtime 2.0 et incluez l'instruction suivante dans la première ligne du code de fonction :

```
import cf from 'cloudfront';
```

Pour de plus amples informations, veuillez consulter [JavaScript fonctionnalités d'exécution 2.0 pour CloudFront Functions](functions-javascript-runtime-20.md).

**Note**  
Les pages de l’API de test et de la console de test ne vérifient pas si une modification de l’origine s’est produite. Cependant, les tests garantissent que le code de fonction s’exécute sans erreur.

## Choisissez entre CloudFront Functions et Lambda @Edge
<a name="origin-modification-considerations"></a>

Vous pouvez mettre à jour vos origines en utilisant CloudFront Functions ou Lambda @Edge.

Lorsque vous utilisez CloudFront Functions pour mettre à jour les origines, vous utilisez le déclencheur d'événement de *demande du visualiseur*, ce qui signifie que cette logique s'exécutera à chaque demande lorsque cette fonction est utilisée. Lorsque vous utilisez Lambda@Edge, les fonctionnalités de mise à jour de l’origine se trouvent sur le déclencheur d’événement *demande à l’origine*, ce qui signifie que cette logique ne s’exécute qu’en cas d’échec du cache.

Votre choix dépend largement de votre charge de travail et de toute utilisation existante de CloudFront Functions et Lambda @Edge dans vos distributions. Les considérations suivantes peuvent vous aider à décider d'utiliser CloudFront Functions ou Lambda @Edge pour mettre à jour vos origines.

CloudFront Les fonctions sont particulièrement utiles dans les situations suivantes :
+ Lorsque vos demandes sont dynamiques (c'est-à-dire qu'elles ne peuvent pas être mises en cache) et qu'elles vont toujours à l'origine. CloudFront Les fonctions offrent de meilleures performances et un coût global inférieur.
+ Lorsque vous disposez déjà d'une CloudFront fonction de demande d'affichage qui s'exécute sur chaque demande, vous pouvez ajouter la logique de mise à jour de l'origine à la fonction existante.

Pour utiliser CloudFront Functions pour mettre à jour les origines, consultez les méthodes d'assistance décrites dans les rubriques suivantes.

Lambda@Edge est particulièrement utile dans les cas suivants :
+ Lorsque le contenu peut être facilement mis en cache, Lambda @Edge peut être plus rentable car il s'exécute uniquement en cas d'erreur de cache, CloudFront tandis que Functions s'exécute sur chaque requête.
+ Lorsque vous disposez déjà d’une fonction Lambda@Edge de type demande à l’origine, vous pouvez y ajouter la logique de mise à jour de l’origine.
+ Lorsque votre logique de mise à jour d’origine nécessite de récupérer des données à partir de sources de données tierces, telles qu’Amazon DynamoDB ou Amazon S3.

Pour plus d’informations sur Lambda@Edge, consultez [Personnalisation en périphérie avec Lambda@Edge](lambda-at-the-edge.md).

## updateRequestOrigin() méthode
<a name="update-request-origin-helper-function"></a>

Utilisez la méthode `updateRequestOrigin()` pour mettre à jour les paramètres d’origine d’une demande. Vous pouvez utiliser cette méthode pour mettre à jour les propriétés d’origine existantes pour les origines déjà définies dans votre distribution, ou pour définir une nouvelle origine pour la demande. Pour ce faire, spécifiez les propriétés que vous souhaitez modifier.

**Important**  
Tous les paramètres que vous ne spécifiez pas dans `updateRequestOrigin()` hériteront des *paramètres* définis dans la configuration de l’origine existante.

L'origine définie par la `updateRequestOrigin()` méthode peut être n'importe quel point de terminaison HTTP et il n'est pas nécessaire qu'il s'agisse d'une origine existante au sein de votre CloudFront distribution.

**Remarques**  
Si vous mettez à jour une origine qui fait partie d’un groupe d’origines, seule l’*origine principale* du groupe d’origines est mise à jour. L’origine secondaire reste inchangée. Tout code de réponse provenant de l’origine modifiée qui correspond aux critères de basculement déclenchera un basculement vers l’origine secondaire.
Si vous modifiez le type d’origine et que l’OAC est activé, veillez à ce que le type d’origine dans `originAccessControlConfig` corresponde au nouveau type d’origine.
Vous ne pouvez pas utiliser la méthode `updateRequestOrigin()` pour mettre à jour les [origines VPC](private-content-vpc-origins.md). La demande échouera.

**Demande**

```
updateRequestOrigin({origin properties})
```

Les `origin properties` peuvent contenir les éléments suivants :

**domainName (facultatif)**  
Nom de domaine de l’origine. Si cette valeur n’est pas fournie, le nom de domaine de l’origine associée est utilisé à la place.    
**Pour les origines personnalisées**  
Spécifiez un nom de domaine DNS, tel que `www.example.com`. Le nom de domaine ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. Le nom du domaine peut contenir jusqu’à 253 caractères.  
**Pour les origines S3**  
Spécifiez le nom de domaine DNS du compartiment Amazon S3, tel que `amzn-s3-demo-bucket.s3.eu-west-1.amazonaws.com`. Il peut comporter jusqu’à 128 caractères, qui doivent tous être en minuscules.

**HostHeader (facultatif, pour les origines personnalisées autres que S3)**  
L'en-tête de l'hôte à utiliser lorsque vous envoyez la demande à l'origine. Si ce n'est pas le cas, la valeur du paramètre DomainName est utilisée. Si aucun en-tête d'hôte ou paramètre de nom de domaine n'est fourni, le nom de domaine de l'origine attribuée est utilisé ou l'en-tête de l'hôte de la demande entrante si la politique de transfert vers l'origine (FTO) inclut l'hôte. L'en-tête de l'hôte ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. L'en-tête de l'hôte peut comporter jusqu'à 253 caractères.

**originPath (facultatif)**  
Chemin de répertoire à l’origine où la demande doit localiser le contenu. Ce chemin doit commencer par une barre oblique (/) mais ne doit pas se terminer par une barre oblique. Par exemple, il ne doit pas se terminer par `example-path/`. Si cette valeur n’est pas fournie, le chemin d’origine de l’origine associée est utilisé.    
**Pour les origines personnalisées**  
Le chemin d’accès doit être codé en URL et ne pas dépasser 255 caractères.

**customHeaders (facultatif)**  
Vous pouvez inclure des en-têtes personnalisés dans la requête en spécifiant un nom et une valeur d'en-tête pour chacun d'eux. Le format est différent de celui des en-têtes de demande et de réponse dans la structure de l’événement. Utilisez la syntaxe de paire clé-valeur suivante :  

```
{"key1": "value1", "key2": "value2", ...}
```
Vous ne pouvez pas ajouter d’en-têtes non autorisés, et un en-tête portant le même nom ne peut pas déjà être présent dans la demande entrante `headers`. Le nom de l’en-tête doit être en minuscules dans le code de votre fonction. Lorsque CloudFront Functions reconvertit l'objet d'événement en requête HTTP, la première lettre de chaque mot dans les noms d'en-tête est mise en majuscule et les mots sont séparés par un trait d'union.  
Par exemple, si le code de votre fonction ajoute un en-tête nommé`example-header-name`, le CloudFront convertit en en-tête `Example-Header-Name` dans la requête HTTP. Pour plus d’informations, consultez [En-têtes personnalisés qui ne CloudFront peuvent pas être ajoutés aux demandes d'origine](add-origin-custom-headers.md#add-origin-custom-headers-denylist) et [Restrictions sur les fonctions périphériques](edge-functions-restrictions.md).  
Si cette valeur n’est pas fournie, les en-têtes personnalisés de l’origine associée sont utilisés.

**connectionAttempts (facultatif)**  
Le nombre de CloudFront tentatives de connexion à l'origine. La valeur minimale est 1 et la valeur maximale est 3. Si cette valeur n’est pas fournie, les tentatives de connexion provenant de l’origine attribuée sont utilisées.

**originShield (facultatif)**  
Cela active ou met à jour CloudFront Origin Shield. L'utilisation d'Origin Shield permet de réduire la charge sur votre origine. Pour de plus amples informations, veuillez consulter [Utiliser Amazon CloudFront Origin Shield](origin-shield.md). Si cette valeur n’est pas fournie, les paramètres Origin Shield de l’origine attribuée sont utilisés.    
**enabled (obligatoire)**  
Expression booléenne permettant d’activer ou de désactiver Origin Shield. Accepte la valeur `true` ou `false`.  
**region (obligatoire lorsqu’elle est activée)**  
Le Région AWS pour Origin Shield. Spécifiez l' Région AWS dont la latence est la plus faible par rapport à votre origine. Utilisez le code de région et non le nom de la région. Par exemple, utilisez `us-east-2` pour spécifier la région USA Est (Ohio).  
Lorsque vous activez CloudFront Origin Shield, vous devez Région AWS le spécifier. Pour obtenir la liste des Régions AWS disponibles et choisir la région la plus appropriée pour votre origine, consultez [Choisissez la AWS région pour Origin Shield](origin-shield.md#choose-origin-shield-region).

**originAccessControlConfig (facultatif)**  
L’identifiant unique d’un contrôle d’accès d’origine (OAC) pour cette origine. Ceci n'est utilisé que lorsque l'origine prend en charge un CloudFront OAC, tel qu'Amazon S3, la URLs fonction Lambda et la MediaStore V2. MediaPackage Si cette valeur n’est pas fournie, les paramètres OAC de l’origine attribuée sont utilisés.  
L’identité d’accès d’origine (OAI) héritée n’est pas prise en charge. Pour de plus amples informations, veuillez consulter [Restreindre l'accès à une AWS origine](private-content-restricting-access-to-origin.md).    
**enabled (obligatoire)**  
Expression booléenne permettant d’activer ou de désactiver l’OAC. Accepte la valeur `true` ou `false`.  
**signingBehavior (obligatoire si activé)**  
Spécifie les demandes CloudFront signées (ajoute des informations d'authentification à). Spécifiez `always` pour le cas d'utilisation le plus courant. Pour de plus amples informations, veuillez consulter [Paramètres avancés pour le contrôle d'accès à l'origine](private-content-restricting-access-to-s3.md#oac-advanced-settings-s3).   
Ce champ peut avoir l'une des valeurs suivantes :  
+ `always`— CloudFront signe toutes les demandes d'origine, en remplaçant l'`Authorization`en-tête de la demande du lecteur s'il en existe une.
+ `never`— CloudFront ne signe aucune demande d'origine. Cette valeur désactive le contrôle d’accès d’origine pour l’origine.
+ `no-override`— Si la demande du lecteur ne contient pas l'`Authorization`en-tête, CloudFront signe la demande d'origine. Si la demande du visualiseur contient l'`Authorization`en-tête, CloudFront elle ne signe pas la demande d'origine et transmet à la place l'`Authorization`en-tête de la demande du visualiseur.
**Avertissement**  
Pour transmettre l’en-tête `Authorization` de la demande de l’utilisateur, vous devez l’ajouter à une politique de demande d’origine pour tous les comportements de cache qui utilisent les origines associées à ce contrôle d’accès d’origine. Pour de plus amples informations, veuillez consulter [Contrôle des demandes d’origine à l’aide d’une stratégie](controlling-origin-requests.md).  
**signingProtocol (obligatoire si activé)**  
Protocole de signature de l'OAC, qui détermine la manière dont les demandes sont CloudFront signées (authentifiées). La seule valeur valide est `sigv4`.  
**originType (obligatoire si activé)**  
Le type d’origine de cet OAC. Les valeurs valides sont les suivantes : `s3`, `mediapackagev2`, `mediastore` et `lambda`. 

**timeouts (facultatif)**  
Les délais d'expiration que vous pouvez spécifier CloudFront doivent tenter d'attendre que les origines répondent ou envoient des données. Si cette valeur n’est pas fournie, les paramètres de délai d’attente de l’origine attribuée sont utilisés.   
Sauf indication contraire, ces délais prennent en charge les origines personnalisées et Amazon S3.   
**readTimeout (facultatif)**  
`readTimeout` s’applique aux deux valeurs suivantes :  
+ Durée (en secondes) d' CloudFront attente d'une réponse après avoir transmis une demande à l'origine.
+ Durée (en secondes) d' CloudFront attente après réception d'un paquet de réponse de l'origine et avant de recevoir le paquet suivant. 
Le délai minimum est de 1 seconde et le délai maximum est de 120 secondes. Pour de plus amples informations, veuillez consulter [Délai de réponse](DownloadDistValuesOrigin.md#DownloadDistValuesOriginResponseTimeout).  
**responseCompletionTimeout (facultatif)**  
Durée (en secondes) pendant laquelle une demande provenant CloudFront de l'origine peut rester ouverte et attendre une réponse. Si la réponse complète n'est pas reçue de l'origine à ce moment-là, CloudFront met fin à la connexion.  
La valeur de `responseCompletionTimeout` doit être supérieure ou égale à la valeur de `readTimeout`. Pour de plus amples informations, veuillez consulter [Délai d’exécution de la réponse](DownloadDistValuesOrigin.md#response-completion-timeout).  
**keepAliveTimeout (facultatif)**  
Ce délai s’applique uniquement aux origines personnalisées, et non aux origines Amazon S3. (Les configurations d’origine S3 ignoreront ces paramètres.)   
`keepAliveTimeout`Spécifie la durée pendant CloudFront laquelle vous devez essayer de maintenir la connexion à l'origine après avoir reçu le dernier paquet de la réponse. Le délai minimum est de 1 seconde et le délai maximum est de 120 secondes. Pour de plus amples informations, veuillez consulter [Délai d’attente des connexions actives (origines personnalisées et VPC uniquement)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginKeepaliveTimeout).  
**connectionTimeout (facultatif)**  
Le nombre de secondes d' CloudFront attente lorsque vous essayez d'établir une connexion avec l'origine. Le délai minimum est de 1 seconde et le délai maximum est de 10 secondes. Pour de plus amples informations, veuillez consulter [Délai de connexion](DownloadDistValuesOrigin.md#origin-connection-timeout).

**customOriginConfig (facultatif)**  
Utilisez `customOriginConfig` pour spécifier les paramètres de connexion des origines qui ne sont *pas* un compartiment Amazon S3. Il existe une exception : vous pouvez spécifier ces paramètres si le compartiment S3 est configuré avec un hébergement de site web statique. (Les autres types de configurations de compartiment S3 ignoreront ces paramètres.) Si `customOriginConfig` n’est pas renseigné, les paramètres de l’origine attribuée sont utilisés.    
**port (obligatoire)**  
Port HTTP CloudFront utilisé pour se connecter à l'origine. Spécifiez le port HTTP sur lequel l'origine personnalisée écoute.   
**protocol (obligatoire)**  
Spécifie le protocole (HTTP ou HTTPS) CloudFront utilisé pour se connecter à l'origine. Les valeurs valides sont les suivantes :  
+ `http`— utilise CloudFront toujours le protocole HTTP pour se connecter à l'origine
+ `https`— utilise CloudFront toujours HTTPS pour se connecter à l'origine  
**sslProtocols (obligatoire)**  
Une liste qui indique le SSL/TLS protocole minimal à CloudFront utiliser lors de la connexion à votre point d'origine via HTTPS. Les valeurs valides sont les suivantes : `SSLv3`, `TLSv1`, `TLSv1.1` et `TLSv1.2`. Pour de plus amples informations, veuillez consulter [Minimum de protocole SSL d’origine](DownloadDistValuesOrigin.md#DownloadDistValuesOriginSSLProtocols).  
**ipAddressType (facultatif)**  
Spécifie le type d'adresse IP CloudFront utilisé pour se connecter à l'origine. Les valeurs valides sont `ipv4`, `ipv6` et `dualstack`. La modification de `ipAddressType` n’est prise en charge que lorsque la propriété `domainName` est également modifiée.

**sni (facultatif, pour les origines personnalisées autres que S3)**  
L'indication du nom du serveur (SNI) est une extension du protocole TLS (Transport Layer Security) par laquelle un client indique le nom d'hôte auquel il tente de se connecter au début du processus de prise de contact TLS. Cette valeur doit correspondre à un nom courant figurant sur un certificat TLS sur votre serveur d'origine. Dans le cas contraire, votre serveur d'origine risque de générer une erreur.   
Si ce n'est pas le cas, la valeur du `hostHeader` paramètre est utilisée. Si l'en-tête de l'hôte n'est pas fourni, la valeur du `domainName` paramètre est utilisée.  
Si aucun en-tête d'hôte ou paramètre de nom de domaine n'est fourni, le nom de domaine de l'origine attribuée est utilisé ou l'en-tête de l'hôte de la demande entrante si la politique de transfert vers l'origine (FTO) inclut l'hôte. Le SNI ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. Le SNI peut comporter jusqu'à 253 caractères.

**allowedCertificateNames (facultatif, pour les origines personnalisées autres que S3)**  
Vous pouvez inclure une liste de noms de certificats valides à utiliser pour valider le domaine correspondant CloudFront au certificat TLS de votre serveur d'origine lors de la prise de contact TLS avec votre serveur d'origine. Ce champ attend un tableau de noms de domaine valides et peut inclure des domaines génériques, tels que`*.example.com`.   
Vous pouvez spécifier jusqu'à 20 noms de certificats autorisés. Chaque nom de certificat peut comporter jusqu'à 64 caractères.

**Example – mise à jour de l’origine de la demande Amazon S3**  
L’exemple suivant modifie l’origine de la demande de l’utilisateur pour la remplacer par un compartiment S3, active l’OAC et réinitialise les en-têtes personnalisés envoyés à l’origine.  

```
cf.updateRequestOrigin({
    "domainName" : "amzn-s3-demo-bucket-in-us-east-1.s3.us-east-1.amazonaws.com",
    "originAccessControlConfig": {
        "enabled": true,
        "signingBehavior": "always",
        "signingProtocol": "sigv4",
        "originType": "s3"
    },
    // Empty object resets any header configured on the assigned origin
    "customHeaders": {}
});
```

**Example – mise à jour de l’origine de demande Application Load Balancer**  
L’exemple suivant modifie l’origine de la demande de l’utilisateur pour la remplacer par une origine Application Load Balancer et définit un en-tête personnalisé ainsi que des délais d’attente.  

```
cf.updateRequestOrigin({
    "domainName" : "example-1234567890.us-east-1.elb.amazonaws.com",
    "timeouts": {
        "readTimeout": 30,
        "connectionTimeout": 5
    },
    "customHeaders": {
        "x-stage": "production",
        "x-region": "us-east-1"
    }
});
```

**Example – mise à jour vers une origine avec Origin Shield activé**  
Dans l’exemple suivant, Origin Shield est activé sur l’origine de la distribution. Le code de fonction met à jour uniquement le nom de domaine utilisé pour l’origine et omet tous les autres paramètres facultatifs. Dans ce cas, Origin Shield continuera d’être utilisé avec le nom de domaine d’origine modifié, puisque les paramètres Origin Shield n’ont pas été mis à jour.  

```
cf.updateRequestOrigin({
    "domainName" : "www.example.com"
});
```

**Example — Met à jour l'en-tête de l'hôte, le SNI et les noms des certificats autorisés**  
Dans la plupart des cas d'utilisation, vous n'aurez pas besoin d'utiliser ce type de modification pour les demandes envoyées à votre origine. Ces paramètres ne doivent pas être utilisés à moins que vous ne compreniez l'impact de la modification de ces valeurs. 
L'exemple suivant remplace le nom de domaine, l'en-tête de l'hôte, le SNI et les certificats autorisés sur la demande par l'origine.   

```
cf.updateRequestOrigin({ 
    "domainName": "www.example.com", 
    "hostHeader": "test.example.com", 
    "sni": "test.example.net", 
    "allowedCertificateNames": ["*.example.com", "*.example.net"],
});
```

## selectRequestOriginById() méthode
<a name="select-request-origin-id-helper-function"></a>

Utilisez `selectRequestOriginById()` pour mettre à jour une origine existante en sélectionnant une autre origine déjà configurée dans votre distribution. Cette méthode utilise les mêmes paramètres que ceux définis par l’origine mise à jour.

Cette méthode accepte uniquement les origines déjà définies dans la même distribution que celle utilisée lors de l’exécution de la fonction. Les origines sont référencées par l’ID d’origine, qui est le nom d’origine que vous avez défini lors de la configuration de l’origine.

Si une origine VPC est configurée dans votre distribution, vous pouvez utiliser cette méthode pour mettre à jour votre origine vers votre origine VPC. Pour de plus amples informations, veuillez consulter [Restriction de l’accès avec les origines de VPC](private-content-vpc-origins.md).

**Remarques**  
La `selectRequestOriginById()` fonction ne peut pas sélectionner une origine pour laquelle le protocole TLS mutuel (origine) est activé. Toute tentative de sélection d'une origine compatible TLS (origine) mutuelle à l'aide de cette fonction entraînera une erreur de validation.
Si votre cas d'utilisation nécessite une sélection d'origine dynamique avec TLS mutuel (origine), utilisez-le `updateRequestOrigin()` plutôt en vous assurant que toutes les origines cibles utilisent le même certificat client.

**Demande**

```
cf.selectRequestOriginById(origin_id, {origin_overrides})
```

Dans l'exemple précédent, `origin_id` il s'agit d'une chaîne qui pointe vers le nom d'origine d'une origine dans la distribution qui exécute la fonction. Le `origin_overrides ` paramètre peut contenir les éléments suivants :

**HostHeader (facultatif, pour les origines personnalisées autres que S3)**  
L'en-tête de l'hôte à utiliser lorsque vous envoyez la demande à l'origine. Si ce n'est pas le cas, la valeur du `domainName` paramètre est utilisée.   
Si aucun en-tête d'hôte ou paramètre de nom de domaine n'est fourni, le nom de domaine de l'origine attribuée est utilisé ou l'en-tête de l'hôte de la demande entrante si la politique de transfert vers l'origine (FTO) inclut l'hôte. L'en-tête de l'hôte ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. L'en-tête de l'hôte peut comporter jusqu'à 253 caractères.

**sni (facultatif, pour les origines personnalisées autres que S3)**  
L'indication du nom du serveur (SNI) est une extension du protocole TLS (Transport Layer Security) par laquelle un client indique le nom d'hôte auquel il tente de se connecter au début du processus de prise de contact TLS. Cette valeur doit correspondre à un nom courant figurant sur un certificat TLS sur votre serveur d'origine. Dans le cas contraire, votre serveur d'origine risque de générer une erreur.   
Si ce n'est pas le cas, la valeur du `hostHeader` paramètre est utilisée. Si l'en-tête de l'hôte n'est pas fourni, la valeur du `domainName` paramètre est utilisée.   
Si aucun en-tête d'hôte ou paramètre de nom de domaine n'est fourni, le nom de domaine de l'origine attribuée est utilisé ou l'en-tête de l'hôte de la demande entrante si la politique de transfert vers l'origine (FTO) inclut l'hôte. Le SNI ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. Le SNI peut comporter jusqu'à 253 caractères.

**allowedCertificateNames (facultatif, pour les origines personnalisées autres que S3)**  
Vous pouvez inclure une liste de noms de certificats valides à utiliser pour valider le domaine correspondant CloudFront au certificat TLS de votre serveur d'origine lors de la prise de contact TLS avec votre serveur d'origine. Ce champ attend un tableau de noms de domaine valides et peut inclure des domaines génériques, tels que`*.example.com`.   
Vous pouvez spécifier jusqu'à 20 noms de certificats autorisés. Chaque nom de certificat peut comporter jusqu'à 64 caractères.

**Demande**

```
selectRequestOriginById(origin_id)
```

Dans l’exemple précédent, `origin_id` est une chaîne qui fait référence au nom de l’origine dans la distribution où la fonction s’exécute.

**Example – sélection de l’origine de demande Amazon S3**  
L’exemple suivant sélectionne l’origine nommée `amzn-s3-demo-bucket-in-us-east-1` dans la liste des origines associées à la distribution et applique les paramètres de configuration de l’origine `amzn-s3-demo-bucket-in-us-east-1` à la demande.  

```
cf.selectRequestOriginById("amzn-s3-demo-bucket-in-us-east-1");
```

**Example – sélection de l’origine de demande Application Load Balancer**  
L’exemple suivant sélectionne une origine Application Load Balancer nommée `myALB-prod` dans la liste des origines associées à la distribution et applique les paramètres de configuration de l’origine `myALB-prod` à la demande.  

```
cf.selectRequestOriginById("myALB-prod");
```

**Example — Sélectionnez l'origine de la demande Application Load Balancer et remplacez l'en-tête de l'hôte**  
Comme dans l'exemple précédent, l'exemple suivant sélectionne une origine Application Load Balancer nommée `myALB-prod` dans la liste des origines associées à la distribution, et applique les paramètres de configuration de `myALB-prod` à la demande. Toutefois, cet exemple remplace la valeur de l'en-tête de l'hôte en utilisant`origin_overrides`.  

```
cf.overrideRequestOrigin("myALB-prod",{ 
        "hostHeader" : "test.example.com"
});
```

## createRequestOriginMéthode Group ()
<a name="create-request-origin-group-helper-function"></a>

Utilisez `createRequestOriginGroup()` pour définir deux origines à utiliser comme [groupe d’origines](high_availability_origin_failover.md#concept_origin_groups.creating) pour le basculement, dans les scénarios nécessitant une haute disponibilité.

Un groupe d’origine comprend deux origines (une origine principale et une origine secondaire), ainsi qu’un critère de basculement que vous spécifiez. Vous créez un groupe d'origine pour prendre en charge le basculement d'origine. CloudFront Lorsque vous créez ou mettez à jour un groupe d'origine à l'aide de cette méthode, vous pouvez spécifier le groupe d'origine au lieu d'une origine unique. CloudFront basculera de l'origine principale vers l'origine secondaire, en utilisant les critères de basculement.

Si une origine VPC est configurée dans votre distribution, vous pouvez utiliser cette méthode pour créer un groupe d’origines à l’aide de votre origine VPC. Pour de plus amples informations, veuillez consulter [Restriction de l’accès avec les origines de VPC](private-content-vpc-origins.md).

**Remarques**  
La `createRequestOriginGroup()` fonction ne prend pas en charge la création de groupes d'origine incluant des origines compatibles avec le protocole TLS mutuel (origine). Les groupes d'origine ayant des origines TLS mutuelles (origine) ne peuvent pas être créés dynamiquement via CloudFront Functions.
Si vous avez besoin de fonctionnalités de basculement d'origine avec Mutual TLS (origin), configurez les groupes d'origine directement dans vos paramètres de CloudFront distribution plutôt que de les créer dynamiquement dans les fonctions.

### Demande
<a name="create-origin-group-request"></a>

```
createRequestOriginGroup({origin_group_properties})
```

Dans les exemples précédents, `origin_group_properties` peut contenir les éléments suivants :

**originIds (obligatoire)**  
Tableau de `origin_ids`, où chaque `origin_id` est une chaîne qui pointe vers le nom de l’origine dans la distribution exécutant la fonction. Vous devez fournir deux origines dans le tableau. La première origine de la liste est l’origine principale et la seconde sert d’origine secondaire à des fins de basculement. 

**OriginOverrides (facultatif)**  
 Quelques paramètres avancés peuvent être remplacés à l'aide du `{origin_overrides}` paramètre. Les `origin overrides` peuvent contenir les éléments suivants :     
**HostHeader (facultatif, pour les origines personnalisées autres que S3)**  
L'en-tête de l'hôte à utiliser lorsque vous envoyez la demande à l'origine. Si ce n'est pas le cas, la valeur du `domainName` paramètre est utilisée.   
Si aucun en-tête d'hôte ou paramètre de nom de domaine n'est fourni, le nom de domaine de l'origine attribuée est utilisé ou l'en-tête de l'hôte de la demande entrante si la politique de transfert vers l'origine (FTO) inclut l'hôte. L'en-tête de l'hôte ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. L'en-tête de l'hôte peut comporter jusqu'à 253 caractères.  
**sni (facultatif, pour les origines personnalisées autres que S3)**  
L'indication du nom du serveur (SNI) est une extension du protocole TLS (Transport Layer Security) par laquelle un client indique le nom d'hôte auquel il tente de se connecter au début du processus de prise de contact TLS. Cette valeur doit correspondre à un nom courant figurant sur un certificat TLS sur votre serveur d'origine, sinon celui-ci risque de générer une erreur.   
Si ce n'est pas le cas, la valeur du `hostHeader` paramètre est utilisée. Si l'en-tête de l'hôte n'est pas fourni, la valeur du `domainName` paramètre est utilisée.  
Si aucun en-tête d'hôte ou paramètre de nom de domaine n'est fourni, le nom de domaine de l'origine attribuée est utilisé ou l'en-tête de l'hôte de la demande entrante si la politique de transfert vers l'origine (FTO) inclut l'hôte. Le SNI ne peut pas inclure de deux-points (`:`) et ne peut pas être une adresse IP. Le SNI peut comporter jusqu'à 253 caractères.  
**allowedCertificateNames (facultatif, pour les origines personnalisées autres que S3)**  
Vous pouvez inclure une liste de noms de certificats valides à utiliser pour valider le domaine correspondant CloudFront au certificat TLS de votre serveur d'origine lors de la prise de contact TLS avec votre serveur d'origine. Ce champ attend un tableau de noms de domaine valides et peut inclure des domaines génériques, tels que`*.example.com`.   
Vous pouvez spécifier jusqu'à 20 noms de certificats autorisés. Chaque nom de certificat peut comporter jusqu'à 64 caractères.

**selectionCriteria (facultatif)**  
Sélectionnez si vous souhaitez utiliser les critères de basculement d’origine `default` ou appliquer la logique de basculement basée sur le `media-quality-score`. Les valeurs valides sont les suivantes :  
+ `default` utilise les critères de basculement, en fonction des codes d’état spécifiés dans `failoverCriteria`. Si vous ne définissez pas `selectionCriteria` dans la fonction, `default` sera utilisé.
+ `media-quality-score` est utilisé lorsque la fonctionnalité de routage tenant compte de la qualité média est utilisée.

**failoverCriteria (obligatoire)**  
Ensemble de codes d'état qui, lorsqu'ils sont renvoyés par l'origine principale, CloudFront déclenchent le basculement vers l'origine secondaire. Si vous remplacez un groupe d’origines existant, ce tableau remplacera tous les codes d’état de basculement définis dans la configuration d’origine du groupe d’origines.  
Lorsque vous utilisez `media-quality-score``selectionCriteria`, CloudFront tentera d'acheminer les demandes en fonction du niveau de qualité du média. Si l'origine sélectionnée renvoie un code d'erreur défini dans ce tableau, elle CloudFront basculera vers l'autre origine.

**Example – création du groupe d’origines de la demande**  
L'exemple suivant crée un groupe d'origine pour une demande à l'aide de l'origine IDs. Ces origines IDs proviennent de la configuration du groupe d'origine de la distribution utilisée pour exécuter cette fonction.  
Vous pouvez éventuellement utiliser `originOverrides` pour remplacer les configurations du groupe d'origine pour `sni``hostHeader`, et`allowedCertificateNames`.  

```
import cf from 'cloudfront';

function handler(event) {
    cf.createRequestOriginGroup({
        "originIds": [
            {
                "originId": "origin-1",
                "originOverrides": {
                    "hostHeader": "hostHeader.example.com",
                    "sni": "sni.example.com",
                    "allowedCertificateNames": ["cert1.example.com", "cert2.example.com", "cert3.example.com"]
                }
            },
            {
                "originId": "origin-2",
                "originOverrides": {
                    "hostHeader": "hostHeader2.example.com",
                    "sni": "sni2.example.com",
                    "allowedCertificateNames": ["cert4.example.com", "cert5.example.com"]
                }
            }
        ],
        "failoverCriteria": {
            "statusCodes": [500]
        }
    });
    
    event.request.headers['x-hookx'] = { value: 'origin-overrides' };
    return event.request;
}
```

# Méthodes d'assistance pour les propriétés de CloudFront SaaS Manager
<a name="saas-specific-logic-function-code"></a>

Utilisez les fonctions d'assistance suivantes pour CloudFront SaaS Manager afin de récupérer les valeurs de vos distributions multi-locataires dans la fonction que vous créez. Pour utiliser les exemples de cette page, vous devez d'abord créer une CloudFront fonction à l'aide de JavaScript Runtime 2.0. Pour plus d’informations, consultez [JavaScript fonctionnalités d'exécution 2.0 pour CloudFront Functions](functions-javascript-runtime-20.md).

**Topics**
+ [

## Groupes de connexions
](#connection-groups-helper-function)
+ [

## Locataires de distribution
](#distribution-tenants-helper-functions)

## Groupes de connexions
<a name="connection-groups-helper-function"></a>

Le groupe de connexions associé à vos locataires de distribution possède un nom de domaine.

Pour obtenir cette valeur, utilisez le champ `endpoint` du sous-objet `context` de l’objet d’événement. 

**Demande**

```
const value = event.context.endpoint;
```

**Réponse**

La réponse est une `string` contenant le nom de domaine du groupe de connexion, par exemple : d111111abcdef8.cloudfront.net. Le champ `endpoint` n’apparaît que lorsque votre fonction est invoquée pour les distributions multi-locataires avec un groupe de connexions associé. Pour de plus amples informations, veuillez consulter [Objet Contexte](functions-event-structure.md#functions-event-structure-context).

## Locataires de distribution
<a name="distribution-tenants-helper-functions"></a>

CloudFront Functions possède un module qui permet d'accéder à des valeurs spécifiques des locataires de distribution.

Pour utiliser ce module, ajoutez l’instruction suivante à la première ligne de votre code de fonction :

```
import cf from 'cloudfront';
```

Vous pouvez utiliser les exemples suivants uniquement dans la fonction `handler`, soit directement, soit par le biais d’une fonction appelée de manière imbriquée.

### `distributionTenant.id` field
<a name="distribution-tenants-field"></a>

Utilisez ce champ pour obtenir la valeur de l’ID de locataire de distribution.

**Demande**

```
const value = cf.distributionTenant.id;
```

**Réponse**

La réponse est une `string` contenant l’ID du locataire de distribution, par exemple : `dt_1a2b3c4d5e6f7`.

**Gestion des erreurs**

Si votre fonction est invoquée pour une distribution standard, le fait de renseigner le champ `distributionTenant.id` renverra une erreur de type `distributionTenant module is not available`. Pour gérer ce cas d’utilisation, vous pouvez ajouter un bloc `try` et `catch` à votre code.

### Méthode `distributionTenant.parameters.get()`
<a name="distribution-tenant-parameters-get-method"></a>

Utilisez cette méthode pour renvoyer la valeur des paramètres du locataire de distribution que vous avez spécifiés.

```
distributionTenant.parameters.get("key");
```

`key` : le nom du paramètre du locataire de distribution pour lequel vous souhaitez récupérer la valeur.

**Demande**

```
const value = distributionTenant.parameters.get("key");
```

**Réponse**

La réponse est une `string` contenant la valeur du paramètre du locataire de distribution. Par exemple, si le nom de votre clé est `TenantPath`, la valeur de ce paramètre peut être `tenant1`.

**Gestion des erreurs**

Vous pourriez recevoir les erreurs suivantes :
+ Si votre fonction est invoquée pour une distribution standard, la méthode `distributionTenant.parameters.get()` renverra une erreur de type `distributionTenant module is not available`. 
+ L’erreur `DistributionTenantParameterKeyNotFound` est renvoyée lorsque le paramètre de locataire de distribution que vous avez spécifié n’existe pas. 

Pour gérer ces cas d’utilisation, vous pouvez ajouter un bloc `try` et `catch` à votre code.

# Utilisation de async et await
<a name="async-await-syntax"></a>

CloudFront Fonctions fournies par JavaScript Runtime Functions 2.0 `async` et `await` syntaxe permettant de gérer `Promise` les objets. Les promesses représentent des résultats différés accessibles via le mot clé `await` dans les fonctions marquées comme `async`. Diverses nouvelles WebCrypto fonctions utilisent Promises.

Pour plus d’informations sur les objets `Promise`, consultez [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).

**Note**  
Vous devez utiliser JavaScript Runtime 2.0 pour les exemples de code suivants.  
`await` ne peut être utilisé qu’à l’intérieur de fonctions `async`. Les arguments et fermetures `async` ne sont pas pris en charge.

```
async function answer() {
    return 42;
}

// Note: async, await can be used only inside an async function. async arguments and closures are not supported.

async function handler(event) {
    // var answer_value = answer(); // returns Promise, not a 42 value
    let answer_value = await answer(); // resolves Promise, 42
    console.log("Answer"+answer_value);
    event.request.headers['answer'] = { value : ""+answer_value };
    return event.request;
}
```

L'exemple de JavaScript code suivant montre comment afficher les promesses avec la méthode de la `then` chaîne. Vous pouvez utiliser `catch` pour visualiser les erreurs.

**Avertissement**  
L’utilisation de combinateurs de promesses (par exemple : `Promise.all`, `Promise.any`) ainsi que de méthodes de chaînage de promesses (par exemple : `then` et `catch`) peut entraîner une utilisation élevée de la mémoire de la fonction. Si votre fonction dépasse le quota de [mémoire de fonction maximale](cloudfront-limits.md#limits-functions), elle ne pourra pas s’exécuter. Pour éviter cette erreur, nous vous recommandons d’utiliser la syntaxe `await` plutôt que les méthodes `promise`.

```
async function answer() {
    return 42;
}

async function squared_answer() {
   return answer().then(value => value * value)
} 
// Note: async, await can be used only inside an async function. async arguments and closures are not supported.
async function handler(event) {
    // var answer_value = answer(); // returns Promise, not a 42 value
    let answer_value = await squared_answer(); // resolves Promise, 42
    console.log("Answer"+answer_value);
    event.request.headers['answer'] = { value : ""+answer_value };
    return event.request;
}
```

# Support CWT pour Functions CloudFront
<a name="cwt-support-cloudfront-functions"></a>

Cette section fournit des détails sur la prise en charge des jetons Web CBOR (CWT) dans vos CloudFront fonctions, qui permettent une authentification et une autorisation sécurisées basées sur des jetons dans les emplacements périphériques. CloudFront Ce support est fourni sous forme de module, accessible dans votre CloudFront fonction. 

Pour utiliser ce module, créez une CloudFront fonction à l'aide de JavaScript Runtime 2.0 et incluez l'instruction suivante dans la première ligne du code de fonction : 

```
import cf from 'cloudfront';
```

Les méthodes associées à ce module sont accessibles via (où \$1 est un caractère générique représentant les différentes fonctions présentes dans le module) :

```
cf.cwt.*
```

Pour de plus amples informations, veuillez consulter [JavaScript fonctionnalités d'exécution 2.0 pour CloudFront Functions](functions-javascript-runtime-20.md).

Actuellement, le module ne prend en charge que la structure MAC0 avec l'algorithme HS256 (HMAC-SHA256) avec une limite de 1 Ko pour la taille maximale du jeton.

## Structure du jeton
<a name="token-structure"></a>

Cette section couvre la structure des jetons attendue par le module CWT. Le module s'attend à ce que le jeton soit correctement étiqueté et identifiable (par exemple COSE MAC0). De plus, en ce qui concerne la structure du jeton, le module suit les normes établies par [CBOR Object Signing and Encryption (COSE) [RFC 8152](https://datatracker.ietf.org/doc/html/rfc8152)].

```
( // CWT Tag (Tag value: 61) --- optional    
    ( // COSE MAC0 Structure Tag (Tag value: 17) --- required        
        [            
            protectedHeaders,            
            unprotectedHeaders,            
            payload,            
            tag,        
        ]    
    )
)
```

**Example : CWT utilisant la structure COSE MAC0**  

```
61( // CWT tag     
    17( // COSE_MAC0 tag       
        [         
            { // Protected Headers           
                1: 4  // algorithm : HMAC-256-64         
            },         
            { // Unprotected Headers           
                4: h'53796d6d6574726963323536' // kid : Symmetric key id          
            },         
            { // Payload           
                1: "https://iss.example.com", // iss           
                2: "exampleUser", // sub           
                3: "https://aud.example.com", // aud           
                4: 1444064944, // exp           
                5: 1443944944, // nbf           
                6: 1443944944, // iat         
            },         
            h'093101ef6d789200' // tag       
        ]     
    )   
)
```
La balise CWT est facultative lors de la génération de jetons. Cependant, la balise de structure COSE est requise.

## méthode validateToken ()
<a name="validatetoken-method"></a>

La fonction décode et valide un jeton CWT à l'aide de la clé spécifiée. Si la validation est réussie, elle renvoie le jeton CWT décodé. Dans le cas contraire, cela génère une erreur. Veuillez noter que cette fonction ne valide pas l'ensemble de réclamations.

### Demande
<a name="validatetoken-request"></a>

```
cf.cwt.validateToken(token, handlerContext{key})
```Parameters

**jeton (obligatoire)**  
Jeton codé pour validation. Il doit s'agir d'un JavaScript tampon.

**HandlerContext (obligatoire)**  
Un JavaScript objet qui stocke le contexte de l'appel ValidateToken. À l'heure actuelle, seule la propriété clé est prise en charge.

**clé (obligatoire)**  
Clé secrète pour le calcul du résumé du message. Peut être fourni sous forme de chaîne ou de JavaScript tampon.

### Réponse
<a name="validatetoken-response"></a>

Lorsque la `validateToken()` méthode renvoie un jeton validé avec succès, la réponse de la fonction est au format suivant. `CWTObject` Une fois décodées, toutes les clés de réclamation sont représentées sous forme de chaînes.

```
CWTObject {    
    protectedHeaders,    
    unprotectedHeaders,    
    payload
}
```

### Exemple - Valider un jeton avec un enfant envoyé dans le cadre du jeton
<a name="validatetoken-example"></a>

Cet exemple illustre la validation du jeton CWT, où l'enfant est extrait de l'en-tête. L'enfant est ensuite transmis KeyValueStore à CloudFront Functions pour récupérer la clé secrète utilisée pour valider le jeton.

```
import cf from 'cloudfront'

const CwtClaims = {
   iss: 1,
   aud: 3,
   exp: 4
}

async function handler(event) {
    try {
        let request = event.request;
        let encodedToken = request.headers['x-cwt-token'].value;
        let kid = request.headers['x-cwt-kid'].value;
                
        // Retrieve the secret key from the kvs
        let secretKey = await cf.kvs().get(kid);
                 
        // Now you can use the secretKey to decode & validate the token.
        let tokenBuffer = Buffer.from(encodedToken, 'base64url');
                
        let handlerContext = {
           key: secretKey,
        }
                
        try {
            let cwtObj = cf.cwt.validateToken(tokenBuffer, handlerContext);
                        
            // Check if token is expired
            const currentTime = Math.floor(Date.now() / 1000); // Current time in seconds
            if (cwtObj[CwtClaims.exp] && cwtObj[CwtClaims.exp] < currentTime) {
                return {
                    statusCode: 401,
                    statusDescription: 'Token expired'
                };
            }
        } catch (error) {
            return {
               statusCode: 401,
               statusDescription: 'Invalid token'
            };
         }
    } catch (error) {
        return {
            statusCode: 402,
            statusDescription: 'Token processing failed'
        };
     }
    return request;
}
```

## méthode generateToken ()
<a name="generatetoken-method"></a>

Cette fonction génère un nouveau jeton CWT à l'aide de la charge utile et des paramètres contextuels fournis.

### Demande
<a name="generatetoken-request"></a>

```
cf.cwt.generateToken(generatorContext, payload)
```Parameters

**GeneratorContext (obligatoire)**  
Il s'agit d'un JavaScript objet qui est utilisé comme contexte pour générer le jeton et qui contient les paires clé-valeur suivantes :    
**CWTtag (facultatif)**  
Cette valeur est une valeur booléenne qui, si elle `true` indique qu'elle `cwtTag` doit être ajoutée.  
**CoseTag (obligatoire)**  
Spécifie le type de balise COSE. Actuellement, seuls les supports`MAC0`.  
**clé (obligatoire)**  
Clé secrète pour calculer le résumé du message. Cette valeur peut être une chaîne ou JavaScript `Buffer`.

**charge utile (obligatoire)**  
Charge utile du jeton pour l'encodage. La charge utile doit être `CWTObject` formatée.

### Réponse
<a name="generatetoken-response"></a>

Renvoie un JavaScript Buffer contenant le jeton codé.

**Example : Génère un jeton CWT**  

```
import cf from 'cloudfront';

const CwtClaims = {
    iss: 1,
    sub: 2,
    exp: 4
};

const CatClaims = {
    catu: 401,
    catnip: 402,
    catm: 403,
    catr: 404
};

const Catu = {
    host: 1,
    path: 2,
    ext: 3
};

const CatuMatchTypes = {
    prefix_match: 1,
    suffix_match: 2,
    exact_match: 3
};

const Catr = {
    renewal_method: 1,
    next_renewal_time: 2,
    max_uses: 3
};

async function handler(event) {
    try {
        const response = {
            statusCode: 200,
            statusDescription: 'OK',
            headers: {}
        };
        
        const commonAccessToken = {
            protected: {
                1: "5",
            },
            unprotected: {},
            payload: {
                [CwtClaims.iss]: "cloudfront-documentation",
                [CwtClaims.sub]: "cwt-support-on-cloudfront-functions",
                [CwtClaims.exp]: 1740000000,
                [CatClaims.catu]: {
                    [Catu.host]: {
                        [CatuMatchTypes.suffix_match]: ".cloudfront.net"
                    },
                    [Catu.path]: {
                        [CatuMatchTypes.prefix_match]: "/media/live-stream/cf-4k/"
                    },
                    [Catu.ext]: {
                        [CatuMatchTypes.exact_match]: [
                            ".m3u8",
                            ".ts",
                            ".mpd"
                        ]
                    }
                },
                [CatClaims.catnip]: [
                    "[IP_ADDRESS]",
                    "[IP_ADDRESS]"
                ],
                [CatClaims.catm]: [
                    "GET",
                    "HEAD"
                ],
                [CatClaims.catr]: {
                    [Catr.renewal_method]: "header_renewal",
                    [Catr.next_renewal_time]: 1750000000,
                    [Catr.max_uses]: 5
                }
            }
        };
        
        if (!request.headers['x-cwt-kid']) {
            throw new Error('Missing x-cwt-kid header');
        }
        
        const kid = request.headers['x-cwt-kid'].value;
        const secretKey = await cf.kvs().get(kid);
        
        if (!secretKey) {
            throw new Error('Secret key not found for provided kid');
        }
        
        try {
            const genContext = {
                cwtTag: true,
                coseTag: "MAC0",
                key: secretKey
            };
            
            const tokenBuffer = cf.cwt.generateToken(commonAccessToken, genContext);
            response.headers['x-generated-cwt-token'] = { value: tokenBuffer.toString('base64url') };
                        
            return response;
        } catch (tokenError) {
            return {
                statusCode: 401,
                statusDescription: 'Could not generate the token'
            };
        }
    } catch (error) {
        return {
            statusCode: 402,
            statusDescription: 'Token processing failed'
        };
    }
}
```

**Example : Actualiser le jeton en fonction d'une certaine logique**  

```
import cf from 'cloudfront'

const CwtClaims = {
   iss: 1,
   aud: 3,
   exp: 4
}

async function handler(event) {
    try {
        let request = event.request;
        let encodedToken = request.headers['x-cwt-token'].value;
        let kid = request.headers['x-cwt-kid'].value;
        let secretKey = await cf.kvs().get(kid); // Retrieve the secret key from the kvs
                
        // Now you can use the secretKey to decode & validate the token.
        let tokenBuffer = Buffer.from(encodedToken, 'base64url');
                
        let handlerContext = {
           key: secretKey,
        }
                
        try {
            let cwtJSON = cf.cwt.validateToken(tokenBuffer, handlerContext);
                        
            // Check if token is expired
            const currentTime = Math.floor(Date.now() / 1000); // Current time in seconds
            if (cwtJSON[CwtClaims.exp] && cwtJSON[CwtClaims.exp] < currentTime) {
                // We can regnerate the token and add 8 hours to the expiry time
                cwtJSON[CwtClaims.exp] = Math.floor(Date.now() / 1000) + (8 * 60 * 60);
                                
                let genContext = {
                  coseTag: "MAC0",
                  key: secretKey
                }
                                
                let newTokenBuffer = cf.cwt.generateToken(cwtJSON, genContext);
                 request.headers['x-cwt-regenerated-token'] = newTokenBuffer.toString('base64url');
            }
        } catch (error) {
            return {
               statusCode: 401,
               statusDescription: 'Invalid token'
            };
         }
    }
    catch (error) {
        return {
            statusCode: 402,
            statusDescription: 'Token processing failed'
        };
     }
    return request;
}
```

# Méthodes d'assistance générales
<a name="general-helper-methods"></a>

Cette page fournit des méthodes d'assistance supplémentaires dans CloudFront Functions. Pour utiliser ces méthodes, créez une CloudFront fonction à l'aide de JavaScript Runtime 2.0.

```
import cf from 'cloudfront';
```

Pour de plus amples informations, veuillez consulter [JavaScript fonctionnalités d'exécution 2.0 pour CloudFront Functions](functions-javascript-runtime-20.md).

## `edgeLocation`métadonnées
<a name="edge-location-metadata"></a>

Cette méthode nécessite l'utilisation du `cloudfront` module.

**Note**  
Vous ne pouvez utiliser cette méthode que pour les fonctions de demande de consultation. Pour les fonctions de réponse du spectateur, cette méthode est vide.

Utilisez cet JavaScript objet pour obtenir le code de l'aéroport de localisation périphérique, la région de [cache périphérique régionale](HowCloudFrontWorks.md#CloudFrontRegionaledgecaches) attendue ou l'adresse IP CloudFront du serveur utilisée pour traiter la demande. Ces métadonnées ne sont disponibles que lors du déclencheur de l'événement de demande du spectateur.

```
cf.edgeLocation = {
    name: SEA
    serverIp: 1.2.3.4
    region: us-west-2
}
```

L'`cf.edgeLocation`objet peut contenir les éléments suivants :

**name**  
Le [code IATA](https://en.wikipedia.org/wiki/IATA_airport_code) à trois lettres de l'emplacement périphérique qui a traité la demande.

**IP du serveur**  
 IPv6 Adresse IPv4 ou du serveur qui a traité la demande.

**region**  
Le cache périphérique CloudFront régional (REC) que la demande est *censée* utiliser en cas d'échec du cache. Cette valeur n'est pas mise à jour si le REC attendu n'est pas disponible et qu'un REC de sauvegarde est utilisé pour la demande. Cela n'inclut pas l'emplacement d'Origin Shield utilisé, sauf dans les cas où le REC principal et l'Origin Shield se trouvent au même endroit.

**Note**  
CloudFront Les fonctions ne sont pas invoquées une seconde fois lorsqu'elles CloudFront sont configurées pour utiliser le basculement d'origine. Pour de plus amples informations, veuillez consulter [Optimisez la haute disponibilité grâce au basculement CloudFront d'origine](high_availability_origin_failover.md).

## Méthode `rawQueryString()`
<a name="raw-query-string-method"></a>

Cette méthode ne nécessite pas le `cloudFront` module.

Utilisez `rawQueryString()` cette méthode pour récupérer la chaîne de requête non analysée et non modifiée sous forme de chaîne.

**Demande**

```
function handler(event) {
    var request = event.request;
    const qs = request.rawQueryString();
}
```

**Réponse**

Renvoie la chaîne de requête complète de la demande entrante sous forme de valeur de chaîne sans le début`?`. 
+ S'il n'y a pas de chaîne de requête, mais `?` que celle-ci est présente, les fonctions renvoient une chaîne vide. 
+ S'il n'y a pas de chaîne de requête et si elle `?` n'est pas présente, la fonction revient`undefined`.

**Cas 1 : chaîne de requête complète renvoyée (sans début`?`)**  
URL de la demande entrante : `https://example.com/page?name=John&age=25&city=Boston`  
`rawQueryString()`renvoie : `"name=John&age=25&city=Boston"`

**Cas 2 : chaîne vide renvoyée (lorsqu'elle `?` est présente mais sans paramètres)**  
URL de la demande entrante : `https://example.com/page?`  
`rawQueryString()`renvoie : `""`

**Cas 3 : `undefined` renvoyé (aucune chaîne de requête et non`?`)**  
URL de la demande entrante : `https://example.com/page`  
`rawQueryString()`renvoie : `undefined`

# Création de fonctions
<a name="create-function"></a>

La création d’une fonction se déroule en deux temps : 

1. Création du code de fonction en JavaScript. Vous pouvez utiliser l’exemple par défaut de la console CloudFront ou écrire le vôtre. Pour plus d’informations, consultez les rubriques suivantes :
   + [Écriture du code de la fonction](writing-function-code.md)
   + [CloudFront Fonctions et structure des événements](functions-event-structure.md)
   + [CloudFront Exemples de fonctions pour CloudFront](service_code_examples_cloudfront_functions_examples.md)

1. Utilisation de CloudFront pour créer la fonction et inclure votre code. Le code existe à l’intérieur de la fonction (et non en tant que référence).

------
#### [ Console ]

**Pour créer une fonction**

1. Connectez-vous à la console CloudFront à l’adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

1. Sélectionnez **Créer une fonction**.

1. Entrez un nom de fonction unique au sein du Compte AWS, puis choisissez la version de JavaScript et choisissez **Continuer**. La page de détails s’affiche pour la nouvelle fonction.
**Note**  
Si vous souhaitez utiliser des [paires clé-valeur](kvs-with-functions.md) dans la fonction, vous devez choisir l’environnement d’exécution JavaScript 2.0.

1. Dans la section **Code de fonction**, sélectionnez l’onglet **Création** et entrez votre code de fonction. L’exemple de code inclus dans l’onglet **Création** illustre la syntaxe de base du code de fonction.

1. Sélectionnez **Enregistrer les modifications**.

1. Si le code de fonction utilise des paires clé-valeur, vous devez associer un magasin de clés-valeurs. 

   Vous pouvez associer le magasin de clés-valeurs lors de la création initiale de la fonction. Ou, vous pouvez l’associer ultérieurement, en [mettant à jour la fonction](update-function.md). 

   Pour associer un magasin de clés-valeurs dès maintenant, procédez comme suit :
   + Accédez à la section **Magasin de clés-valeurs associé**, choisissez **Associer le magasin de clés-valeurs existant**.
   + Sélectionnez le magasin de clés-valeurs qui contient les paires clé-valeur de la fonction, puis choisissez **Associer KeyValueStore**.

   CloudFront associe immédiatement le magasin à la fonction. Vous n’avez pas besoin d’enregistrer la fonction.

------
#### [ CLI ]

Si vous utilisez la CLI, vous commencez généralement par créer le code de fonction dans un fichier, puis vous créez la fonction avec AWS CLI.

**Pour créer une fonction**

1. Créez le code de fonction dans un fichier et stockez-le dans un répertoire auquel votre ordinateur peut se connecter. 

1. Exécutez la commande, comme illustré dans l’exemple. Cet exemple utilise la notation `fileb://` pour transmettre le fichier. Il inclut également des sauts de ligne pour rendre la commande plus lisible. 

   ```
   aws cloudfront create-function \
       --name MaxAge \
       --function-config '{"Comment":"Max Age 2 years","Runtime":"cloudfront-js-2.0","KeyValueStoreAssociations":{"Quantity":1,"Items":[{"KeyValueStoreARN":"arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"}]}}' \
       --function-code fileb://function-max-age-v1.js
   ```
**Remarques**  
`Runtime` : la version de JavaScript. Pour utiliser des [paires clé-valeur](kvs-with-functions.md) dans la fonction, vous devez spécifier la version 2.0.
`KeyValueStoreAssociations` : si votre fonction utilise des paires clé-valeur, vous pouvez associer le magasin de clés-valeurs lors de la création initiale de la fonction. Ou vous pouvez l’associer ultérieurement, en utilisant `update-function`. `Quantity` a toujours pour valeur `1`, car chaque fonction peut être associée uniquement à un seul magasin de clés-valeurs.

   Lorsque la commande s’exécute correctement, vous obtenez une sortie similaire à ce qui suit.

   ```
   ETag: ETVABCEXAMPLE
   FunctionSummary:
     FunctionConfig:
       Comment: Max Age 2 years
       Runtime: cloudfront-js-2.0
       KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
     FunctionMetadata:
       CreatedTime: '2021-04-18T20:38:56.915000+00:00'
       FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge
       LastModifiedTime: '2023-11-19T20:38:56.915000+00:00'
       Stage: DEVELOPMENT
     Name: MaxAge
     Status: UNPUBLISHED
   Location: https://cloudfront.amazonaws.com/2020-05-31/function/arn:aws:cloudfront:::function/MaxAge
   ```

   La plupart des informations proviennent de la demande. Les autres informations sont ajoutées par CloudFront.
**Remarques**  
`ETag` : cette valeur change chaque fois que vous modifiez le magasin de clés-valeurs. Vous utilisez cette valeur et le nom de la fonction pour référencer la fonction à l’avenir. Assurez-vous de toujours utiliser l’`ETag` actuel.
`FunctionARN` : l’ARN de votre fonction CloudFront.
111122223333 : le Compte AWS.
`Stage` : le stade de la fonction (`LIVE` ou `DEVELOPMENT`). 
`Status` : l’état de la fonction (`PUBLISHED` ou `UNPUBLISHED`).

------

Une fois que vous avez créé la fonction, elle est ajoutée à la phase `DEVELOPMENT`. Nous vous recommandons de [tester votre fonction](test-function.md) avant de la [publier](publish-function.md). Une fois que vous avez publié votre fonction, celle-ci passe à la phase `LIVE`.

# Fonctions de test
<a name="test-function"></a>

Avant de déployer la fonction en phase réelle (production), vous pouvez la tester afin de vérifier qu’elle fonctionne comme prévu. Pour tester une fonction, vous devez spécifier un *objet d'événement* qui représente une requête ou une réponse HTTP que votre CloudFront distribution pourrait recevoir en production. 

CloudFront Functions effectue les opérations suivantes :

1. Exécute la fonction, en utilisant l'objet d'événement fourni comme entrée.

1. Renvoie le résultat de la fonction (l'objet d'évènement modifié) ainsi que les journaux de fonction ou les messages d'erreurs et l'*utilisation du calcul* de la fonction. Pour plus d'informations sur l'utilisation du calcul, consultez [Présentation de l’utilisation du calcul](#compute-utilization).

**Note**  
Lorsque vous testez une fonction, elle CloudFront ne valide que par rapport aux erreurs d'exécution de la fonction. CloudFrontne valide pas si la demande sera traitée correctement une fois publiée. Par exemple, si votre fonction supprime un en-tête obligatoire, le test sera validé puisqu’aucune erreur n’est détectée dans le code. Toutefois, si vous publiez la fonction et que vous l'associez à une distribution, elle échouera lorsqu'une demande sera envoyée CloudFront.

**Contents**
+ [

## Configuration de l’objet d’événement
](#test-function-create-event)
+ [

## Tester la fonction
](#test-function-step-test)
+ [

## Présentation de l’utilisation du calcul
](#compute-utilization)

## Configuration de l’objet d’événement
<a name="test-function-create-event"></a>

Avant de tester une fonction, vous devez configurer l’objet d’événement avec lequel la tester. Il existe plusieurs options.

**Option 1 : configurer un objet d’événement sans l’enregistrer**  
Vous pouvez configurer un objet d'événement dans l'éditeur visuel de la CloudFront console sans l'enregistrer.   
Vous pouvez utiliser cet objet d'événement pour tester la fonction depuis la CloudFront console, même si elle n'est pas enregistrée.

**Option 2 : créer un objet d’événement dans l’éditeur visuel**  
Vous pouvez configurer un objet d'événement dans l'éditeur visuel de la CloudFront console sans l'enregistrer. Vous pouvez créer 10 objets d’événement pour chaque fonction afin de pouvoir, par exemple, tester différentes entrées possibles.  
Lorsque vous créez l'objet d'événement de cette manière, vous pouvez l'utiliser pour tester la fonction dans la CloudFront console. Vous ne pouvez pas l'utiliser pour tester la fonction à l'aide d'une AWS API ou d'un SDK. 

**Option 3 : créer un objet d’événement à l’aide d’un éditeur de texte**  
Vous pouvez utiliser un éditeur de texte pour créer un objet d’événement au format JSON. Pour en savoir plus sur la structure d’un objet d’événement, consultez [Structure d’évènements](functions-event-structure.md).   
Vous pouvez utiliser cet objet d’événement pour tester la fonction à l’aide de la CLI. Mais vous ne pouvez pas l'utiliser pour tester la fonction dans la CloudFront console.

**Pour créer un objet d’évènement (option 1 ou 2)**

1. Connectez-vous à la CloudFront console à l'adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

   Choisissez la fonction que vous souhaitez tester.

1. Sur la page de détails de la fonction, choisissez l’onglet **Test**. 

1. Pour **Type d’événement**, choisissez l’une des options suivantes :
   + Choisissez **Demande de l’utilisateur** si la fonction modifie une requête HTTP ou génère une réponse basée sur la demande. La section **Demande** apparaît.
   + Choisissez **Réponse de l’utilisateur**. Les sections **Demande** et **Réponse** apparaissent. 

1. Complétez les champs que vous souhaitez inclure dans l’événement. Vous pouvez choisir **Modifier JSON** pour afficher le code JSON brut.

1. (Facultatif) Pour enregistrer l’événement, choisissez **Enregistrer** et dans le champ **Enregistrer l’événement de test**, entrez un nom, puis sélectionnez **Enregistrer**.

   Vous pouvez également choisir **Modifier le JSON**, copier le JSON brut et l'enregistrer dans votre propre fichier, en dehors de CloudFront. 

**Pour créer un objet d’évènement (option 3)**

Créez l’objet d’événement à l’aide d’un éditeur de texte. Stockez le fichier dans un répertoire auquel votre ordinateur peut se connecter. 

Assurez-vous de suivre les consignes suivantes :
+ Omettez les champs `distributionDomainName`, `distributionId` et `requestId`. 
+ Les noms des en-têtes, des cookies et des chaînes de requête doivent être en minuscule.

Une option permettant de créer un objet d’événement de cette manière consiste à créer un échantillon à l’aide de l’éditeur visuel. Vous pouvez être sûr que l’échantillon est correctement formaté. Vous pouvez ensuite copier le code JSON brut, le coller dans un éditeur de texte et enregistrer le fichier.

Pour plus d’informations sur la structure d’un évènement, consultez [Structure d’évènements](functions-event-structure.md). 

## Tester la fonction
<a name="test-function-step-test"></a>

Vous pouvez tester une fonction dans la CloudFront console ou avec le AWS Command Line Interface (AWS CLI).

------
#### [ Console ]

**Pour tester la fonction**

1. Connectez-vous à la CloudFront console à l'adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

1. Choisissez la fonction que vous souhaitez tester.

1. Choisissez l’onglet **Test**. 

1. Assurez-vous que l’événement correct est affiché. Pour remplacer l’événement actuellement affiché, choisissez un autre événement dans le champ **Sélectionnez un événement de test**.

1. Choisissez **Fonction de test**. La console affiche la sortie de la fonction, y compris les journaux de la fonction et l’utilisation du calcul. 

------
#### [ CLI ]

Vous pouvez tester une fonction à l’aide de la commande **aws cloudfront test-function**. 

**Pour tester la fonction**

1. Ouvrez une fenêtre de ligne de commande.

1. Exécutez la commande suivante depuis le même répertoire que celui qui contient le fichier indiqué.

   Cet exemple utilise la notation `fileb://` pour transmettre le fichier d’objet d’événement. Il inclut également des sauts de ligne pour rendre la commande plus lisible. 

   ```
   aws cloudfront test-function \
       --name MaxAge \
       --if-match ETVABCEXAMPLE \
       --event-object fileb://event-maxage-test01.json \
       --stage DEVELOPMENT
   ```
**Remarques**  
Vous référencez la fonction par son nom et ETag (dans le `if-match` paramètre). Vous référencez l’objet d’événement par son emplacement dans votre système de fichiers.
Il peut s’agir de la phase `DEVELOPMENT` ou `LIVE`.

   Lorsque la commande s’exécute correctement, vous obtenez une sortie similaire à ce qui suit.

   ```
   TestResult:
     ComputeUtilization: '21'
     FunctionErrorMessage: ''
     FunctionExecutionLogs: []
     FunctionOutput: '{"response":{"headers":{"cloudfront-functions":{"value":"generated-by-CloudFront-Functions"},"location":{"value":"https://aws.amazon.com/cloudfront/"}},"statusDescription":"Found","cookies":{},"statusCode":302}}'
     FunctionSummary:
       FunctionConfig:
         Comment: MaxAge function
         Runtime: cloudfront-js-2.0
         KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
       FunctionMetadata:
         CreatedTime: '2021-04-18T20:38:56.915000+00:00'
         FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge
         LastModifiedTime: '2023-17-20T10:38:57.057000+00:00'
         Stage: DEVELOPMENT
       Name: MaxAge
       Status: UNPUBLISHED
   ```

------

**Remarques**  
`FunctionExecutionLogs` contient une liste de lignes de journaux que la fonction a écrites dans les instructions `console.log()` (le cas échéant).
`ComputeUtilization` contient des informations sur l’exécution de votre fonction. Consultez [Présentation de l’utilisation du calcul](#compute-utilization).
`FunctionOutput` contient l'objet d'évènement renvoyé par la fonction. 

## Présentation de l’utilisation du calcul
<a name="compute-utilization"></a>

L'**utilisation du calcul** est la durée d'exécution de la fonction en pourcentage de la durée maximale autorisée. Par exemple, une valeur de 35 signifie que la durée d’exécution de la fonction représente 35 % du temps maximum autorisé.

Si une fonction dépasse continuellement la durée maximale autorisée CloudFront , elle ralentit. La liste suivante explique la probabilité qu'une fonction soit limitée en fonction de la valeur d'utilisation du calcul.

**Valeur d'utilisation du calcul :**
+ **1 – 50** : la fonction est largement inférieure à la durée maximale autorisée et devrait s'exécuter sans aucune limitation.
+ **51 – 70** : la fonction approche de la durée maximale autorisée. Pensez à optimiser le code de fonction.
+ **71 — 100** — La durée maximale autorisée de la fonction est très proche ou supérieure. CloudFront est susceptible de limiter cette fonction si vous l'associez à une distribution.

# Mise à jour de fonctions
<a name="update-function"></a>

Vous pouvez mettre à jour une fonction à tout moment. Les modifications sont apportées uniquement à la version de la fonction qui figure dans la phase `DEVELOPMENT`. Pour copier les mises à jour de la phase `DEVELOPMENT` vers `LIVE`, vous devez [publier la fonction](publish-function.md). 

Vous pouvez mettre à jour le code d'une fonction dans la CloudFront console ou avec le AWS Command Line Interface (AWS CLI).

------
#### [ Console ]

**Pour mettre à jour le code de la fonction**

1. Connectez-vous à la CloudFront console à l'adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

   Sélectionnez la fonction à mettre à jour.

1. Choisissez **Modifier** et apportez les modifications suivantes :
   + Mettez à jour tous les champs de la section **Détails**.
   + Modifiez ou supprimez le magasin de clés-valeurs associé. Pour plus d’informations sur les magasins de clés-valeurs, consultez [Amazon CloudFront KeyValueStore](kvs-with-functions.md).
   + Modifiez le code de la fonction. Choisissez l’onglet **Création**, apportez des modifications, puis sélectionnez **Enregistrer les modifications** pour enregistrer les modifications apportées au code.

------
#### [ CLI ]

**Mettre à jour le code de la fonction.**

1. Ouvrez une fenêtre de ligne de commande.

1. Exécutez la commande suivante.

   Cet exemple utilise la notation `fileb://` pour transmettre le fichier. Il inclut également des sauts de ligne pour rendre la commande plus lisible. 

   ```
   aws cloudfront update-function \
       --name MaxAge \
       --function-config '{"Comment":"Max Age 2 years","Runtime":"cloudfront-js-2.0","KeyValueStoreAssociations":{"Quantity":1,"Items":[{"KeyValueStoreARN":"arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"}]}}' \
       --function-code fileb://function-max-age-v1.js \
       --if-match ETVABCEXAMPLE
   ```
**Remarques**  
Vous pouvez identifier la fonction à la fois par son nom et ETag (dans le `if-match` paramètre). Assurez-vous d'utiliser le courant ETag. Vous pouvez obtenir cette valeur à partir de l'opération [DescribeFunction](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DescribeFunction.html)d'API.
Vous devez inclure l’élément `function-code`, même si vous ne voulez pas le modifier.
Soyez prudent avec l’élément `function-config`. Vous devez transmettre tout ce que vous voulez conserver dans la configuration. En particulier, gérez le magasin de clés-valeurs comme suit :   
Pour conserver l’association de magasin de clés-valeurs existante (le cas échéant), spécifiez le nom du magasin *existant*.
Pour modifier l’association, spécifiez le nom du *nouveau* magasin de clés-valeurs.
Pour supprimer l’association, omettez le paramètre `KeyValueStoreAssociations`. 

   Lorsque la commande s’exécute correctement, vous obtenez une sortie similaire à ce qui suit. 

   ```
   ETag: ETVXYZEXAMPLE
   FunctionSummary:
     FunctionConfig:
       Comment: Max Age 2 years \
       Runtime: cloudfront-js-2.0 \
       KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
     FunctionMetadata: \
       CreatedTime: '2021-04-18T20:38:56.915000+00:00' \
       FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge \
       LastModifiedTime: '2023-12-19T23:41:15.389000+00:00' \
       Stage: DEVELOPMENT \
     Name: MaxAge \
     Status: UNPUBLISHED
   ```

------

La plupart des informations proviennent de la demande. D'autres informations sont ajoutées par CloudFront.

**Remarques**  
`ETag` : cette valeur change chaque fois que vous modifiez le magasin de clés-valeurs.
`FunctionARN`— L'ARN de votre CloudFront fonction.
`Stage` : le stade de la fonction (`LIVE` ou `DEVELOPMENT`). 
`Status` : l’état de la fonction (`PUBLISHED` ou `UNPUBLISHED`).

# Publication de fonctions
<a name="publish-function"></a>

Lorsque vous publiez votre fonction, celle-ci est copiée de l’étape `DEVELOPMENT` vers l’étape `LIVE`.

Si aucun comportement de cache n’est associé à la fonction, sa publication vous permet de l’associer à un comportement de cache. Vous pouvez uniquement associer des comportements de cache à des fonctions qui sont à l'étape `LIVE`.

**Important**  
Nous recommandons de [tester la fonction](test-function.md) avant de la publier.
Une fois la fonction publiée, tous les comportements de cache qui lui sont associés commencent automatiquement à utiliser la nouvelle copie publiée, dès que les distributions ont terminé leur déploiement.

Vous pouvez publier une fonction dans la console CloudFront ou avec AWS CLI.

------
#### [ Console ]

**Pour publier une fonction**

1. Connectez-vous à la console CloudFront à l’adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

1. Sélectionnez la fonction à mettre à jour.

1. Choisissez l’onglet **Publier**, puis sélectionnez **Publier**. Si votre fonction est déjà associée à un ou plusieurs comportements de cache, choisissez **Publier et mettre à jour**.

1. (Facultatif) Pour afficher les distributions associées à la fonction, choisissez **Distributions CloudFront associées** pour développer cette section.

En cas de réussite, une bannière apparaît en haut de la page avec le message : ***Nom de la fonction* publié**. Vous pouvez également choisir l'onglet **Générer**, puis **Live** pour afficher la version live du code de fonction.

------
#### [ CLI ]

**Pour publier une fonction**

1. Ouvrez une fenêtre de ligne de commande.

1. Exécutez la commande suivante **aws cloudfront publish-function**. Dans l’exemple, des sauts de ligne sont fournis pour rendre l’exemple plus lisible.

   ```
   aws cloudfront publish-function \
       --name MaxAge \
       --if-match ETVXYZEXAMPLE
   ```

   Lorsque la commande s’exécute correctement, vous obtenez une sortie similaire à ce qui suit.

   ```
   FunctionSummary:
     FunctionConfig:
       Comment: Max Age 2 years
       Runtime: cloudfront-js-2.0
     FunctionMetadata:
       CreatedTime: '2021-04-18T21:24:21.314000+00:00'
       FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
       LastModifiedTime: '2023-12-19T23:41:15.389000+00:00'
       Stage: LIVE
     Name: MaxAge
     Status: UNASSOCIATED
   ```

------

# Association de fonctions à des distributions
<a name="associate-function"></a>

Pour utiliser une fonction avec une distribution, associez la fonction à un ou plusieurs comportements de cache dans la distribution. Vous pouvez associer une fonction à plusieurs comportements de cache dans plusieurs distributions.

Vous pouvez associer une fonction avec l’un des éléments suivants :
+ Un comportement de cache existant
+ Un nouveau comportement de cache dans une distribution existante
+ Un nouveau comportement de cache dans une nouvelle distribution

Lorsque vous associez une fonction à un comportement de cache, vous devez choisir un *type d'évènement*. Le type d’évènement détermine quand CloudFront exécute la fonction. 

Vous pouvez choisir parmi les types d’événement suivants :
+ **Demande utilisateur** : la fonction s’exécute lorsque CloudFront reçoit une demande provenant d’un utilisateur.
+ **Réponse utilisateur** – la fonction s'exécute avant que CloudFront ne renvoie une réponse à l'utilisateur.

Vous ne pouvez pas utiliser de types d’évènements orientés vers l’origine (*requête d’origine* et *réponse d’origine*) avec Fonctions CloudFront. Vous pouvez utiliser Lambda@Edge à la place. Pour plus d’informations, consultez [CloudFront événements pouvant déclencher une fonction Lambda @Edge](lambda-cloudfront-trigger-events.md). 

**Note**  
Avant d'associer une fonction, vous devez [la publier](publish-function.md) à l'étape `LIVE`.

Vous pouvez associer une fonction à une distribution dans la console CloudFront ou avec l’AWS Command Line Interface (AWS CLI). La procédure suivante montre comment associer une fonction à un comportement de cache existant. 

------
#### [ Console ]

**Pour associer une fonction à un comportement de cache existant**

1. Connectez-vous à la console CloudFront à l’adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

1. Choisissez la fonction que vous souhaitez associer.

1. Sur la page **Fonction**, choisissez l’onglet **Publier**.

1. Choisissez **Fonction Publier**.

1. Choisissez **Ajouter une association**. Dans la boîte de dialogue qui apparaît, choisissez une distribution, un type d’événement et/ou un comportement de cache. 

   Pour le type d’événement, choisissez le moment où vous souhaitez que cette fonction s’exécute :
   + **Demande de l’utilisateur** : exécute la fonction chaque fois que CloudFront reçoit une demande.
   + **Réponse de l’utilisateur** : exécute la fonction chaque fois que CloudFront renvoie une réponse.

1. Pour enregistrer la configuration, choisissez **Ajouter une association**.

CloudFront associe la distribution à la fonction. Attendez quelques minutes pour que la distribution associée termine son déploiement. Vous pouvez choisir **Afficher la distribution** sur la page de détails de la fonction pour vérifier la progression.

------
#### [ CLI ]

**Pour associer une fonction à un comportement de cache existant**

1. Ouvrez une fenêtre de ligne de commande.

1. Saisissez la commande suivante pour enregistrer la configuration de distribution pour la distribution dont vous souhaitez associer le comportement de cache à une fonction. Cette commande enregistre la configuration de distribution dans un fichier nommé `dist-config.yaml`. Pour utiliser cette commande, procédez comme suit :
   + Remplacez *`DistributionID`* par l'ID de la distribution.
   + Exécutez la commande sur une ligne. Dans l’exemple, des sauts de ligne sont fournis pour rendre l’exemple plus lisible.

   ```
   aws cloudfront get-distribution-config \
       --id DistributionID \
       --output yaml > dist-config.yaml
   ```

   Lorsque la commande réussit, AWS CLI ne renvoie aucune sortie.

1. Ouvrez le fichier nommé `dist-config.yaml` que vous avez créé. Apportez les modifications suivantes au fichier.

   1. Renommez le champ `ETag` en `IfMatch`, mais ne modifiez pas la valeur du champ.

   1. Dans le comportement du cache, recherchez l'objet nommé `FunctionAssociations`. Mettez à jour cet objet pour ajouter une association de fonctions. La syntaxe YAML pour une association de fonctions ressemble à l'exemple ci-dessous.
      + L'exemple suivant montre un objet d'évènement de requête utilisateur (déclenchement). Pour utiliser le type d'évènement Réponse utilisateur, remplacez `viewer-request` par `viewer-response`.
      + Remplacez *`arn:aws:cloudfront::111122223333:function/ExampleFunction`* par l'Amazon Resource Name (ARN) de la fonction que vous associez à ce comportement de cache. Pour obtenir l'ARN de la fonction, vous pouvez utiliser la commande **aws cloudfront list-functions**.

      ```
      FunctionAssociations:
        Items:
          - EventType: viewer-request
            FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
        Quantity: 1
      ```

   1. Après avoir effectué ces modifications, enregistrez le fichier.

1. Utilisez la commande suivante pour mettre à jour la distribution, en ajoutant l'association de fonctions. Pour utiliser cette commande, procédez comme suit :
   + Remplacez *`DistributionID`* par l'ID de la distribution.
   + Exécutez la commande sur une ligne. Dans l’exemple, des sauts de ligne sont fournis pour rendre l’exemple plus lisible.

   ```
   aws cloudfront update-distribution \
       --id DistributionID \
       --cli-input-yaml file://dist-config.yaml
   ```

   Lorsque la commande réussit, vous voyez une sortie similaire à la suivante, qui décrit la distribution qui vient d'être mise à jour avec l'association de fonctions. L'exemple de sortie suivant est tronqué pour plus de lisibilité.

   ```
   Distribution:
     ARN: arn:aws:cloudfront::111122223333:distribution/EBEDLT3BGRBBW
     ... truncated ...
     DistributionConfig:
       ... truncated ...
       DefaultCacheBehavior:
         ... truncated ...
         FunctionAssociations:
           Items:
           - EventType: viewer-request
             FunctionARN: arn:aws:cloudfront::111122223333:function/ExampleFunction
           Quantity: 1
         ... truncated ...
     DomainName: d111111abcdef8.cloudfront.net
     Id: EDFDVBD6EXAMPLE
     LastModifiedTime: '2021-04-19T22:39:09.158000+00:00'
     Status: InProgress
   ETag: E2VJGGQEG1JT8S
   ```

------

Le `Status` de la distribution passe à `InProgress` pendant le redéploiement de la distribution. Lorsque la nouvelle configuration de distribution atteint un emplacement périphérique CloudFront, cet emplacement commence à utiliser la fonction associée. Lorsque la distribution est entièrement déployée, l’`Status` repasse à `Deployed`. Cela indique que la fonction CloudFront associée est active dans l’ensemble des emplacements périphériques CloudFront dans le monde. Cela prend généralement quelques minutes.

# Amazon CloudFront KeyValueStore
<a name="kvs-with-functions"></a>

CloudFront KeyValueStore est une banque de données de valeurs clés sécurisée, globale et à faible latence qui permet un accès en lecture depuis [CloudFront Functions](cloudfront-functions.md), permettant ainsi une logique personnalisable avancée aux emplacements CloudFront périphériques. 

Vous pouvez ainsi mettre à jour le code de fonction et les données associées à une fonction indépendamment les unes des autres. CloudFront KeyValueStore Cette séparation simplifie le code des fonctions et facilite la mise à jour des données sans qu’il soit nécessaire de déployer des modifications de code. 

**Note**  
Pour être utilisée CloudFront KeyValueStore, votre CloudFront fonction doit utiliser le [JavaScript runtime 2.0](functions-javascript-runtime-20.md).

La procédure générale d’utilisation des paires clé-valeur est la suivante : 
+ Créez un magasin de clés-valeurs et remplissez-le avec un ensemble de paires clé-valeur. Vous pouvez ajouter vos magasins de clés-valeurs à un compartiment Amazon S3 ou les saisir manuellement.
+ Associez les magasins de valeurs clés à votre CloudFront fonction.
+ Dans votre code de fonction, utilisez le nom de la clé pour extraire la valeur associée à la clé ou pour évaluer si une clé existe. Pour plus d’informations sur l’utilisation de paires clé-valeur dans le code de fonction, ainsi que sur les méthodes d’assistance, consultez [Méthodes d’aide pour les magasins de clés-valeurs](functions-custom-methods.md).

## Cas d’utilisation
<a name="key-value-store-use-cases"></a>

Vous pouvez utiliser des paires clé-valeur pour les exemples suivants :
+ **Réécritures ou redirections d'URL** : la paire clé-valeur peut contenir la réécriture ou la redirection URLs . URLs
+ **Tests A/B et indicateurs de fonctionnalités** : vous pouvez créer une fonction pour effectuer des tests en attribuant un pourcentage de trafic à une version spécifique de votre site web. 
+ **Autorisation d’accès** : vous pouvez implémenter un contrôle d’accès pour autoriser ou refuser les demandes en fonction de critères que vous avez définis et des données stockées dans un magasin de clés-valeurs.

## Formats de valeurs pris en charge
<a name="key-value-store-supported-formats"></a>

Vous pouvez stocker la valeur d’une paire clé-valeur dans l’un des formats suivants :
+ String
+ Chaîne codée en octets
+ JSON 

## Sécurité
<a name="key-value-store-security"></a>

La CloudFront fonction et toutes ses valeurs clés stockent les données sont traitées de manière sécurisée, comme suit :
+ CloudFront chiffre chaque valeur clé stockée au repos et pendant le transit (lors de la lecture ou de l'écriture dans les magasins de valeurs clés) lorsque vous appelez les opérations de l'[CloudFront KeyValueStore](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_Operations_Amazon_CloudFront_KeyValueStore.html)API.
+ Lorsque la fonction est exécutée, CloudFront déchiffre chaque paire clé-valeur en mémoire aux emplacements périphériques. CloudFront 

Pour commencer CloudFront KeyValueStore, consultez les rubriques suivantes. 

**Topics**
+ [

## Cas d’utilisation
](#key-value-store-use-cases)
+ [

## Formats de valeurs pris en charge
](#key-value-store-supported-formats)
+ [

## Sécurité
](#key-value-store-security)
+ [

# Utilisation de magasins de clés-valeurs
](kvs-with-functions-kvs.md)
+ [

# Utilisation de données clé-valeur
](kvs-with-functions-kvp.md)
+ Pour plus d'informations sur la mise en route CloudFront KeyValueStore, consultez le billet de CloudFront KeyValueStore AWS blog « [Présentation d'Amazon](https://aws.amazon.com/blogs/aws/introducing-amazon-cloudfront-keyvaluestore-a-low-latency-datastore-for-cloudfront-functions/) ».

# Utilisation de magasins de clés-valeurs
<a name="kvs-with-functions-kvs"></a>

Vous devez créer un magasin clé-valeur pour contenir les paires clé-valeur que vous souhaitez utiliser dans CloudFront Functions. 

Après avoir créé les magasins de valeurs clés et les paires clé-valeur ajoutées, vous pouvez utiliser les valeurs clés dans votre code de CloudFront fonction. 

Pour commencer, consultez les rubriques suivantes : 

**Topics**
+ [

# Création d’un magasin de clés-valeurs
](kvs-with-functions-create.md)
+ [

# Association d’un magasin de clés-valeurs à une fonction
](kvs-with-functions-associate.md)
+ [

# Mise à jour d’un magasin de clés-valeurs
](kvs-with-functions-edit.md)
+ [

# Obtention d’une référence à un magasin de clés-valeurs
](kvs-with-functions-get-reference.md)
+ [

# Suppression d’un magasin de clés-valeurs
](kvs-with-functions-delete.md)
+ [

# Format de fichier pour les paires clé-valeur
](kvs-with-functions-create-s3-kvp.md)

**Note**  
Le JavaScript runtime 2.0 inclut des méthodes d'assistance pour travailler avec des valeurs clés dans le code de fonction. Pour de plus amples informations, veuillez consulter [Méthodes d’aide pour les magasins de clés-valeurs](functions-custom-methods.md).

# Création d’un magasin de clés-valeurs
<a name="kvs-with-functions-create"></a>



Vous pouvez créer un magasin de clés-valeurs et ses paires clé-valeur en même temps. Vous pouvez également créer un magasin de clés-valeurs vide, puis ajouter des paires clé-valeur ultérieurement. 

**Note**  
Si vous spécifiez votre source de données à partir d’un compartiment Amazon S3, vous devez disposer des autorisations `s3:GetObject` et `s3:GetBucketLocation` pour ce compartiment. Si vous ne disposez pas de ces autorisations, vous ne CloudFront pourrez pas créer correctement votre magasin de valeurs clés.

Décidez si vous souhaitez ajouter des paires clé-valeur en même temps que vous créez le magasin de clés-valeurs. Vous pouvez importer vos paires clé-valeur à l'aide de la CloudFront console, de l' CloudFrontAPI ou. AWS SDKs Toutefois, vous ne pouvez importer votre fichier de paires clé-valeur que lorsque vous créez *initialement* le magasin de clés-valeurs. 

Pour créer un fichier de paires clé-valeur, consultez [Format de fichier pour les paires clé-valeur](kvs-with-functions-create-s3-kvp.md). 

------
#### [ Console ]

**Pour créer un magasin de clés-valeurs**

1. Connectez-vous à la page **Fonctions AWS Management Console et ouvrez-la** dans la CloudFront console à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions).

1. Choisissez l'**KeyValueStores**onglet, puis sélectionnez **Créer KeyValueStore**.

1. Entrez un nom et une description facultative pour le magasin de clés-valeurs. 

1. Complétez **URI S3** : 
   + Si vous disposez d’un fichier de paires clé-valeur, entrez le chemin d’accès au compartiment Amazon S3 où vous avez stocké le fichier. 
   + Laissez ce champ vide si vous prévoyez d’entrer manuellement les paires clé-valeur. 

1. Choisissez **Créer**. Le magasin de clés-valeurs existe désormais.

   La page de détails du nouveau magasin de clés-valeurs apparaît. Les informations figurant sur cette page incluent l’ID et l’ARN du magasin de clés-valeurs. 
   + L'identifiant est une chaîne de caractères aléatoire unique dans votre Compte AWS. 
   + La syntaxe de l’ARN est la suivante :

     *Compte AWS*`:key-value-store/`*the key value stores ID*

1. Examinez la section **Paires clé-valeur**. Si vous avez importé un fichier, cette section présente quelques paires clé-valeur. Vous pouvez effectuer les opérations suivantes :
   + Si vous avez importé un fichier, vous pouvez également ajouter d’autres valeurs manuellement. 
   + Si vous n’avez pas importé de fichier d’un compartiment Amazon S3 et si vous souhaitez ajouter des paires clé-valeur dès maintenant, vous pouvez passer à l’étape suivante.
   + Vous pouvez ignorer cette étape et ajouter les paires clé-valeur ultérieurement. 

1. Pour ajouter les paires dès maintenant :

   1. Choisissez **Ajouter des paires clé-valeur**. 

   1. Choisissez **Ajouter une paire** et entrez un nom et une valeur. Répétez cette étape pour ajouter d’autres paires.

   1. Lorsque vous avez terminé, choisissez **Enregistrer les modifications** pour enregistrer toutes les paires clé-valeur dans le magasin de clés-valeurs. Dans la boîte de dialogue qui s’affiche, cliquez sur **Terminé**.

1. Pour associer le magasin de clés-valeurs à une fonction dès maintenant, complétez la section **Fonctions associées**. Pour plus d’informations, consultez [Création de fonctions](create-function.md) ou [Mise à jour de fonctions](update-function.md). 

   Vous pouvez également associer la fonction ultérieurement, soit depuis la page de détails de ce magasin de clés-valeurs, soit depuis la page de détails de la fonction.

------
#### [ AWS CLI ]

**Pour créer un magasin de clés-valeurs**
+ Exécutez la commande suivante pour créer un magasin de clés-valeurs et importer les paires clé-valeur depuis un compartiment Amazon S3.

  ```
  aws cloudfront create-key-value-store \
      --name=keyvaluestore1 \
      --comment="This is my key value store file" \
      --import-source=SourceType=S3,SourceARN=arn:aws:s3:::amzn-s3-demo-bucket1/kvs-input.json
  ```

  **Réponse**

  ```
  {
      "ETag": "ETVABCEXAMPLE",
      "Location": "https://cloudfront.amazonaws.com/2020-05-31/key-value-store/arn:aws:cloudfront::123456789012:key-value-store/8aa76c93-3198-462c-aaf6-example",
      "KeyValueStore": {
          "Name": "keyvaluestore1",
          "Id": "8aa76c93-3198-462c-aaf6-example",
          "Comment": "This is my key value store file",
          "ARN": "arn:aws:cloudfront::123456789012:key-value-store/8aa76c93-3198-462c-aaf6-example",
          "Status": "PROVISIONING",
          "LastModifiedTime": "2024-08-06T22:19:10.813000+00:00"
      }
  }
  ```

------
#### [ API ]

**Pour créer un magasin de clés-valeurs**

1. Utilisez l'[CloudFrontCreateKeyValueStore](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateKeyValueStore.html)opération. L’opération prend plusieurs paramètres :
   + Un `name` du magasin de clés-valeurs.
   + Un paramètre `comment` qui inclut un commentaire.
   + Un paramètre `import-source` qui vous permet d’importer des paires clé-valeur à partir d’un fichier stocké dans un compartiment Amazon S3. Vous ne pouvez importer à partir d’un fichier qu’au moment de la création initiale du magasin de clés-valeurs. Pour plus d’informations sur la structure, consultez [Format de fichier pour les paires clé-valeur](kvs-with-functions-create-s3-kvp.md).

La réponse de l’opération inclut les informations suivantes :
+ Les valeurs transmises dans la demande, y compris le nom que vous avez attribué.
+ Des données telles que l’heure de création.
+ Un `ETag` (par exemple, `ETVABCEXAMPLE`), l’ARN qui inclut le nom du magasin de clés-valeurs (par exemple, `arn:aws:cloudfront::123456789012:key-value-store/keyvaluestore1`). 

  Vous utiliserez une combinaison de l’`ETag`, de l’ARN et du nom pour travailler avec le magasin de clés-valeurs par programmation.

------

## États des magasins de clés-valeurs
<a name="key-value-store-status"></a>

Lorsque vous créez un magasin de clés-valeurs, le magasin de données peut présenter les valeurs d’état suivantes.


****  

| Value | Description | 
| --- | --- | 
|  **Approvisionnement**  |  Le magasin de valeurs clés a été créé et CloudFront traite la source de données que vous avez spécifiée.  | 
|  **Prêt**  |  Le magasin de valeurs clés a été créé et a traité CloudFront avec succès la source de données que vous avez spécifiée.  | 
|  **Échec de l’importation**  |  CloudFront n'a pas pu traiter la source de données que vous avez spécifiée. Cet état peut apparaître si le format de votre fichier n’est pas valide ou s’il dépasse la limite de taille. Pour de plus amples informations, veuillez consulter [Format de fichier pour les paires clé-valeur](kvs-with-functions-create-s3-kvp.md).  | 

# Association d’un magasin de clés-valeurs à une fonction
<a name="kvs-with-functions-associate"></a>

Après avoir créé votre magasin de clés-valeurs, vous pouvez mettre à jour votre fonction pour l’associer à votre magasin de clés-valeurs. Vous devez établir cette association pour pouvoir utiliser les paires clé-valeur de ce magasin dans cette fonction. Les règles suivantes s’appliquent :
+ Une fonction peut avoir un seul magasin de clés-valeurs
+ Vous pouvez associer le même magasin de clés-valeurs à plusieurs fonctions

------
#### [ Console ]

**Pour associer un magasin de clés-valeurs à une fonction**

1. Connectez-vous à la CloudFront console à l'adresse [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) et sélectionnez la page **Fonctions**.

1. Choisissez le nom de la fonction.

1. Accédez à la KeyValueStore section **Associer** et choisissez **Associer existant KeyValueStore**.

1. **Sélectionnez le magasin clé-valeur qui contient les paires clé-valeur de la fonction, puis choisissez Associer. KeyValueStore**

   CloudFront associe immédiatement le magasin à la fonction. Vous n’avez pas besoin d’enregistrer la fonction.

1. Pour spécifier un autre magasin de valeurs clés, choisissez **Mettre à jour associé KeyValueStore**, sélectionnez un autre nom de magasin de valeurs clés, puis choisissez **Associer KeyValueStore**.

Pour de plus amples informations, veuillez consulter [Mise à jour de fonctions](update-function.md).

------
#### [ AWS CLI ]

**Pour associer un magasin de clés-valeurs à une fonction**
+ Exécutez la commande suivante pour mettre à jour la fonction `MaxAge` et associer une ressource de magasin de clés-valeurs.

  ```
  aws cloudfront update-function \
      --name MaxAge \
      --function-config '{"Comment":"Max Age 2 years","Runtime":"cloudfront-js-2.0","KeyValueStoreAssociations":{"Quantity":1,"Items":[{"KeyValueStoreARN":"arn:aws:cloudfront::123456789012:key-value-store/8aa76c93-3198-462c-aaf6-example"}]}}' \
      --function-code fileb://function-max-age-v1.js \
      --if-match ETVABCEXAMPLE
  ```
+ Pour associer un magasin de clés-valeurs à une fonction, spécifiez le paramètre `KeyValueStoreAssociations` et l’ARN du magasin de clés-valeurs. 
+ Pour modifier l’association, spécifiez un autre ARN de magasin de clés-valeurs. 
+ Pour supprimer l’association, supprimez le paramètre `KeyValueStoreAssociations`. 

Pour de plus amples informations, veuillez consulter [Mise à jour de fonctions](update-function.md).

------
#### [ API ]

**Pour associer un magasin de clés-valeurs à une fonction**
+ Utilisez l’opération d’API [UpdateFunction](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateFunction.html). Pour de plus amples informations, veuillez consulter [Mise à jour de fonctions](update-function.md).

------

**Remarques**  
Si vous modifiez un magasin de clés-valeurs sans modifier les paires clé-valeur, ou si vous ne modifiez que les paires clé-valeur dans le magasin, vous n’avez pas besoin d’associer de nouveau le magasin de clés-valeurs. Vous n’avez pas non plus besoin de republier la fonction.  
Toutefois, nous vous recommandons de tester la fonction afin de vérifier qu’elle fonctionne comme prévu. Pour de plus amples informations, veuillez consulter [Fonctions de test](test-function.md).
Vous pouvez afficher toutes les fonctions qui utilisent des magasins de clés-valeurs spécifiques. Sur la CloudFront console, choisissez la page de détails du magasin de valeurs clés. 

# Mise à jour d’un magasin de clés-valeurs
<a name="kvs-with-functions-edit"></a>

Lorsque vous mettez à jour un magasin de clés-valeurs, vous pouvez modifier les paires clé-valeur ou modifier l’association entre le magasin de clés-valeurs et la fonction.

------
#### [ Console ]

**Pour mettre à jour un magasin de clés-valeurs**

1. Connectez-vous à la page **Fonctions AWS Management Console et ouvrez-la** dans la CloudFront console à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions).

1. Cliquez sur l'onglet **KeyValueStores**.

1.  Sélectionnez le magasin de clés-valeurs que vous souhaitez mettre à jour. 
   + Pour mettre à jour les paires clé-valeur, choisissez **Modifier** dans la section **Paires clé-valeur**. Vous pouvez ajouter ou supprimer n’importe quelle paire clé-valeur. Vous pouvez également modifier la valeur d’une paire clé-valeur existante. Lorsque vous avez terminé, sélectionnez **Enregistrer les modifications**.
   + Pour mettre à jour l’association pour ce magasin de clés-valeurs, choisissez **Accéder aux fonctions**. Pour de plus amples informations, veuillez consulter [Association d’un magasin de clés-valeurs à une fonction](kvs-with-functions-associate.md).

------
#### [ AWS CLI ]

**Pour mettre à jour un magasin de clés-valeurs**

1. **Modifier les paires clé-valeur** : vous pouvez ajouter d’autres paires clé-valeur, supprimer une ou plusieurs paires clé-valeur et modifier la valeur d’une paire clé-valeur existante. Pour de plus amples informations, veuillez consulter [Utilisation de données clé-valeur](kvs-with-functions-kvp.md).

1. **Modifier l’association de la fonction pour le magasin de clés-valeurs** : pour mettre à jour l’association de la fonction pour le magasin de clés-valeurs, consultez [Association d’un magasin de clés-valeurs à une fonction](kvs-with-functions-associate.md). 
**Astuce**  
Vous aurez besoin de l’ARN du magasin de clés-valeurs. Pour de plus amples informations, veuillez consulter [Obtention d’une référence à un magasin de clés-valeurs](kvs-with-functions-get-reference.md).

------
#### [ API ]

**Pour mettre à jour un magasin de clés-valeurs**

1. **Modifier les paires clé-valeur** : vous pouvez ajouter d’autres paires clé-valeur, supprimer une ou plusieurs paires clé-valeur et modifier la valeur d’une paire clé-valeur existante. Pour de plus amples informations, veuillez consulter [Utilisation de données clé-valeur](kvs-with-functions-kvp.md).

1. **Modifier l'association de fonction pour le magasin de valeurs clés** : pour mettre à jour l'association de fonctions pour le magasin de valeurs clés, utilisez l'opération [UpdateFunction](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateFunction.html)API. Pour de plus amples informations, veuillez consulter [Mise à jour de fonctions](update-function.md). 
**Astuce**  
Vous aurez besoin de l’ARN du magasin de clés-valeurs. Pour de plus amples informations, veuillez consulter [Obtention d’une référence à un magasin de clés-valeurs](kvs-with-functions-get-reference.md).

------

# Obtention d’une référence à un magasin de clés-valeurs
<a name="kvs-with-functions-get-reference"></a>

Pour utiliser le magasin de clés-valeurs par programmation, vous avez besoin de l’`ETag` et du nom du magasin de clés-valeurs. 

Pour obtenir les deux valeurs, vous pouvez utiliser le AWS Command Line Interface (AWS CLI) ou l' CloudFront API.

------
#### [ AWS CLI ]

**Pour obtenir la référence à un magasin de clés-valeurs**

1. Pour renvoyer une liste des magasins de clés-valeurs, exécutez la commande suivante. Recherchez ensuite le nom du magasin de clés-valeurs que vous souhaitez modifier.

   ```
   aws cloudfront list-key-value-stores
   ```

1. Dans la réponse, recherchez le nom du magasin de clés-valeurs souhaité.

   **Réponse**

   ```
   {
       "KeyValueStoreList": {
           "Items": [
               {
                   "Name": "keyvaluestore3",
                   "Id": "37435e19-c205-4271-9e5c-example3",
                   "ARN": "arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example3",
                   "Status": "READY",
                   "LastModifiedTime": "2024-05-08T14:50:18.876000+00:00"
               },
               {
                   "Name": "keyvaluestore2",
                   "Id": "47970d59-6408-474d-b850-example2",
                   "ARN": "arn:aws:cloudfront::123456789012:key-value-store/47970d59-6408-474d-b850-example2",
                   "Status": "READY",
                   "LastModifiedTime": "2024-05-30T21:06:22.113000+00:00"
               },
               {
                   "Name": "keyvaluestore1",
                   "Id": "8aa76c93-3198-462c-aaf6-example",
                   "ARN": "arn:aws:cloudfront::123456789012:key-value-store/8aa76c93-3198-462c-aaf6-example",
                   "Status": "READY",
                   "LastModifiedTime": "2024-08-06T22:19:30.510000+00:00"
               }
           ]
       }
   }
   ```

1. Exécutez la commande suivante pour renvoyer l’`ETag` du magasin de clés-valeurs spécifié.

   ```
   aws cloudfront describe-key-value-store \
       --name=keyvaluestore1
   ```

   **Réponse**

   ```
   {
       "ETag": "E3UN6WX5RRO2AG",
       "KeyValueStore": {
           "Name": "keyvaluestore1",
           "Id": "8aa76c93-3198-462c-aaf6-example",
           "Comment": "This is an example KVS",
           "ARN": "arn:aws:cloudfront::123456789012:key-value-store/8aa76c93-3198-462c-aaf6-example",
           "Status": "READY",
           "LastModifiedTime": "2024-08-06T22:19:30.510000+00:00"
       }
   }
   ```

------
#### [ API ]

**Pour obtenir la référence à un magasin de clés-valeurs**

1. Utilisez l’opération d’API [https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListKeyValueStores.html](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListKeyValueStores.html) pour renvoyer une liste de magasins de clés-valeurs. Recherchez le nom du magasin de clés-valeurs que vous souhaitez modifier. 

1. Utilisez l’opération d’API [https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DescribeKeyValueStore.html](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DescribeKeyValueStore.html) et indiquez le nom du magasin de clés-valeurs que vous avez renvoyé à l’étape précédente. 

------

La réponse inclut un UUID, l’ARN du magasin de clés-valeurs et l’`ETag` du magasin de clés-valeurs.
+ Un `ETag`, par exemple `E3UN6WX5RRO2AG`
+ L’UUID est de 128 bits, tel que `8aa76c93-3198-462c-aaf6-example`
+ L'ARN inclut le Compte AWS nombre, la constante `key-value-store` et l'UUID, comme dans l'exemple suivant :

  `arn:aws:cloudfront::123456789012:key-value-store/8aa76c93-3198-462c-aaf6-example`

Pour plus d’informations sur l’opération `DescribeKeyValueStore`, consultez [À propos de CloudFront KeyValueStore](kvs-with-functions-kvp.md#kvs-with-functions-api-describe).

# Suppression d’un magasin de clés-valeurs
<a name="kvs-with-functions-delete"></a>

Vous pouvez supprimer votre boutique de valeurs clés à l'aide de la CloudFront console ou de l'API Amazon.

------
#### [ Console ]

**Pour supprimer un magasin de clés-valeurs**

1. Connectez-vous à la page **Fonctions AWS Management Console et ouvrez-la** dans la CloudFront console à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions).

1. Choisissez le nom de la fonction.

1. Dans la KeyValueStore section **Associé**, vérifiez si un magasin de valeurs clés est associé à la fonction. Si tel est le cas, supprimez l'association en choisissant **Dissocier**, KeyValueStore puis en choisissant **Supprimer l'association**.

1. Dans le volet de navigation, choisissez la page **Fonctions**, puis sélectionnez l'**KeyValueStores**onglet. 

1. Sélectionnez le magasin de clés-valeurs que vous souhaitez supprimer, puis choisissez **Supprimer**.

------
#### [ AWS CLI ]

**Pour supprimer un magasin de clés-valeurs**

1. Obtenez l’`ETag` et le nom du magasin de clés-valeurs. Pour de plus amples informations, veuillez consulter [Obtention d’une référence à un magasin de clés-valeurs](kvs-with-functions-get-reference.md).

1. Vérifiez si le magasin de clés-valeurs est associé à une fonction. S’il l’est, supprimez l’association. Pour plus d’informations sur ces étapes, consultez [Mise à jour de fonctions](update-function.md).

1. Une fois que vous disposez du nom et de l’`ETag` du magasin clé-valeur et qu’il n’est plus associé à une fonction, vous pouvez le supprimer.

   Exécutez la commande suivante pour supprimer le magasin de clés-valeurs spécifié.

   ```
   aws cloudfront delete-key-value-store \
       --name=keyvaluestore1 \
       --if-match=E3UN6WX5RRO2AG
   ```

------
#### [ API ]

**Pour supprimer un magasin de clés-valeurs**

1. Obtenez l’`ETag` et le nom du magasin de clés-valeurs. Pour de plus amples informations, veuillez consulter [Obtention d’une référence à un magasin de clés-valeurs](kvs-with-functions-get-reference.md).

1. Vérifiez si le magasin de clés-valeurs est associé à une fonction. S’il l’est, supprimez l’association. Pour plus d’informations sur ces étapes, consultez [Mise à jour de fonctions](update-function.md).

1. Pour supprimer le magasin de valeurs clés, utilisez l'opération CloudFront [https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DeleteKeyValueStore.html](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DeleteKeyValueStore.html)API.

------

# Format de fichier pour les paires clé-valeur
<a name="kvs-with-functions-create-s3-kvp"></a>

Lorsque vous créez un fichier codé en UTF-8, utilisez le format JSON suivant :

```
{
  "data":[
    {
      "key":"key1",
      "value":"value"
    },
    {
      "key":"key2",
      "value":"value"
    }
  ]
}
```

Votre fichier ne peut pas inclure de clés en double. Si vous avez indiqué un fichier invalide dans votre compartiment Amazon S3, vous pouvez mettre le fichier à jour pour supprimer les doublons, puis réessayer de créer votre magasin de clés-valeurs.

Pour de plus amples informations, veuillez consulter [Création d’un magasin de clés-valeurs](kvs-with-functions-create.md).

**Note**  
Le fichier de votre source de données et ses paires clé-valeur présentent les limites suivantes :  
Taille du fichier : 5 Mo
Taille de la clé : 512 caractères
Taille de la valeur : 1024 caractères

# Utilisation de données clé-valeur
<a name="kvs-with-functions-kvp"></a>

Cette rubrique décrit comment ajouter des paires clé-valeur à un magasin de clés-valeurs existant. Pour inclure des paires clé-valeur lorsque vous créez initialement le magasin de clés-valeurs, consultez [Création d’un magasin de clés-valeurs](kvs-with-functions-create.md).

**Topics**
+ [

## Utilisation de paires clé-valeur (console)
](#kvs-with-functions-kvp-using-console)
+ [

## À propos de CloudFront KeyValueStore
](#kvs-with-functions-api-describe)
+ [

## Utilisation des paires clé-valeur (AWS CLI)
](#work-with-kvs-cli-keys)
+ [

## Utilisation des paires clé-valeur (API)
](#kvs-with-functions-kvp-using-api)

## Utilisation de paires clé-valeur (console)
<a name="kvs-with-functions-kvp-using-console"></a>

Vous pouvez utiliser la CloudFront console pour travailler avec vos paires clé-valeur.

**Pour utiliser les paires clé-valeur**

1. Connectez-vous à la page **Fonctions AWS Management Console et ouvrez-la** dans la CloudFront console à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions).

1. Cliquez sur l'onglet **KeyValueStores**. 

1. Sélectionnez le magasin de clés-valeurs que vous souhaitez modifier.

1. Dans la section **Paires clé-valeur**, choisissez **Modifier**. 

1. Vous pouvez ajouter une paire clé-valeur, supprimer une paire clé-valeur ou modifier la valeur d’une paire clé-valeur existante. 

1. Lorsque vous avez terminé, sélectionnez **Enregistrer les modifications**.

## À propos de CloudFront KeyValueStore
<a name="kvs-with-functions-api-describe"></a>

**Astuce**  
L' CloudFront KeyValueStore API est un service mondial qui utilise Signature Version 4A (SigV4A) pour l'authentification. L’utilisation d’informations d’identification temporaires avec SigV4A nécessite des jetons de session de version 2. Pour de plus amples informations, veuillez consulter [Utilisation d'informations d'identification temporaires avec l' CloudFront KeyValueStore API](cloudfront-function-restrictions.md#regional-endpoint-for-key-value-store).

Si vous utilisez le AWS Command Line Interface (AWS CLI) ou votre propre code pour appeler l' CloudFront KeyValueStore API, consultez les sections suivantes. 

Lorsque vous utilisez un magasin de clés-valeurs et ses paires clé-valeur, le service que vous appelez dépend de votre cas d’utilisation :
+ Pour utiliser des paires clé-valeur dans un magasin clé-valeur *existant*, utilisez le CloudFront KeyValueStore service. 
+ Pour inclure des paires clé-valeur dans le magasin clé-valeur lorsque vous créez *initialement* le magasin clé-valeur, utilisez le CloudFront service.

L' CloudFront API et l' CloudFront KeyValueStore API fonctionnent toutes deux. `DescribeKeyValueStore` Vous les appelez pour différentes raisons. Pour comprendre les différences, consultez le tableau suivant.


|  | API CloudFront DescribeKeyValueStore | API CloudFront KeyValueStore DescribeKeyValueStore | 
| --- | --- | --- | 
| Données relatives au magasin de clés-valeurs |  Renvoie des données, telles que l’état et la date à laquelle le magasin de clés-valeurs lui-même a été modifié pour la dernière fois.  |  Renvoie les données relatives au *contenu* de la ressource de stockage : les paires clé-valeur figurant dans le magasin et la taille du contenu.  | 
| Données qui identifient le magasin de clés-valeurs |  Renvoie un `ETag`, l’UUID et l’ARN du magasin de clés-valeurs.  |  Renvoie un `ETag` et l’ARN du magasin de clés-valeurs.  | 

**Remarques**  
Chaque opération DescribeKeyValueStore renvoie un `ETag` *différent*. Les `ETags` ne sont pas interchangeables.
Lorsque vous appelez une opération d’API pour effectuer une action, vous devez spécifier l’`ETag` provenant de l’API appropriée. Par exemple, dans l' CloudFront KeyValueStore[ DeleteKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_DeleteKey.html)opération, vous spécifiez `ETag` ce que vous avez renvoyé après l' CloudFront KeyValueStore [https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_DescribeKeyValueStore.html](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_DescribeKeyValueStore.html)opération.
Lorsque vous appelez vos CloudFront fonctions en utilisant CloudFront KeyValueStore, les valeurs du magasin de valeurs clés ne sont ni mises à jour ni modifiées lors de l'appel de la fonction. Les mises à jour sont traitées entre deux invocations d’une fonction.

## Utilisation des paires clé-valeur (AWS CLI)
<a name="work-with-kvs-cli-keys"></a>

Vous pouvez exécuter les AWS Command Line Interface commandes suivantes pour CloudFront KeyValueStore.

**Contents**
+ [

### Liste des paires clé-valeur
](#kvs-cli-list-keys)
+ [

### Obtention des paires clé-valeur
](#kvs-cli-get-keys)
+ [

### Description d’un magasin de clés-valeurs
](#kvs-cli-describe-keys)
+ [

### Création d’une paire clé-valeur
](#kvs-cli-create-keys)
+ [

### Suppression d’une paire clé-valeur
](#kvs-cli-delete-keys)
+ [

### Mise à jour d’une paire clé-valeur
](#kvs-cli-update-key)

### Liste des paires clé-valeur
<a name="kvs-cli-list-keys"></a>

Pour répertorier les paires clé-valeur dans votre magasin de clés-valeurs, exécutez la commande suivante.

```
aws cloudfront-keyvaluestore list-keys \
    --kvs-arn=arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example
```

**Réponse**

```
{
    "Items": [
        {
            "Key": "key1",
            "Value": "value1"
        }
    ]
}
```

### Obtention des paires clé-valeur
<a name="kvs-cli-get-keys"></a>

Pour obtenir les paires clé-valeur dans votre magasin de clés-valeurs, exécutez la commande suivante.

```
aws cloudfront-keyvaluestore get-key \
    --key=key1 \
    --kvs-arn=arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example
```

**Réponse**

```
{
    "Key": "key1",
    "Value": "value1",
    "ItemCount": 1,
    "TotalSizeInBytes": 11
}
```

### Description d’un magasin de clés-valeurs
<a name="kvs-cli-describe-keys"></a>

Pour décrire un magasin de clés-valeurs, exécutez la commande suivante.

```
aws cloudfront-keyvaluestore describe-key-value-store \
    --kvs-arn=arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example
```

**Réponse**

```
{
    "ETag": "KV1F83G8C2ARO7P",
    "ItemCount": 1,
    "TotalSizeInBytes": 11,
    "KvsARN": "arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example",
    "Created": "2024-05-08T07:48:45.381000-07:00",
    "LastModified": "2024-08-05T13:50:58.843000-07:00",
    "Status": "READY"
}
```

### Création d’une paire clé-valeur
<a name="kvs-cli-create-keys"></a>

Pour créer une paire clé-valeur dans votre magasin de clés-valeurs, exécutez la commande suivante.

```
aws cloudfront-keyvaluestore put-key \
    --if-match=KV1PA6795UKMFR9 \
    --key=key2 \
    --value=value2 \
    --kvs-arn=arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example
```

**Réponse**

```
{
    "ETag": "KV13V1IB3VIYZZH",
    "ItemCount": 3,
    "TotalSizeInBytes": 31
}
```

### Suppression d’une paire clé-valeur
<a name="kvs-cli-delete-keys"></a>

Pour supprimer une paire clé-valeur, exécutez la commande suivante.

```
aws cloudfront-keyvaluestore delete-key \
    --if-match=KV13V1IB3VIYZZH \
    --key=key1 \
    --kvs-arn=arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example
```

**Sortie**

```
{
    "ETag": "KV1VC38T7YXB528",
    "ItemCount": 2,
    "TotalSizeInBytes": 22
}
```

### Mise à jour d’une paire clé-valeur
<a name="kvs-cli-update-key"></a>

Vous pouvez utiliser la commande `update-keys` pour mettre à jour plusieurs paires clé-valeur. Par exemple, pour supprimer une paire clé-valeur existante et en créer une autre, exécutez la commande suivante.

```
aws cloudfront-keyvaluestore update-keys \
    --if-match=KV2EUQ1WTGCTBG2 \
    --kvs-arn=arn:aws:cloudfront::123456789012:key-value-store/37435e19-c205-4271-9e5c-example \
    --deletes '[{"Key":"key2"}]' \
    --puts '[{"Key":"key3","Value":"value3"}]'
```

**Réponse**

```
{
    "ETag": "KV3AEGXETSR30VB",
    "ItemCount": 3,
    "TotalSizeInBytes": 28
}
```

## Utilisation des paires clé-valeur (API)
<a name="kvs-with-functions-kvp-using-api"></a>

Suivez cette section pour utiliser vos paires clé-valeur par programmation. 

**Contents**
+ [

### Obtention d’une référence à un magasin de clés-valeurs
](#kvs-with-functions-api-ref)
+ [

### Modification de paires clé-valeur dans un magasin de clés-valeurs
](#kvs-with-functions-api-actions)
+ [

### Exemple de code pour CloudFront KeyValueStore
](#example-code-key-value-store)

### Obtention d’une référence à un magasin de clés-valeurs
<a name="kvs-with-functions-api-ref"></a>

Lorsque vous utilisez l' CloudFront KeyValueStore API pour appeler une opération d'écriture, vous devez spécifier l'ARN et le `ETag` du magasin de valeurs clés. Pour obtenir ces données, procédez comme suit :

**Pour obtenir une référence à un magasin de clés-valeurs**

1. Utilisez l’opération d’API [https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListKeyValueStores.html](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListKeyValueStores.html) pour obtenir une liste de magasins de clés-valeurs. Recherchez le magasin de clés-valeurs que vous souhaitez modifier. 

1. Utilisez l’[opération d’API CloudFrontKeyValueStore DescribeKeyValueStore](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_DescribeKeyValueStore.html) et indiquez le magasin de clés-valeurs identifié à l’étape précédente.

   La réponse inclut l’ARN et l’`ETag` du magasin de clés-valeurs. 
   + L'ARN inclut le Compte AWS nombre, la constante `key-value-store` et l'UUID, comme dans l'exemple suivant :

     `arn:aws:cloudfront::123456789012:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`
   + Un `ETag` ressemble à l’exemple suivant : 

     `ETVABCEXAMPLE2`

### Modification de paires clé-valeur dans un magasin de clés-valeurs
<a name="kvs-with-functions-api-actions"></a>

Vous pouvez spécifier le magasin de clés-valeurs qui contient la paire clé-valeur que vous souhaitez mettre à jour. 

Consultez les opérations CloudFront KeyValueStore d'API suivantes :
+ [CloudFrontKeyValueStore DeleteKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_DeleteKey.html)— Supprime une paire clé-valeur
+ [CloudFrontKeyValueStore GetKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_GetKey.html)— Renvoie une paire clé-valeur
+ [CloudFrontKeyValueStore ListKeys](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_ListKeys.html)— Renvoie une liste de paires clé-valeur 
+ [CloudFrontKeyValueStore PutKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_PutKey.html)— Vous pouvez effectuer les tâches suivantes :
  + Créer une paire clé-valeur dans un magasin de clés-valeurs en indiquant un nouveau nom de clé et une valeur.
  + Définir une valeur différente dans une paire clé-valeur existante en spécifiant un nom de clé existant et une nouvelle valeur.
+ [CloudFrontKeyValueStore UpdateKeys](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_kvs_UpdateKeys.html)— Vous pouvez effectuer une ou plusieurs des actions suivantes en une seule all-or-nothing opération :
  + Supprimer une ou plusieurs paires clé-valeur
  + Créer une ou plusieurs nouvelles paires clé-valeur
  + Définir une valeur différente dans une ou plusieurs paires clé-valeur existantes

### Exemple de code pour CloudFront KeyValueStore
<a name="example-code-key-value-store"></a>

**Example**  
Le code suivant vous montre comment appeler l’opération d’API `DescribeKeyValueStore` pour un magasin de clés-valeurs.  

```
const {
  CloudFrontKeyValueStoreClient,
  DescribeKeyValueStoreCommand,
} = require("@aws-sdk/client-cloudfront-keyvaluestore");

require("@aws-sdk/signature-v4-crt");

(async () => {
  try {
    const client = new CloudFrontKeyValueStoreClient({
      region: "us-east-1"
    });
    const input = {
      KvsARN: "arn:aws:cloudfront::123456789012:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    };
    const command = new DescribeKeyValueStoreCommand(input);

    const response = await client.send(command);
  } catch (e) {
    console.log(e);
  }
})();
```