

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.

# Didacticiels sur les API REST Amazon API Gateway
<a name="api-gateway-rest-tutorials"></a>

Les didacticiels suivants proposent des exercices pratiques destinés à vous aider à découvrir API Gateway REST APIs.

**Topics**
+ [

# Choisissez un didacticiel AWS Lambda d'intégration
](getting-started-with-lambda-integration.md)
+ [

# Didacticiel : création d’une API REST par l’importation d’un exemple
](api-gateway-create-api-from-example.md)
+ [

# Didacticiel sur la sélection d’une intégration HTTP
](getting-started-http-integrations.md)
+ [

# Didacticiel : création d’une API REST avec une intégration privée
](getting-started-with-private-integration.md)
+ [

# Tutoriel : Création d'une API REST avec une AWS intégration
](getting-started-aws-proxy.md)
+ [

# Tutoriel : Création d'une API REST de calculatrice avec deux intégrations AWS de services et une intégration Lambda sans proxy
](integrating-api-with-aws-services-lambda.md)
+ [

# Didacticiel : création d’une API REST en tant que proxy Amazon S3
](integrating-api-with-aws-services-s3.md)
+ [

# Didacticiel : création d’une API REST en tant que proxy Amazon Kinesis
](integrating-api-with-aws-services-kinesis.md)
+ [

# Tutoriel : Création d'une API REST à l'aide AWS SDKs du AWS CLI
](api-gateway-create-api-cli-sdk.md)
+ [

# Didacticiel : création d’une API REST privée
](private-api-tutorial.md)

# Choisissez un didacticiel AWS Lambda d'intégration
<a name="getting-started-with-lambda-integration"></a>

 Pour créer une API avec des intégrations Lambda, vous pouvez utiliser l’intégration de proxy Lambda ou l’intégration Lambda autre que de proxy. 

Dans l’intégration de proxy Lambda, l’entrée de la fonction Lambda peut être exprimée sous la forme d’une combinaison d’en-têtes de demande, de variables de chemin d’accès, de paramètres de chaîne de requête, d’un corps et de données de configuration d’API. Vous n’avez qu’à choisir une fonction Lambda. API Gateway configure automatiquement la demande d’intégration et la réponse d’intégration. Une fois configurée, votre méthode d’API peut évoluer sans avoir à modifier les paramètres existants. Cette possibilité est due au fait que la fonction Lambda du backend analyse les données des demandes entrantes et répond au client.

Dans l’intégration Lambda autre que de proxy, vous devez vous assurer que les entrées de la fonction Lambda sont fournies en tant que charge utile de la demande d’intégration. Vous devez mapper toutes les données d’entrée que le client a fournies comme paramètres de demande au corps de la demande d’intégration appropriée. Vous pouvez également avoir besoin de traduire le corps de la demande fournie par le client en un format reconnu par la Fonction Lambda. 

Dans le cadre d’une intégration de proxy Lambda ou d’une intégration Lambda sans proxy, vous pouvez utiliser une fonction Lambda dans un compte différent de celui sur lequel vous avez créé votre API.

**Topics**
+ [

# Didacticiel : création d’une API REST avec une intégration de proxy Lambda
](api-gateway-create-api-as-simple-proxy-for-lambda.md)
+ [

# Didacticiel : création d’une API REST avec une intégration Lambda sans proxy
](getting-started-lambda-non-proxy-integration.md)
+ [

# Didacticiel : création d’une API REST Gateway avec une intégration de proxy Lambda entre comptes
](apigateway-cross-account-lambda-integrations.md)

# Didacticiel : création d’une API REST avec une intégration de proxy Lambda
<a name="api-gateway-create-api-as-simple-proxy-for-lambda"></a>

L’[intégration de proxy Lambda](set-up-lambda-proxy-integrations.md) est un type d’intégration d’API avec API Amazon Gateway léger et flexible qui permet d’intégrer une méthode d’API, ou une API complète, avec une fonction Lambda. La fonction Lambda peut être écrite dans [n’importe quelle langue prise en charge par Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html). Puisqu’il s’agit d’une intégration de proxy, vous pouvez modifier la mise en œuvre de la fonction Lambda à tout moment, sans avoir à redéployer votre API.

Dans ce didacticiel, vous allez effectuer les opérations suivantes :
+ Créer une fonction Lambda « Hello, World\$1 » pour être le backend de l’API.
+ Créer et tester une API « Hello, World\$1 » avec intégration de proxy Lambda.

**Topics**
+ [

## Création d’une fonction Lambda « Hello, World\$1 »
](#api-gateway-proxy-integration-create-lambda-backend)
+ [

## Création d’une API « Hello, World\$1 »
](#api-gateway-create-api-as-simple-proxy-for-lambda-build)
+ [

## Déploiement et test de l’API
](#api-gateway-create-api-as-simple-proxy-for-lambda-test)

## Création d’une fonction Lambda « Hello, World\$1 »
<a name="api-gateway-proxy-integration-create-lambda-backend"></a>

**Pour créer une fonction Lambda « Hello, World\$1 » dans la console Lambda**

1. [Connectez-vous à la console Lambda à l'adresse /lambda. https://console.aws.amazon.com](https://console.aws.amazon.com/lambda)

1. Dans la barre AWS de navigation, choisissez un [Région AWS](https://docs.aws.amazon.com/general/latest/gr/apigateway.html).
**Note**  
Notez la région où vous avez créé la fonction Lambda. Vous en aurez besoin lors de la création de l’API.

1. Choisissez **Fonctions** dans le panneau de navigation.

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

1. Choisissez **Créer à partir de zéro**.

1. Sous **Informations de base**, procédez comme suit :

   1. Sous **Nom de la fonction**, entrez **GetStartedLambdaProxyIntegration**.

   1. Pour **Exécution**, choisissez le dernier environnement d’exécution **Node.js** ou **Python** compatible.

   1. Pour **Architecture**, conservez le paramètre par défaut.

   1. Sous **Permissions** (Autorisations), développez **Change default execution role** (Modifier le rôle d’exécution par défaut). Dans la liste déroulante **Rôle d’exécution**, choisissez **Créer un nouveau rôle à partir de modèles de politique AWS **.

   1. Sous **Nom du rôle**, entrez **GetStartedLambdaBasicExecutionRole**.

   1. Laissez vide le champ **Modèles de politique**.

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

1. Sous **Code de fonction**, dans l'éditeur de code en ligne, copy/paste le code suivant :

------
#### [ Node.js ]

   ```
   export const handler = async(event, context) => {
       console.log('Received event:', JSON.stringify(event, null, 2));
       var res ={
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           }
       };
       var greeter = 'World';
       if (event.greeter && event.greeter!=="") {
           greeter =  event.greeter;
       } else if (event.body && event.body !== "") {
           var body = JSON.parse(event.body);
           if (body.greeter && body.greeter !== "") {
               greeter = body.greeter;
           }
       } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
           greeter = event.queryStringParameters.greeter;
       } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
           greeter = event.multiValueHeaders.greeter.join(" and ");
       } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
           greeter = event.headers.greeter;
       } 
       res.body = "Hello, " + greeter + "!";
       return res
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       greeter = 'World'
   
       try:
           if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and (
                   event['queryStringParameters']['greeter'] is not None):
               greeter = event['queryStringParameters']['greeter']
       except KeyError:
           print('No greeter')
   
       try:
           if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and (
                   event['multiValueHeaders']['greeter'] is not None):
               greeter = " and ".join(event['multiValueHeaders']['greeter'])
       except KeyError:
           print('No greeter')
   
       try:
           if (event['headers']) and (event['headers']['greeter']) and (
                   event['headers']['greeter'] is not None):
               greeter = event['headers']['greeter']
       except KeyError:
           print('No greeter')
   
       if (event['body']) and (event['body'] is not None):
           body = json.loads(event['body'])
           try:
               if (body['greeter']) and (body['greeter'] is not None):
                   greeter = body['greeter']
           except KeyError:
               print('No greeter')
   
       res = {
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           },
           "body": "Hello, " + greeter + "!"
       }
   
       return res
   ```

------

1. Choisissez **Deploy (Déployer)**.

## Création d’une API « Hello, World\$1 »
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-build"></a>

Maintenant, créez une API pour votre fonction Lambda « Hello, World \$1 » à l’aide de la console API Gateway.

**Pour créer une API « Hello, World\$1 »**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1.  Sous **API name (Nom de l’API)**, saisissez **LambdaProxyAPI**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Laissez **Type de point de terminaison d’API** défini sur **Régional**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API** (Créer une API).

Une fois que vous avez créé une API, vous créez une ressource. En règle générale, les ressources API sont organisées dans une arborescence des ressources selon la logique de l’application. Pour cet exemple, vous créez une ressource **/helloworld**. 

**Pour créer une ressource**

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

1. Maintenez **Ressource proxy** désactivée. 

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **helloworld**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

 Dans une intégration de proxy, la totalité de la demande est envoyée à la fonction Lambda du backend en l’état, via une méthode `ANY` fourre-tout qui représente n’importe quelle méthode HTTP. La méthode HTTP concrète est spécifiée par le client au moment de l’exécution. La méthode `ANY` vous permet d’utiliser une seule configuration de méthode d’API pour toutes les méthodes HTTP prises en charge, `DELETE`, `GET`, `HEAD`, `OPTIONS`, `PATCH`, `POST` et `PUT`.

**Pour créer une méthode `ANY`**

1. Sélectionnez la ressource **/helloworld**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **ANY**.

1. Pour **Type d’intégration**, sélectionnez **Fonction Lambda**.

1. Activez **Intégration de proxy Lambda**.

1. Pour la **fonction Lambda**, sélectionnez l' Région AWS endroit où vous avez créé votre fonction Lambda, puis entrez le nom de la fonction.

1. Pour utiliser la valeur de délai d’expiration par défaut de 29 secondes, gardez **Délai d’expiration** activé. Pour définir un délai d’expiration personnalisé, choisissez **Délai d’expiration** et entrez une valeur de délai d’expiration comprise entre `50` et `29000` millisecondes.

1. Choisissez **Créer une méthode**.

## Déploiement et test de l’API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test"></a>

**Pour déployer votre API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **test**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

1. Sous **Détails de l’étape**, choisissez l’icône de copie pour copier l’URL d’invocation de votre API.

### Utilisation du navigateur et de cURL pour tester une API avec l’intégration de proxy Lambda
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test-curl"></a>

Pour tester votre API, vous pouvez utiliser un navigateur ou [cURL](https://curl.se/).

Pour tester les demandes `GET` en utilisant uniquement les paramètres de chaîne de requête, vous pouvez saisir l’URL de la ressource `helloworld` de l’API dans la barre d’adresse d’un navigateur. 

Pour créer l’URL de la ressource `helloworld` de l’API, ajoutez la ressource `helloworld` et le paramètre de chaîne de requête `?greeter=John` à votre URL d’invocation. Votre URL doit ressembler à ce qui suit :

```
https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John
```

Pour les autres méthodes, vous devez utiliser les utilitaires de test plus avancés de l’API REST, tels que [POSTMAN](https://www.postman.com/) ou [cURL](https://curl.se/). Dans ce didacticiel, on utilise cURL. Dans les exemples de commande cURL ci-dessous, on suppose que cURL est installé sur votre ordinateur.

**Pour tester l’API déployée à l’aide de cURL :**

1. Ouvrez une fenêtre du terminal.

1. Copiez la commande cURL suivante et collez-la dans la fenêtre du terminal, et remplacez l’URL d’invocation par celle que vous avez copiée à l’étape précédente et ajoutez **/helloworld** à la fin de l’URL.
**Note**  
Si vous exécutez la commande sous Windows, utilisez plutôt cette syntaxe :  

   ```
   curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
   ```

   1. Pour appeler l’API avec le paramètre de chaîne de requête de `?greeter=John` :

      ```
      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
      ```

   1. Pour appeler l’API avec un paramètre d’en-tête de `greeter:John` :

      ```
      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -H 'greeter: John'
      ```

   1. Pour appeler l’API avec un corps `{"greeter":"John"}` :

      ```
      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -d '{ "greeter": "John" }'
      ```

   Dans tous les cas, la sortie est une réponse 200 avec le corps de réponse suivant :

   ```
   Hello, John!
   ```

# Didacticiel : création d’une API REST avec une intégration Lambda sans proxy
<a name="getting-started-lambda-non-proxy-integration"></a>

Dans cette présentation, nous utilisons la console API Gateway pour créer une API qui permet à un client d’appeler des fonctions Lambda via l’intégration Lambda autre que de proxy (également désignée sous le nom d’intégration personnalisée). Pour en savoir plus sur AWS Lambda et les fonctions Lambda, consultez le [Guide du développeur AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/). 

Pour faciliter l’apprentissage, nous avons choisi une fonction Lambda simple avec une configuration d’API minimale pour vous guider à travers les étapes de création d’une API Amazon API Gateway avec l’intégration personnalisée Lambda. Lorsque nécessaire, nous décrivons un aspect de la logique. Pour un exemple plus détaillé de l’intégration personnalisée Lambda, consultez [Tutoriel : Création d'une API REST de calculatrice avec deux intégrations AWS de services et une intégration Lambda sans proxy](integrating-api-with-aws-services-lambda.md). 

Avant de créer l’API, configurez le backend Lambda en créant une fonction Lambda dans AWS Lambda, comme décrit ci-après.

**Topics**
+ [

## Création d’une fonction Lambda pour l’intégration Lambda autre que de proxy
](#getting-started-new-lambda)
+ [

## Création d’une API avec l’intégration Lambda autre que de proxy
](#getting-started-new-api)
+ [

## Test de l’appel de la méthode d’API
](#getting-started-new-get)
+ [

## Déploiement de l’API
](#getting-started-deploy-api)
+ [

## Test de l’API dans une phase de déploiement
](#getting-started-test)
+ [

## Nettoyage
](#getting-started-clean-up)

## Création d’une fonction Lambda pour l’intégration Lambda autre que de proxy
<a name="getting-started-new-lambda"></a>

**Note**  
La création de fonctions Lambda peut entraîner des frais sur votre AWS compte.

 Au cours de cette étape, vous allez créer une fonction Lambda de type « Hello, World \$1 » pour l’intégration Lambda personnalisée. Tout au long de cette procédure, la fonction est appelée `GetStartedLambdaIntegration`.

 La mise en œuvre de cette fonction Lambda `GetStartedLambdaIntegration` est la suivante : 

------
#### [ Node.js ]

```
'use strict';
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];            
var times = ['morning', 'afternoon', 'evening', 'night', 'day'];

export const handler = async(event) => {
  console.log(event);
  // Parse the input for the name, city, time and day property values
  let name = event.name === null || event.name === undefined || event.name === "" ? 'you' : event.name;
  let city = event.city === undefined ? 'World' : event.city;
  let time = times.indexOf(event.time)<0 ? 'day' : event.time;
  let day = days.indexOf(event.day)<0 ? null : event.day;

  // Generate a greeting
  let greeting = 'Good ' + time + ', ' + name + ' of ' + city + '. ';
  if (day) greeting += 'Happy ' + day + '!';
  
  // Log the greeting to CloudWatch
  console.log('Hello: ', greeting);
  
  // Return a greeting to the caller
  return {"greeting": greeting}
};
```

------
#### [ Python ]

```
import json

days = {
    'Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday'}
times = {'morning', 'afternoon', 'evening', 'night', 'day'}


def lambda_handler(event, context):
    print(event)
    # parse the input for the name, city, time, and day property values
    name = event.get("name") or 'you'
    city = event.get("city") or 'World'
    try:
        if event['time'] in times:
            time = event['time']
        else:
            time = 'day'
    except KeyError:
        time = 'day'
    try:
        if event['day'] in days:
            day = event['day']
        else:
            day = ''
    except KeyError:
        day = ''
    # Generate a greeting
    greeting = 'Good ' + time + ', ' + name + ' of ' + \
        city + '.' + ['', ' Happy ' + day + '!'][day != '']
    # Log the greeting to CloudWatch
    print(greeting)

    # Return a greeting to the caller
    return {"greeting": greeting}
```

------

Pour l’intégration personnalisée Lambda, API Gateway transmet les entrées à la fonction Lambda depuis le client en tant que corps de la demande d’intégration. L’objet `event` du gestionnaire de la fonction Lambda correspond à l’entrée. 

Notre fonction Lambda est simple. Elle analyse l’objet `event` en entrée par rapport aux propriétés `name`, `city`, `time` et `day`. Elle renvoie ensuite un message d’accueil, en tant qu’objet JSON `{"message":greeting}`, à l’appelant. Le message suit le modèle `"Good [morning|afternoon|day], [name|you] in [city|World]. Happy day!"`. Il est supposé que l’entrée de la fonction Lambda est l’objet JSON suivant : 

```
{
  "city": "...",
  "time": "...",
  "day": "...",
  "name" : "..."
}
```

Pour plus d’informations, consultez le [Manuel du développeur AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html). 

En outre, la fonction enregistre son exécution sur Amazon CloudWatch en appelant`console.log(...)`. Cet aspect est précieux pour suivre les appels lors du débogage de la fonction. Pour permettre à la `GetStartedLambdaIntegration` fonction d'enregistrer l'appel, définissez un rôle IAM avec des politiques appropriées pour que la fonction Lambda crée CloudWatch les flux et ajoute des entrées de journal aux flux. La console Lambda vous guide tout au long de la création des rôles et politiques IAM requis.

Si vous configurez l’API sans utiliser la console API Gateway, par exemple en [important une API depuis un fichier OpenAPI](https://github.com/aws-samples/api-gateway-secure-pet-store/blob/master/src/main/resources/swagger.yaml#L39), vous devez créer explicitement, si nécessaire, et configurer une politique et un rôle d’appel pour qu’API Gateway puisse appeler les fonctions Lambda. Pour plus d’informations sur la configuration des rôles d’appel et d’exécution Lambda pour une API Amazon API Gateway, consultez [Contrôle de l’accès à une API REST avec des autorisations IAM](permissions.md). 

 Par rapport à `GetStartedLambdaProxyIntegration`, la fonction Lambda pour l’intégration de proxy Lambda, la fonction `GetStartedLambdaIntegration` Lambda pour l’intégration personnalisée Lambda prend uniquement les entrées du corps de la requête d’intégration d’API Amazon API Gateway. La fonction peut renvoyer une sortie sous forme d’un objet JSON, d’une chaîne, d’un nombre, d’une valeur booléenne ou même d’un blob binaire. La fonction Lambda de l’intégration de proxy Lambda, en revanche, peut accepter les entrées de toutes données de la demande, mais doit renvoyer en sortie un objet JSON particulier. La fonction `GetStartedLambdaIntegration` pour l’intégration personnalisée Lambda peut avoir comme entrées les paramètres de la demande d’API, à condition qu’API Gateway mappe les paramètres de la demande d’API au corps de demande d’intégration avant de transférer la demande du client au backend. Pour que cela se produise, le développeur de l’API doit créer un modèle de mappage et le configurer sur la méthode de l’API lors de la création de l’API. 

Maintenant, créez la fonction Lambda `GetStartedLambdaIntegration`. 

**Pour créer la fonction Lambda `GetStartedLambdaIntegration` pour l’intégration personnalisée Lambda**

1. Ouvrez la AWS Lambda console à l'adresse [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Effectuez l’une des actions suivantes :
   + Si la page de bienvenue s’affiche, choisissez **Get Started Now (Commencer maintenant)** puis **Create function (Créer une fonction)**.
   + Si la liste **Lambda > Functions (Fonctions)** apparaît, choisissez **Create function (Créer une fonction)**.

1. Choisissez **Créer à partir de zéro**. 

1. Dans le volet **Author from scratch (Créer à partir de zéro)**, procédez comme suit :

   1. Dans **Name (Nom)**, entrez **GetStartedLambdaIntegration** comme nom de la fonction Lambda.

   1. Pour **Exécution**, choisissez le dernier environnement d’exécution **Node.js** ou **Python** compatible.

   1. Pour **Architecture**, conservez le paramètre par défaut.

   1. Sous **Permissions** (Autorisations), développez **Change default execution role** (Modifier le rôle d’exécution par défaut). Dans la liste déroulante **Rôle d’exécution**, choisissez **Créer un nouveau rôle à partir de modèles de politique AWS **.

   1. Pour **Role name (Nom du rôle)**, indiquez le nom de votre rôle, par exemple **GetStartedLambdaIntegrationRole**.

   1. Pour **Policy templates (Modèles de politique)**, choisissez **Simple microservice permissions (Autorisations Microservice simples)**.

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

1. Dans le volet **Configure function (Configurer la fonction)**, sous **Function code (Code de la fonction)**, suivez les étapes suivantes :

   1. Copiez le code de la fonction Lambda affiché au début de cette section et collez-le dans l’éditeur de code en ligne.

   1. Acceptez les choix par défaut pour tous les autres champs de cette section.

   1. Choisissez **Deploy (Déployer)**.

1. Pour tester la fonction nouvellement créée, cliquez sur l’onglet **Test**.

   1. Dans **Event name** (Nom de l’événement), saisissez **HelloWorldTest**. 

   1. Pour **JSON d’événement**, remplacez le code par défaut par le code suivant.

      ```
      {
        "name": "Jonny",
        "city": "Seattle",
        "time": "morning",
        "day": "Wednesday"
      }
      ```

   1.  Sélectionnez **Test** pour appeler la fonction. La section **Execution result: succeeded** s’affiche. Développez **Détails** pour voir la sortie suivante.

      ```
      {
          "greeting": "Good morning, Jonny of Seattle. Happy Wednesday!"
      }
      ```

      La sortie est également écrite dans CloudWatch Logs. 

 À titre d’exercice, vous pouvez utiliser la console IAM pour afficher le rôle IAM (`GetStartedLambdaIntegrationRole`) créé dans le cadre de la création de la fonction Lambda. Deux politiques en ligne sont attachées à ce rôle IAM. L’une stipule les autorisations les plus élémentaires pour l’exécution Lambda. Cela permet d'appeler toutes CloudWatch `CreateLogGroup` les CloudWatch ressources de votre compte dans la région où la fonction Lambda est créée. Cette politique permet également de créer les CloudWatch flux et de consigner les événements pour la fonction `GetStartedLambdaIntegration` Lambda. 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:us-east-1:111111111111:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111111111111:log-group:/aws/lambda/GetStartedLambdaIntegration:*"
            ]
        }
    ]
}
```

------

L'autre document de politique s'applique à l'appel d'un autre AWS service qui n'est pas utilisé dans cet exemple. Vous pouvez l’ignorer pour l’instant. 

 Associée au rôle IAM se trouve une entité de confiance, qui est `lambda.amazonaws.com`. Voici la relation d’approbation : 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

 La combinaison de cette relation de confiance et de la politique intégrée permet à la fonction Lambda d'appeler `console.log()` une fonction pour consigner les événements CloudWatch dans Logs. 

## Création d’une API avec l’intégration Lambda autre que de proxy
<a name="getting-started-new-api"></a>

 Avec la fonction Lambda (`GetStartedLambdaIntegration`) créée et testée, vous êtes prêt à exposer la fonction via une API Amazon API Gateway. À des fins d’illustration, nous exposons la fonction Lambda avec une méthode HTTP générique. Nous utilisons le corps de la demande, une variable de chemin d’URL, une chaîne de requête et un en-tête pour recevoir les données d’entrée requises du client. Nous activons le validateur de demande API Gateway pour l’API afin de garantir que toutes les données requises sont correctement définies et spécifiées. Nous configurons un modèle de mappage pour qu’API Gateway transforme les données de la demande fournie par le client au format valide comme requis par la fonction Lambda du backend.

**Pour créer une API avec une intégration Lambda autre que de proxy**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1.  Sous **API name (Nom de l’API)**, saisissez **LambdaNonProxyAPI**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Laissez **Type de point de terminaison d’API** défini sur **Régional**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API** (Créer une API).

Après avoir créé votre API, vous créez une ressource **/\$1city\$1**. Ceci est un exemple de ressource avec une variable de chemin qui accepte une entrée du client. Par la suite, vous mapperez cette variable de chemin avec l’entrée de la fonction Lambda à l’aide d’un modèle de mappage.

**Pour créer une ressource**

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

1. Maintenez **Ressource proxy** désactivée. 

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1city\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

Après avoir créé votre ressource **/\$1city\$1**, vous créez une méthode `ANY`. Le verbe HTTP `ANY` est un espace réservé pour une méthode HTTP valide qu’un client soumet au moment de l’exécution. Cet exemple montre que la méthode `ANY` peut être utilisée pour l’intégration personnalisée Lambda aussi bien que pour l’intégration de proxy Lambda.

**Pour créer une méthode `ANY`**

1. Sélectionnez la ressource **/\$1city\$1**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **ANY**.

1. Pour **Type d’intégration**, sélectionnez **Fonction Lambda**.

1. Maintenez **Intégration proxy Lambda** désactivée.

1. Pour la **fonction Lambda**, sélectionnez l' Région AWS endroit où vous avez créé votre fonction Lambda, puis entrez le nom de la fonction.

1. Choisissez **Paramètres de requête de méthode**.

   À présent, vous allez activer un valideur de requête pour une variable de chemin d’URL, un paramètre de chaîne de requête et un en-tête afin de vous assurer que toutes les données requises sont définies. Dans cet exemple, vous créez un paramètre de chaîne de requête `time` et un en-tête `day`. 

1. Pour **Validateur de requête**, sélectionnez **Valider les paramètres de chaîne de requête et les en-têtes**.

1. Choisissez **Paramètres de chaîne de requête d’URL** et procédez comme suit : 

   1. Sélectionnez **Add query string** (Ajouter une chaîne de requêtes).

   1. Pour **Nom**, saisissez **time**.

   1. Activez **Obligatoire**.

   1. Maintenez **Mise en cache** désactivée. 

1. Choisissez **En-têtes de requête HTTP** et procédez comme suit : 

   1. Sélectionnez **Add header**.

   1. Pour **Nom**, saisissez **day**.

   1. Activez **Obligatoire**.

   1. Maintenez **Mise en cache** désactivée. 

1. Choisissez **Créer une méthode**.

Après avoir activé un validateur de requête, vous configurez la requête d’intégration pour la méthode `ANY` en ajoutant un modèle de mappage corporel pour transformer la requête entrante en une charge utile JSON, comme l’exige la fonction Lambda du backend. 

**Pour configurer la requête d’intégration**

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**.

1. Pour **Transmission du corps de requête**, sélectionnez **Lorsqu’aucun modèle n’est défini (recommandé)**.

1. Choisissez **Modèles de mappage**.

1. Sélectionnez **Add mapping template**.

1. Pour **Type de contenu**, entrez **application/json**.

1. Pour **Corps du modèle**, entrez le code suivant :

   ```
   #set($inputRoot = $input.path('$'))
   {
     "city": "$input.params('city')",
     "time": "$input.params('time')",
     "day":  "$input.params('day')",
     "name": "$inputRoot.callerName"
   }
   ```

1. Choisissez **Enregistrer**.

## Test de l’appel de la méthode d’API
<a name="getting-started-new-get"></a>

 La console API Gateway fournit une installation de test qui vous permet de tester l’appel de l’API avant qu’elle ne soit déployée. Vous utilisez la fonctionnalité Test de la console pour tester l’API en soumettant la demande suivante : 

```
POST /Seattle?time=morning
day:Wednesday

{
    "callerName": "John"
}
```

 Dans cette demande de test, vous allez définir `ANY` sur `POST` et `{city}` sur `Seattle`, attribuer `Wednesday` comme valeur de l’en-tête `day` et attribuer `"John"` comme valeur de `callerName`. 

**Pour tester la méthode `ANY`**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Type de méthode**, sélectionnez `POST`.

1. Pour **Chemin**, sous **city**, entrez **Seattle**.

1. Pour **Chaînes de requête**, saisissez **time=morning**.

1. Pour **En-têtes**, saisissez **day:Wednesday**.

1. Pour **Corps de la requête**, saisissez **\$1 "callerName": "John" \$1**.

1. Sélectionnez **Test**.

Vérifiez que la charge utile de la réponse retournée se présente comme suit :

```
{
  "greeting": "Good morning, John of Seattle. Happy Wednesday!"
}
```

Vous pouvez également consulter les journaux pour examiner comment API Gateway traite la demande et la réponse.

```
Execution log for request test-request
Thu Aug 31 01:07:25 UTC 2017 : Starting execution for request: test-invoke-request
Thu Aug 31 01:07:25 UTC 2017 : HTTP Method: POST, Resource Path: /Seattle
Thu Aug 31 01:07:25 UTC 2017 : Method request path: {city=Seattle}
Thu Aug 31 01:07:25 UTC 2017 : Method request query string: {time=morning}
Thu Aug 31 01:07:25 UTC 2017 : Method request headers: {day=Wednesday}
Thu Aug 31 01:07:25 UTC 2017 : Method request body before transformations: { "callerName": "John" }
Thu Aug 31 01:07:25 UTC 2017 : Request validation succeeded for content type application/json
Thu Aug 31 01:07:25 UTC 2017 : Endpoint request URI: https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:GetStartedLambdaIntegration/invocations
Thu Aug 31 01:07:25 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=****************************************************************************************************************************************************************************************************************************************************************************************************************************************338c72, X-Amz-Date=20170831T010725Z, x-amzn-apigateway-api-id=beags1mnid, X-Amz-Source-Arn=arn:aws:execute-api:us-west-2:123456789012:beags1mnid/null/POST/{city}, Accept=application/json, User-Agent=AmazonAPIGateway_beags1mnid, X-Amz-Security-Token=FQoDYXdzELL//////////wEaDMHGzEdEOT/VvGhabiK3AzgKrJw+3zLqJZG4PhOq12K6W21+QotY2rrZyOzqhLoiuRg3CAYNQ2eqgL5D54+63ey9bIdtwHGoyBdq8ecWxJK/YUnT2Rau0L9HCG5p7FC05h3IvwlFfvcidQNXeYvsKJTLXI05/yEnY3ttIAnpNYLOezD9Es8rBfyruHfJfOqextKlsC8DymCcqlGkig8qLKcZ0hWJWVwiPJiFgL7laabXs++ZhCa4hdZo4iqlG729DE4gaV1mJVdoAagIUwLMo+y4NxFDu0r7I0/EO5nYcCrppGVVBYiGk7H4T6sXuhTkbNNqVmXtV3ch5bOlh7 [TRUNCATED]
Thu Aug 31 01:07:25 UTC 2017 : Endpoint request body after transformations: {
  "city": "Seattle",
  "time": "morning",
  "day": "Wednesday",
  "name" : "John"
}
Thu Aug 31 01:07:25 UTC 2017 : Sending request to https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:GetStartedLambdaIntegration/invocations
Thu Aug 31 01:07:25 UTC 2017 : Received response. Integration latency: 328 ms
Thu Aug 31 01:07:25 UTC 2017 : Endpoint response body before transformations: {"greeting":"Good morning, John of Seattle. Happy Wednesday!"}
Thu Aug 31 01:07:25 UTC 2017 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=c0475a28-8de8-11e7-8d3f-4183da788f0f, Connection=keep-alive, Content-Length=62, Date=Thu, 31 Aug 2017 01:07:25 GMT, X-Amzn-Trace-Id=root=1-59a7614d-373151b01b0713127e646635;sampled=0, Content-Type=application/json}
Thu Aug 31 01:07:25 UTC 2017 : Method response body after transformations: {"greeting":"Good morning, John of Seattle. Happy Wednesday!"}
Thu Aug 31 01:07:25 UTC 2017 : Method response headers: {X-Amzn-Trace-Id=sampled=0;root=1-59a7614d-373151b01b0713127e646635, Content-Type=application/json}
Thu Aug 31 01:07:25 UTC 2017 : Successfully completed execution
Thu Aug 31 01:07:25 UTC 2017 : Method completed with status: 200
```

Les journaux présentent la demande entrante avant le mappage et la demande d’intégration après le mappage. Lorsqu’un test échoue, les journaux sont utiles pour évaluer si l’entrée d’origine est correcte ou si le modèle de mappage fonctionne correctement. 

## Déploiement de l’API
<a name="getting-started-deploy-api"></a>

 L’appel du test est une simulation et possède ses limites. Par exemple, il contourne tout mécanisme d’autorisation activé sur l’API. Pour tester l’exécution de l’API en temps réel, vous devez d’abord déployer l’API. Pour déployer une API, vous créez une phase afin de créer un instantané de l’API à ce moment-là. Le nom de la phase définit également le chemin de base après le nom d’hôte par défaut de l’API. La ressource racine de l’API est ajoutée après le nom de la phase. Lorsque vous modifiez l’API, vous devez la redéployer vers une phase nouvelle ou existante pour que les modifications prennent effet. 

**Pour déployer l’API sur une phase**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **test**.
**Note**  
L’entrée doit être du texte codé en UTF-8 (par exemple, non localisé).

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

Sous **Détails de l’étape**, choisissez l’icône de copie pour copier l’URL d’invocation de votre API. Le modèle général de l’URL de base de l’API est `https://api-id.region.amazonaws.com/stageName`. Par exemple, l’URL de base de l’API (`beags1mnid`) créée dans la région `us-west-2` et déployée sur la phase `test` est `https://beags1mnid.execute-api.us-west-2.amazonaws.com/test`.

## Test de l’API dans une phase de déploiement
<a name="getting-started-test"></a>

Il existe plusieurs façons de tester une API déployée. Pour les requêtes GET n’utilisant que les variables de chemin d’URL ou les paramètres de chaîne de requête, vous pouvez saisir l’URL de la ressource d’API dans un navigateur. Pour les autres méthodes, vous devez utiliser les utilitaires de test plus avancés de l’API REST, tels que [POSTMAN](https://www.postman.com/) ou [cURL](https://curl.se/).

**Pour tester l’API à l’aide de cURL**

1. Ouvrez une fenêtre de terminal sur votre ordinateur local connecté à Internet.

1. Pour tester `POST /Seattle?time=evening`:

   Copiez la commande cURL suivante et collez-la dans la fenêtre du terminal.

   ```
   curl -v -X POST \
     'https://beags1mnid.execute-api.us-west-2.amazonaws.com/test/Seattle?time=evening' \
     -H 'content-type: application/json' \
     -H 'day: Thursday' \
     -H 'x-amz-docs-region: us-west-2' \
     -d '{
   	"callerName": "John"
   }'
   ```

   Vous devriez obtenir une réponse positive avec la charge utile suivante :

   ```
   {"greeting":"Good evening, John of Seattle. Happy Thursday!"}
   ```

   Si vous modifiez `POST` en `PUT` dans la demande de cette méthode, vous obtenez la même réponse.

## Nettoyage
<a name="getting-started-clean-up"></a>

Si vous n’avez plus besoin des fonctions Lambda que vous avez créées pour cette procédure, vous pouvez maintenant les supprimer. Vous pouvez également supprimer les ressources IAM associées.

**Avertissement**  
Si vous avez l’intention d’effectuer les autres procédures de cette série, ne supprimez pas le rôle d’exécution Lambda, ni le rôle d’appel Lambda. Si vous supprimez une fonction Lambda sur laquelle vous APIs comptez, elle ne APIs fonctionnera plus. La suppression d’une fonction Lambda ne peut pas être annulée. Si vous souhaitez utiliser à nouveau cette fonction Lambda, vous devez la recréer.  
Si vous supprimez une ressource IAM sur laquelle repose une fonction Lambda, cette fonction Lambda ne fonctionnera plus, et APIs toutes celles qui s'appuient sur cette fonction ne fonctionneront plus. La suppression d'une ressource IAM ne peut pas être annulée. Si vous souhaitez utiliser à nouveau cette ressource IAM, vous devez la recréer. 

**Pour supprimer la fonction Lambda**

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

1. Dans la liste des fonctions, choisissez **GetStartedLambdaIntegration**, **Actions**, puis **Delete function (Supprimer la fonction)**. A l’invite, sélectionnez à nouveau **Delete**.

**Pour supprimer les ressources IAM associées**

1. Ouvrez la console IAM à l’adresse [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Dans le volet **Details**, sélectionnez **Roles**.

1. Dans la liste des rôles, choisissez **GetStartedLambdaIntegrationRole**, **Role Actions (Actions du rôle)**, puis **Delete Role (Supprimer le rôle)**. Suivez les étapes de la console pour supprimer le rôle.

# Didacticiel : création d’une API REST Gateway avec une intégration de proxy Lambda entre comptes
<a name="apigateway-cross-account-lambda-integrations"></a>

Vous pouvez désormais utiliser une AWS Lambda fonction d'un autre AWS compte comme backend d'intégration d'API. Chaque compte peut se trouver dans n’importe quelle région où Amazon API Gateway est disponible. Cela facilite la gestion centralisée et le partage des fonctions du backend Lambda entre plusieurs. APIs

Dans cette section, nous montrons comment configurer l’intégration de proxy Lambda entre comptes à l’aide de la console Amazon API Gateway.

## Création d’une API pour l’intégration Lambda entre comptes d’API Gateway
<a name="apigateway-cross-account-lambda-integrations-create-api"></a>

**Pour créer une API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1.  Sous **API name (Nom de l’API)**, saisissez **CrossAccountLambdaAPI**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Laissez **Type de point de terminaison d’API** défini sur **Régional**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API** (Créer une API).

## Création d’une fonction d’intégration Lambda dans un autre compte
<a name="apigateway-cross-account-lambda-integrations-create-lambda-function"></a>

Maintenant, vous allez créer une fonction Lambda dans un compte différent de celui dans lequel vous avez créé l’exemple d’API.

**Création d’une fonction Lambda dans un autre compte**

1. Connectez-vous à la console Lambda dans un compte différent de celui dans lequel vous avez créé votre API Amazon API Gateway.

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

1. Choisissez **Créer à partir de zéro**.

1. Sous **Author from scratch**, effectuez les étapes suivantes :

   1. Pour **Nom de la fonction**, entrez un nom.

   1. Dans la liste déroulante **Exécution**, choisissez un environnement d’exécution Node.js pris en charge.

   1. Pour **Architecture**, conservez le paramètre par défaut.

   1. Sous **Permissions (Autorisations)**, développez **Choose or create an execution role (Choisir ou créer un rôle d’exécution)**. Vous pouvez créer un rôle ou choisir un rôle existant.

   1. Sélectionnez **Create function** pour continuer.

1. Faites défiler l’écran vers le bas jusqu’au volet **Function code** (Code de fonction).

1. Copiez et collez l’implémentation de la fonction Node.js depuis [Didacticiel : création d’une API REST avec une intégration de proxy Lambda](api-gateway-create-api-as-simple-proxy-for-lambda.md).

1. Choisissez **Deploy (Déployer)**.

1. Notez l’ARN complet de votre fonction (dans le coin supérieur droit du volet de la fonction Lambda). Vous en aurez besoin lors de la création de votre intégration Lambda entre comptes.

## Configuration de l’intégration Lambda entre comptes
<a name="apigateway-cross-account-lambda-integrations-create-integration2"></a>

Une fois que vous disposez d’une fonction d’intégration Lambda dans un autre compte, vous pouvez utiliser la console API Gateway pour l’ajouter à votre API dans votre premier compte.

**Note**  
Si vous configurez un mécanisme d’autorisation inter-compte entre régions, le `sourceArn` qui est ajouté à la fonction cible doit utiliser la région de la fonction, pas la région de l’API.

Une fois que vous avez créé une API, vous créez une ressource. En règle générale, les ressources API sont organisées dans une arborescence des ressources selon la logique de l’application. Pour cet exemple, vous créez une ressource **/helloworld**. 

**Pour créer une ressource**

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

1. Maintenez **Ressource proxy** désactivée. 

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **helloworld**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

Après avoir créé une ressource, vous créez une méthode `GET`. Vous intégrez la méthode `GET` avec une fonction Lambda dans un autre compte. 

**Pour créer une méthode `GET`**

1. Sélectionnez la ressource **/helloworld**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Fonction Lambda**.

1. Activez **Intégration de proxy Lambda**.

1. Pour la **fonction Lambda**, entrez l’ARN complet de votre fonction Lambda à l’étape 1. 

   Dans la console Lambda, vous trouverez l’ARN de votre fonction dans le coin supérieur droit de la fenêtre de la console.

1. Lorsque vous entrez l’ARN, une chaîne de commande `aws lambda add-permission` apparaît. Cette politique permet d’accorder à votre premier compte l’accès à la fonction Lambda de votre second compte. Copiez et collez la chaîne de `aws lambda add-permission` commande dans une AWS CLI fenêtre configurée pour votre deuxième compte.

1. Choisissez **Créer une méthode**.

Vous pouvez afficher la politique de mise à jour de votre fonction dans la console Lambda.

**(Facultatif) Pour consulter votre politique mise à jour**

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

1. Choisissez votre fonction Lambda.

1. Choisissez **Permissions**.

   Vous devriez voir une politique `Allow` avec une clause `Condition` dans laquelle l’`AWS:SourceArn` est l’ARN de la méthode `GET` de votre API.

# Didacticiel : création d’une API REST par l’importation d’un exemple
<a name="api-gateway-create-api-from-example"></a>

Vous pouvez utiliser la console Amazon API Gateway pour créer et tester une API REST simple avec intégration HTTP pour un PetStore site Web. La définition d’API est préconfigurée comme fichier OpenAPI 2.0. Après le chargement de la définition d’API dans API Gateway, vous pouvez utiliser la console API Gateway pour examiner la structure de base de l’API ou simplement déployer et tester l’API. 

 L' PetStore exemple d'API prend en charge les méthodes suivantes permettant à un client d'accéder au site Web principal HTTP de`http://petstore-demo-endpoint.execute-api.com/petstore/pets`. 

**Note**  
Ce didacticiel utilise un point de terminaison HTTP comme exemple. Lorsque vous créez le vôtre APIs, nous vous recommandons d'utiliser des points de terminaison HTTPS pour vos intégrations HTTP.
+ `GET /` : pour l’accès en lecture de la ressource racine de l’API qui n’est pas intégrée avec un point de terminaison du serveur principal. API Gateway répond par un aperçu du PetStore site Web. Il s'agit d'un exemple du type d'intégration `MOCK`.
+ `GET /pets` : pour l’accès en lecture de la ressource `/pets` de l’API intégrée avec la ressource `/pets` du serveur principal de même nom. Le backend renvoie une page des animaux de compagnie disponibles dans le PetStore. Il s'agit d'un exemple du type d'intégration `HTTP`. L’URL du point de terminaison de l’intégration est `http://petstore-demo-endpoint.execute-api.com/petstore/pets`.
+ `POST /pets` : pour l’accès en écriture de la ressource `/pets` de l’API intégrée avec la ressource `/petstore/pets` du serveur principal. Dès réception d'une demande correcte, le backend ajoute l'animal spécifié au PetStore et renvoie le résultat à l'appelant. Il s’agit aussi d’une intégration `HTTP`.
+ `GET /pets/{petId}` : pour l’accès en lecture à un animal identifié par une valeur `petId` telle que spécifiée comme variable du chemin d’accès de l’URL de la demande entrante. Cette méthode possède également le type d’intégration `HTTP`. Le backend renvoie l'animal de compagnie spécifié trouvé dans le PetStore. L’URL du point de terminaison HTTP du serveur principal est `http://petstore-demo-endpoint.execute-api.com/petstore/pets/n`, où `n` désigne un nombre entier comme identifiant de l’animal recherché.

 L’API prend en charge l’accès CORS via les méthodes `OPTIONS` du type d’intégration `MOCK`. API Gateway renvoie les en-têtes requis prenant en charge l’accès CORS. 

La procédure suivante vous guide à travers les étapes de création et de test d’une API à partir d’un exemple à l’aide de la console API Gateway.

**Pour importer, créer et tester l’exemple d’API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Effectuez l’une des actions suivantes :
   + Pour créer votre première API, pour **API REST**, choisissez **Création**.
   + Si vous avez déjà créé une API, choisissez **Créer une API**, puis **Création** pour **API REST**.

1.  Sous **Créer une API REST**, choisissez **Exemple d’API**, puis **Créer une API** pour créer l’exemple d’API. 

      
![\[Exemple d’API REST dans la console API Gateway.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-new-console.png)

    Vous pouvez faire défiler la définition OpenAPI vers le bas pour voir les détails de cet exemple d’API avant de choisir **Créer une API**. 

1. Dans le volet de navigation principal, choisissez **Ressources**. L’API nouvellement créée est affichée comme suit :

      
![\[Exemple d’API après son importation dans la console API Gateway.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-result-new-console.png)

    Le volet **Resources** illustre la structure de l’API créée sous la forme d’une arborescence de nœuds. Les méthodes d’API définies sur chaque ressource sont les arêtes de l’arborescence. Lorsqu’une ressource est sélectionnée, toutes ses méthodes sont répertoriées dans la table **Méthodes** de droite. Le type de méthode, le type d’intégration, le type d’autorisation et la clé d’API requise sont affichés avec chaque méthode. 

1.  Pour afficher les détails d’une méthode, modifier sa configuration ou tester l’appel de cette méthode, sélectionnez le nom de la méthode dans la liste des méthodes ou dans l’arborescence des ressources. Ici, nous avons choisi la méthode `POST /pets` comme illustration : 

      
![\[Méthode POST /pets pour l’exemple d’API dans la console API Gateway.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-post-method-execution-new-console.png)

    Le volet **Exécution de la méthode** qui en résulte présente une vue logique de la structure et des comportements de la méthode choisie (`POST /pets`).

   **Demande de méthode** et **Réponse de méthode** représentent l’interface de l’API avec le frontend, et **Demande d’intégration** et **Réponse d’intégration** représentent l’interface de l’API avec le backend.

    Un client utilise l’API pour accéder à une fonctionnalité backend via **Demande de méthode**. Si nécessaire, API Gateway convertit la demande du client au format acceptable pour le backend dans **Demande d’intégration** avant de la transférer vers ce backend. La demande transformée est connue en tant que demande d’intégration. De même, le backend renvoie la réponse à API Gateway dans **Réponse d’intégration**. Ensuite, API Gateway l’achemine vers **Method Response (Réponse de méthode)** avant de l’envoyer au client. Là encore, si nécessaire, API Gateway peut mapper les données de réponse du backend au format attendu par le client. 

    Pour la méthode `POST` sur une ressource d’API, la charge utile de la demande de méthode peut être transmise via la demande d’intégration sans modification, si la charge utile de la demande de méthode est au même format que charge utile de la demande d’intégration. 

   La demande de méthode `GET /` utilise le type d’intégration `MOCK` et n’est liée à aucun point de terminaison du serveur principal réel. La **Réponse d’intégration** correspondante est configurée pour renvoyer une page HTML statique. Lorsque la méthode est appelée, API Gateway accepte simplement la demande et renvoie immédiatement la réponse d’intégration configurée au client via **Réponse de méthode**. Vous pouvez utiliser l’intégration simulée pour tester une API sans avoir besoin d’un point de terminaison sur le serveur principal. Vous pouvez également l’utiliser pour servir une réponse locale, générée à partir d’un modèle de mappage de corps de réponse. 

   En tant que développeur d’API, vous contrôlez les comportements des interactions frontales de votre API en configurant la demande de méthode et une réponse de méthode. Vous contrôlez les comportements des interactions principales de votre API en configurant la demande d’intégration et la réponse d’intégration. Cela implique des mappages de données entre une méthode et l’intégration correspondante. Pour le moment, nous nous concentrons sur le test de l'API afin d'offrir une expérience end-to-end utilisateur. 

1.  Sélectionnez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l'onglet. 

1.  Par exemple, pour tester la méthode `POST /pets`, entrez la charge utile **\$1"type": "dog","price": 249.99\$1** suivante dans **Corps de la demande** avant de choisir **Test**.

      
![\[Test de la méthode POST dans la console API Gateway.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-post-method-test-new-console.png)

    L'entrée indique les attributs de l'animal que nous voulons ajouter à la liste des animaux de compagnie sur le PetStore site Web. 

1. Les résultats s’affichent comme suit :

      
![\[Résultat du test de la méthode POST dans la console API Gateway.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-post-method-test-result-new-console.png)

    L’entrée **Journal** de la sortie indique les changements d’état entre la demande de la méthode et la demande d’intégration, et entre la réponse d’intégration et la réponse de la méthode. Cela peut être utile pour résoudre les éventuelles erreurs de mappage susceptibles d’entraîner l’échec de la demande. Dans cet exemple, aucun mappage n’est appliqué : la charge utile de la demande de méthode charge est transmise via la demande d’intégration au serveur principal et, de même la réponse du serveur principal est transmise via la réponse d’intégration à la réponse de la méthode. 

    Pour tester l'API à l'aide d'un client autre que la test-invoke-request fonctionnalité API Gateway, vous devez d'abord déployer l'API sur une étape. 

1.  Pour déployer l’exemple d’API jusqu’à une étape, choisissez **Déployer l’API**. 

      
![\[Utilisation du bouton Déployer pour déployer votre API afin que les appelants d’API puissent invoquer votre API.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-deploy-api-new-console.png)

1. Pour **Étape**, sélectionnez **Nouvelle étape**, puis entrez **test**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

1.  Dans le volet **Étapes** qui s’affiche, sous **Détails de l’étape**, **Appeler une URL** affiche l’URL permettant d’invoquer la demande de méthode `GET /` de l’API.   
![\[Une fois que vous avez créé votre API REST, la console affiche l’URL d’invocation de votre API.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/getting-started-rest-invoke-url.png)

1. Choisissez l’icône de copie pour copier l’URL d’invocation de votre API, puis saisissez l’URL d’invocation de votre API dans un navigateur Web. Une réponse positive renvoie le résultat, généré à partir du modèle de mappage dans la réponse d’intégration. 

1.  Dans le panneau de navigation **Stages** (Étapes), développez l’étape **test**, sélectionnez **GET** sur `/pets/{petId}`, puis copiez la valeur du champ **Invoke URL** (Appeler une URL) de `https://api-id.execute-api.region.amazonaws.com/test/pets/{petId}`. `{petId}` représente une variable du chemin d’accès. 

    Collez la valeur du champ **Invoke URL** (obtenue à l’étape précédente) dans la barre d’adresse d’un navigateur, en remplaçant `{petId}` par `1`, par exemple, puis appuyez sur Entrée pour envoyer la demande. Une réponse 200 OK doit être renvoyée avec la charge utile JSON suivante : 

   ```
   {
     "id": 1,
     "type": "dog",
     "price": 249.99
   }
   ```

    L’appel de la méthode d’API de cette façon est possible, car le type d’autorisation défini dans le champ **Authorization** est `NONE`. Si l’autorisation `AWS_IAM` était utilisée, vous signeriez la demande à l’aide du protocole [Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html) (SigV4) ou [Signature Version 4a](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html#how-sigv4a-works) (SigV4a). Pour voir un exemple de ce type de demande, consultez [Didacticiel : création d’une API REST avec une intégration HTTP sans proxy](api-gateway-create-api-step-by-step.md). 

# Didacticiel sur la sélection d’une intégration HTTP
<a name="getting-started-http-integrations"></a>

 Pour créer une API avec une intégration HTTP, vous pouvez utiliser une intégration de proxy HTTP ou une intégration HTTP personnalisée.

Dans une intégration de proxy HTTP, il vous suffit de définir la méthode HTTP et l’URI du point de terminaison HTTP selon les exigences du backend. Nous vous recommandons d’utiliser l’intégration de proxy HTTP, dans la mesure du possible, pour profiter de la configuration simplifiée de l’API.

Vous pouvez utiliser l’intégration HTTP personnalisée si vous avez besoin de transformer les données de la demande du client pour le backend, ou de transformer les données de la réponse du backend pour le client. 

**Topics**
+ [

# Didacticiel : création d’une API REST avec une intégration de proxy HTTP
](api-gateway-create-api-as-simple-proxy-for-http.md)
+ [

# Didacticiel : création d’une API REST avec une intégration HTTP sans proxy
](api-gateway-create-api-step-by-step.md)

# Didacticiel : création d’une API REST avec une intégration de proxy HTTP
<a name="api-gateway-create-api-as-simple-proxy-for-http"></a>

L’intégration de proxy HTTP est un mécanisme simple, puissant et polyvalent pour créer une API qui permet à une application web d’accéder à plusieurs ressources ou fonctionnalités du point de terminaison HTTP intégré, comme la totalité du site web, à l’aide d’une configuration rationalisée d’une seule méthode d’API. Dans l’intégration de proxy HTTP, API Gateway transmet au backend la demande de méthode envoyée par le client. Les données de la demande transmises incluent les en-têtes de demande, les paramètres de chaîne de requête, les variables du chemin de l’URL et la charge utile. Le point de terminaison HTTP du serveur principal ou le serveur web analyse les données de la demande entrante pour déterminer la réponse qu’il renvoie. L’intégration de proxy HTTP permet l’interaction directe entre le client et le backend sans intervention d’API Gateway après la configuration de la méthode d’API, sauf pour les problèmes connus comme les caractères non pris en charge, qui sont énumérés dans les [Remarques importantes concernant Amazon API Gateway](api-gateway-known-issues.md).

Grâce à la ressource proxy globale `{proxy+}` et au verbe fourre-tout `ANY` de la méthode HTTP, vous pouvez utiliser une intégration de proxy HTTP pour créer une API d’une seule méthode d’API. La méthode expose l’ensemble des ressources et opérations HTTP accessibles publiquement d’un site web. Lorsque le serveur web principal ouvre de nouvelles ressources pour l’accès public, le client peut utiliser ces nouvelles ressources avec la même configuration d’API. Pour ce faire, le développeur du site web doit communiquer clairement au développeur du client quelles sont les nouvelles ressources et quelles opérations sont applicables pour chacune d’entre elles.



À titre de présentation rapide, le didacticiel suivant illustre l’intégration de proxy HTTP. Dans le didacticiel, nous créons une API à l'aide de la console API Gateway pour l'intégrer au PetStore site Web via une ressource proxy générique`{proxy+}`, et nous créons l'espace réservé à la méthode HTTP de`ANY`. 

**Topics**
+ [

## Création d’une API avec l’intégration de proxy HTTP à l’aide de la console API Gateway
](#api-gateway-create-api-as-simple-proxy-for-http-build)
+ [

## Test d’une API avec l’intégration de proxy HTTP
](#api-gateway-create-api-as-simple-proxy-for-http-test)

## Création d’une API avec l’intégration de proxy HTTP à l’aide de la console API Gateway
<a name="api-gateway-create-api-as-simple-proxy-for-http-build"></a>

 La procédure suivante explique comment créer et tester une API avec une ressource proxy pour un backend HTTP à l’aide de la console API Gateway. Le backend HTTP est le site web `PetStore` (`http://petstore-demo-endpoint.execute-api.com/petstore/pets`) provenant du [Didacticiel : création d’une API REST avec une intégration HTTP sans proxy](api-gateway-create-api-step-by-step.md), dans lequel les captures d’écran sont utilisées comme aides visuelles pour illustrer les éléments de l’interface utilisateur API Gateway. Si c’est la première fois que vous utilisez la console API Gateway pour créer une API, il se peut que vous souhaitiez suivre d’abord les instructions de cette section. 

**Pour créer une API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1.  Sous **API name (Nom de l’API)**, saisissez **HTTPProxyAPI**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Laissez **Type de point de terminaison d’API** défini sur **Régional**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API** (Créer une API).

Dans cette étape, vous créez un chemin de ressource proxy de `{proxy+}`. Il s’agit de l’espace réservé de chacun des points de terminaison du backend sous `http://petstore-demo-endpoint.execute-api.com/`. Par exemple, il peut être `petstore`, `petstore/pets` et `petstore/pets/{petId}`. API Gateway crée la méthode `ANY` lorsque vous créez la ressource `{proxy+}` et sert d’espace réservé pour chacun des verbes HTTP pris en charge au moment de l’exécution.

**Pour créer une ressource**/\$1proxy\$1\$1****

1. Choisissez votre API. 

1. Dans le volet de navigation principal, choisissez **Ressources**.

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

1. Activez **Ressource proxy**.

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1proxy\$1\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

1. Choisissez **Créer une ressource**.  
![\[Créez une ressource enfant.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-simple-proxy-create-proxy-resource-new-console.png)

Au cours de cette étape, vous intégrez la méthode `ANY` avec un point de terminaison HTTP de backend à l’aide d’une intégration par proxy. Dans l’intégration de proxy HTTP, API Gateway transmet au backend la requête de méthode envoyée par le client sans intervention d’API Gateway.

**Pour créer une méthode `ANY`**

1. Choisissez la ressource **/\$1proxy\$1\$1**.

1. Choisissez la méthode **ANY**.

1. Sous le symbole d’avertissement, choisissez **Modifier l’intégration**. Vous ne pouvez pas déployer une API dotée d’une méthode sans intégration.

1. Pour **Type d’intégration**, sélectionnez **HTTP**.

1. Activez **Intégration de proxy HTTP**.

1. Pour **Méthode HTTP**, sélectionnez **ANY**.

1. Pour **URL du point de terminaison**, saisissez **http://petstore-demo-endpoint.execute-api.com/\$1proxy\$1**.

1. Choisissez **Enregistrer**.

## Test d’une API avec l’intégration de proxy HTTP
<a name="api-gateway-create-api-as-simple-proxy-for-http-test"></a>

 Indique si la réussite d’une demande client particulière dépend de ce qui suit : 
+  Si le serveur principal a rendu disponible le point de terminaison du serveur principal correspondant et, si tel est le cas, a accordé les autorisations d’accès requises. 
+ Si le client fournit la bonne entrée.

Par exemple, l' PetStore API utilisée ici n'expose pas la `/petstore` ressource. À ce titre, vous obtenez une réponse `404 Resource Not Found` contenant le message d’erreur `Cannot GET /petstore`. 

De plus, le client doit être en mesure de gérer le format de sortie du serveur principal afin de pouvoir analyser le résultat correctement. API Gateway n’intervient pas pour faciliter les interactions entre le client et le backend. 

**Pour tester une API intégrée au PetStore site Web à l'aide de l'intégration d'un proxy HTTP via la ressource proxy**

1. Sélectionnez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Type de méthode**, sélectionnez `GET`.

1. Pour **Chemin**, sous **proxy**, saisissez **petstore/pets**.

1. Pour **Chaînes de requête**, saisissez **type=fish**.

1. Sélectionnez **Tester)**.

     
![\[Utilisez la fonctionnalité de test pour tester une méthode.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-simple-proxy-petstore-call-proxy-resource-new-console.png)

   Comme le site web du serveur principal prend en charge la demande `GET /petstore/pets?type=fish`, il renvoie une réponse positive similaire à ce qui suit :

   ```
   [
     {
       "id": 1,
       "type": "fish",
       "price": 249.99
     },
     {
       "id": 2,
       "type": "fish",
       "price": 124.99
     },
     {
       "id": 3,
       "type": "fish",
       "price": 0.99
     }
   ]
   ```

   Si vous essayez d’appeler `GET /petstore`, vous obtenez une réponse `404` avec le message d’erreur `Cannot GET /petstore`. Cela est dû au fait que le serveur principal ne prend pas en charge l’opération spécifiée. Si vous appelez`GET /petstore/pets/1`, vous obtenez une `200 OK` réponse avec la charge utile suivante, car la demande est prise en charge par le PetStore site Web.

   ```
   {
     "id": 1,
     "type": "dog",
     "price": 249.99
   }
   ```

Vous pouvez utiliser un navigateur pour tester votre API. Déployez votre API et associez-la à une étape pour créer l’URL d’invocation de votre API.

**Pour déployer votre API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **test**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

Les clients peuvent désormais appeler votre API. 

**Pour invoquer votre API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Dans le volet de navigation principal, choisissez **Étape**.

1. Sous **Détails de l’étape**, choisissez l’icône de copie pour copier l’URL d’invocation de votre API.

   Saisissez l’URL d’invocation de votre API dans un navigateur Web. 

   L’URL complète doit ressembler à `https://abcdef123.execute-api.us-east-2.amazonaws.com/test/petstore/pets?type=fish`. 

   Votre navigateur envoie une requête `GET` à l’API.

1. Le résultat doit être identique à celui renvoyé lorsque vous utilisez **Test** depuis la console API Gateway.

# Didacticiel : création d’une API REST avec une intégration HTTP sans proxy
<a name="api-gateway-create-api-step-by-step"></a>

 Dans ce didacticiel, vous créez une API à partir de zéro à l’aide de la console Amazon API Gateway. Vous pouvez envisager la console comme un studio de conception d’API et l’utiliser pour affiner les fonctions d’API, tester ses comportements, créer l’API et la déployer par étapes. 

**Topics**
+ [

## Création d’une API avec l’intégration HTTP personnalisée
](#api-gateway-create-resource-and-methods)
+ [

## (Facultatif) Mapper les paramètres de requête.
](#api-gateway-create-resources-and-methods-next-steps)

## Création d’une API avec l’intégration HTTP personnalisée
<a name="api-gateway-create-resource-and-methods"></a>

 Cette section vous guide tout au long des procédures de création de ressources, d’exposition de méthodes sur une ressource, de configuration d’une méthode pour obtenir les comportements d’API souhaités, et de test et de déploiement de l’API.

Au cours de cette étape, vous créez une API vide. Dans les étapes suivantes, vous allez créer des ressources et des méthodes pour connecter votre API au point de terminaison `http://petstore-demo-endpoint.execute-api.com/petstore/pets`, à l’aide d’une intégration HTTP autre que de proxy. 

**Pour créer une API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1.  Sous **API name (Nom de l’API)**, saisissez **HTTPNonProxyAPI**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Laissez **Type de point de terminaison d’API** défini sur **Régional**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API** (Créer une API).

L’arborescence **Resources** affiche la ressource racine (`/`) sans aucune méthode. Dans cet exercice, nous allons créer l'API avec l'intégration HTTP personnalisée du PetStore site Web (http ://petstore-demo-endpoint.execute-api). com/petstore/pets.) À des fins d'illustration, nous allons créer une `/pets` ressource en tant qu'enfant de la racine et exposer une méthode GET sur cette ressource afin qu'un client puisse récupérer une liste des articles Pets disponibles sur le PetStore site Web.

**Pour créer une ressource /pets**

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

1. Maintenez **Ressource proxy** désactivée.

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **pets**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

Dans cette étape, vous créez une méthode `GET` pour la ressource **/pets**. La méthode `GET` est intégrée avec le site web `http://petstore-demo-endpoint.execute-api.com/petstore/pets`. Les autres options disponibles pour une méthode d’API sont les suivantes :
+ **POST**, principalement utilisée pour créer des ressources enfants.
+ **PUT**, principalement utilisée pour mettre à jour les ressources existantes (et, bien que ce ne soit pas recommandé, peut être utilisée pour créer des ressources enfants).
+ **DELETE**, utilisée pour supprimer des ressources.
+ **PATCH**, utilisée pour mettre à jour les ressources.
+ **HEAD**, principalement utilisée dans les scénarios de test. Cette option est comparable à GET, mais ne renvoie pas la représentation de la ressource.
+ **OPTIONS**, qui peut être utilisée par les appelants pour obtenir des informations sur les options de communication disponibles pour le service cible.

 Dans la liste **HTTP method**, vous devez choisir pour la demande d’intégration une méthode HTTP prise en charge par le backend. Pour `HTTP` ou `Mock integration`, il est logique que la demande de méthode et la demande d’intégration utilisent le même verbe HTTP. Pour les autres types d’intégration, la demande de méthode utilisera probablement un autre verbe HTTP que la demande d’intégration. Par exemple, pour appeler une fonction Lambda, la demande d’intégration doit utiliser `POST` pour appeler la fonction, tandis que la demande de méthode peut utiliser n’importe quel verbe HTTP en fonction de la logique de la fonction Lambda. 

**Pour créer une méthode `GET` dans la ressource **/pets****

1. Sélectionnez la ressource **/pets**.

1. Choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Intégration HTTP**.

1. Maintenez **Intégration de proxy HTTP** désactivée.

1. Pour **Méthode HTTP**, sélectionnez **GET**.

1. Pour **URL du point de terminaison**, saisissez **http://petstore-demo-endpoint.execute-api.com/petstore/pets**.

   Le PetStore site Web vous permet de récupérer une liste d'`Pet`articles par type d'animal de compagnie, comme « chien » ou « chat », sur une page donnée.

1. Pour **Gestion de contenu**, sélectionnez **Transmettre**.

1. Choisissez **Paramètres de chaîne de requête d’URL**.

   Le PetStore site Web utilise les paramètres de chaîne de `page` requête `type` et pour accepter une entrée. Vous devez ajouter les paramètres de chaîne de requête à la demande de méthode et les mapper aux paramètres de chaîne de requête de la demande d’intégration. 

1. Pour ajouter les paramètres de chaîne de requête, procédez comme suit :

   1. Sélectionnez **Add query string** (Ajouter une chaîne de requêtes).

   1. Pour **Nom**, saisissez **type**

   1. Gardez **Obligatoire** et **Mise en cache** désactivés.

   Répétez les étapes précédentes pour créer une chaîne de requête supplémentaire avec le nom **page**.

1. Choisissez **Créer une méthode**.

Le client peut désormais fournir un type d’animal et un numéro de page comme paramètres de chaîne de requête lorsqu’il envoie une demande. Ces paramètres d'entrée doivent être mappés dans les paramètres de chaîne de requête de l'intégration pour transmettre les valeurs d'entrée à notre PetStore site Web dans le backend.

**Pour mapper les paramètres d’entrée à la requête d’intégration**

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**.

1. Choisissez **Paramètres de chaîne de requête d’URL**, puis procédez comme suit : 

   1. Choisissez **Ajouter un paramètre de chaîne de requête d’URL**.

   1. Pour **Nom**, saisissez **type**.

   1. Pour **Mappage à partir de**, saisissez **method.request.querystring.type**.

   1. Maintenez **Mise en cache** désactivée. 

   1. Choisissez **Ajouter un paramètre de chaîne de requête d’URL**.

   1. Pour **Nom**, saisissez **page**.

   1. Pour **Mappage à partir de**, saisissez **method.request.querystring.page**.

   1. Maintenez **Mise en cache** désactivée. 

1. Choisissez **Enregistrer**.

**Pour tester l’API**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Chaînes de requête**, saisissez **type=Dog&page=2**.

1. Sélectionnez **Tester)**.

    Le résultat est similaire à ce qui suit :

      
![\[Résultat du test d’appel de la méthode GET sur Pets\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-create-api-step-by-step-test-invoke-get-on-pets-result-new-console.png)

    Maintenant que le test est réussi, nous pouvons déployer l’API pour la rendre disponible publiquement. 

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **Prod**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

1.  (Facultatif) Sous **Détails de l’étape**, pour **Invoquer une URL**, vous pouvez choisir l’icône de copie pour copier l’URL d’invocation de votre API. Vous pouvez l’utiliser avec des outils tels que [Postman](https://www.postman.com) et [cURL](https://curl.se/) pour tester votre API.

 Si vous utilisez un kit SDK pour créer un client, vous pouvez appeler les méthodes exposées par ce kit SDK pour signer la demande. Pour en savoir plus sur la mise en œuvre, consultez le [kit AWS SDK](https://aws.amazon.com/developer/tools/) de votre choix. 

**Note**  
 Lorsque des modifications sont apportées à votre API, vous devez la redéployer pour rendre les nouvelles fonctions ou celles mises à jour disponibles avant d’appeler à nouveau l’URL de demande. 

## (Facultatif) Mapper les paramètres de requête.
<a name="api-gateway-create-resources-and-methods-next-steps"></a>

### Paramètres de demande de mappage pour une API API Gateway
<a name="getting-started-mappings"></a>

 Ce didacticiel montre comment créer un paramètre de chemin de `{petId}` sur la demande de méthode de l’API pour spécifier un ID d’élément, mapper celui-ci au paramètre de chemin `{id}` dans l’URL de la demande d’intégration, et envoyer la demande au point de terminaison HTTP.

**Note**  
 La saisie d’une lettre majuscule (ou vice versa) peut entraîner des erreurs ultérieurement dans la procédure. 

#### Étape 1 : créer des ressources
<a name="getting-started-mappings-add-resources"></a>

Au cours de cette étape, vous créez une ressource avec un paramètre de chemin \$1petId\$1.

**Pour créer la ressource \$1petId\$1**

1. Sélectionnez la ressource **/pets**, puis choisissez **Créer une ressource**.

1. Maintenez **Ressource proxy** désactivée.

1. Pour **Chemin de ressource**, sélectionnez **/pets/**.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1petId\$1**.

    Encadrez `petId` par des accolades (`{ }`) pour afficher **/pets/\$1petId\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

#### Étape 2 : créer et tester les méthodes
<a name="getting-started-mappings-set-methods"></a>

 Au cours de cette étape, vous créez une méthode `GET` avec un paramètre de chemin `{petId}`. 

**Pour configurer la méthode GET**

1. Sélectionnez la ressource **/\$1petId\$1**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Intégration HTTP**.

1. Maintenez **Intégration de proxy HTTP** désactivée.

1. Pour **Méthode HTTP**, sélectionnez **GET**.

1. Pour **URL du point de terminaison**, saisissez **http://petstore-demo-endpoint.execute-api.com/petstore/pets/\$1id\$1**

1. Pour **Gestion de contenu**, sélectionnez **Transmettre**.

1. Maintenez **Délai d’expiration par défaut** activé. 

1. Choisissez **Créer une méthode**.

Vous devez maintenant mapper le paramètre de chemin `{petId}`que vous venez de créer au paramètre de chemin `{id}` dans l’URL du point de terminaison HTTP de la demande d’intégration. L’URL du point de terminaison HTTP était **http://petstore-demo-endpoint.execute-api.com/petstore/pets/\$1id\$1**.

**Pour mapper le paramètre de chemin `{petId}`**

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**.

1. Choisissez **Paramètres de chemin d’URL**.

1.  API Gateway crée un paramètre de chemin pour la demande d’intégration nommée **petId**, mais il n’est pas valide pour l’URL du point de terminaison HTTP que vous avez défini comme intégration backend. Le point de terminaison HTTP utilise `{id}` comme paramètre de chemin. Pour **Nom**, supprimez delete **petId** et saisissez **id**.

   Cela mappe le paramètre de chemin `petId` de la demande de méthode au paramètre de chemin `id` de la demande d’intégration.

1. Choisissez **Enregistrer**.

Maintenant, testez la méthode.

**Pour tester la méthode **

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Sous **Chemin** pour **petId**, entrez **4**.

1. Sélectionnez **Test**.

   Si le test aboutit, **Corps de la réponse** affiche les informations suivantes :

   ```
   {
     "id": 4,
     "type": "bird",
     "price": 999.99
   }
   ```

#### Étape 3 : déployer l’API
<a name="getting-started-mappings-deploy"></a>

Dans cette étape, vous allez déployer l’API afin de pouvoir commencer à l’appeler en dehors de la console API Gateway.

**Pour déployer l'API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Prod.**

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Deploy (Déployer)**.

#### Étape 4 : tester l’API
<a name="getting-started-mappings-test"></a>

Dans cette étape, vous allez sortir de la console API Gateway et utiliser votre API pour accéder au point de terminaison HTTP.

1. Dans le volet de navigation principal, choisissez **Étape**.

1. Sous **Détails de l’étape**, choisissez l’icône de copie pour copier l’URL d’invocation de votre API.

   Elle doit se présenter comme suit :

   ```
   https://my-api-id.execute-api.region-id.amazonaws.com/prod
   ```

1. Entrez cette URL dans la zone d’adresse d’un nouvel onglet du navigateur et ajoutez `/pets/4` à l’URL avant d’envoyer votre requête.

1. Le navigateur retourne ce qui suit :

   ```
   {
     "id": 4,
     "type": "bird",
     "price": 999.99
   }
   ```

#### Étapes suivantes
<a name="api-gateway-create-resources-and-methods-next-steps"></a>

Vous pouvez personnaliser davantage votre API en activant la validation des requêtes, en transformant les données ou en créant des réponses de passerelle client. 

Pour découvrir d’autres moyens de personnaliser votre API, consultez les didacticiels suivants :
+ Pour plus d’informations sur la validation de demande, consultez [Configuration de la validation de demande de base dans API Gateway](api-gateway-request-validation-set-up.md).
+ Pour plus d’informations sur la transformation des charges utiles de requête et de réponse, consultez [Tutoriel : Modifier la demande et la réponse d'intégration pour les intégrations aux services AWS](set-up-data-transformations-in-api-gateway.md).
+ Pour plus d’informations sur la création d’une passerelle client, consultez [Configurer une réponse de passerelle pour une API REST à l’aide de la console API Gateway](set-up-gateway-response-using-the-console.md).

# Didacticiel : création d’une API REST avec une intégration privée
<a name="getting-started-with-private-integration"></a>

Dans ce didacticiel, vous allez créer une API REST qui se connecte à un service Amazon ECS qui s'exécute dans un Amazon VPC. Les clients en dehors de votre VPC Amazon peuvent utiliser l’API pour accéder à votre service Amazon ECS. 

Ce didacticiel vous prendra environ 1 heure. Tout d'abord, vous utilisez un CloudFormation modèle pour créer un service Amazon VPC et Amazon ECS. Vous utilisez ensuite la console API Gateway pour créer un lien VPC V2. Le lien VPC permet à API Gateway d’accéder à l’service Amazon ECS qui s’exécute dans votre VPC Amazon. Ensuite, vous créez une API REST qui utilise le lien VPC V2 pour se connecter à votre service Amazon ECS. Enfin, vous testez votre API.

Lorsque vous appelez votre API REST, API Gateway achemine la demande vers votre service Amazon ECS via votre lien VPC V2, puis renvoie la réponse du service.

**Note**  
Ce didacticiel était auparavant pris en charge pour HTTP APIs, et il est désormais pris en charge pour REST à APIs l'aide du lien VPC V2.

![\[Vue d’ensemble de l’API REST que vous créez dans ce didacticiel.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/private-integration-rest.png)


Pour suivre ce didacticiel, vous avez besoin d'un AWS compte et d'un Gestion des identités et des accès AWS utilisateur disposant d'un accès à la console. Pour de plus amples informations, veuillez consulter [Configuration d’API Gateway avant son utilisation](setting-up.md).

**Topics**
+ [

## Étape 1 : créer un service Amazon ECS
](#rest-api-private-integration-create-ecs-service)
+ [

## Étape 2 : créer un lien VPC
](#http-api-private-integration-vpc-link)
+ [

## Étape 3 : Création d'une API REST
](#http-api-private-integration-create-api)
+ [

## Étape 4 : Testez votre API
](#rest-api-private-integration-test-api)
+ [

## Étape 5 : déploiement de votre API
](#rest-api-private-integration-deploy-api)
+ [

## Étape 6 : appelez votre API
](#rest-api-private-integration-call)
+ [

## Étape 7 : nettoyer
](#rest-api-private-integration-cleanup)

## Étape 1 : créer un service Amazon ECS
<a name="rest-api-private-integration-create-ecs-service"></a>

Amazon ECS est un service de gestion de conteneurs qui facilite l’exécution, l’arrêt et la gestion des conteneurs Docker sur un cluster. Dans ce didacticiel, vous exécuterez votre cluster sur une infrastructure sans serveur gérée par Amazon ECS.

Téléchargez et décompressez [ce CloudFormation modèle](samples/rest-private-integration-tutorial.zip), qui crée toutes les dépendances du service, y compris un Amazon VPC. Vous utilisez le modèle pour créer un service Amazon ECS qui utilise un Application Load Balancer.

**Pour créer une CloudFormation pile**

1. Ouvrez la CloudFormation console à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Choisissez **Créer une pile**, puis choisissez **Avec de nouvelles ressources (standard).**

1. Dans **Spécifier le modèle**, choisissez **Charger un modèle de fichier**.

1. Sélectionnez le modèle que vous avez téléchargé.

1. Choisissez **Suivant**. 

1. Pour **Nom de la pile**, saisissez **rest-api-private-integrations-tutorial**, puis choisissez **Suivant**.

1. Pour **Configurer les options de pile**, choisissez **Suivant**.

1. Pour les **fonctionnalités**, reconnaissez que CloudFormation vous pouvez créer des ressources IAM dans votre compte.

1. Choisissez **Suivant**, puis **Soumettre**.

CloudFormation fournit le service ECS, ce qui peut prendre quelques minutes. Lorsque le statut de votre CloudFormation pile est **CREATE\$1COMPLETE**, vous êtes prêt à passer à l'étape suivante.

## Étape 2 : créer un lien VPC
<a name="http-api-private-integration-vpc-link"></a>

Un lien VPC permet à API Gateway d’accéder aux ressources privées dans un VPC Amazon. Vous utilisez un lien VPC pour permettre aux clients d'accéder à votre service Amazon ECS via votre API REST.

**Pour créer un lien VPC**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Dans le panneau de navigation principal, choisissez **Liens VPC**, puis **Créer**.

   Vous devrez peut-être sélectionner l’icône Menu pour ouvrir le volet de navigation principal.

1. Pour **Choisir une version de liaison VPC, sélectionnez VPC link** **V2**.

1. Pour **Nom**, saisissez **private-integrations-tutorial**.

1. Pour **VPC**, choisissez le VPC que vous avez créé à l’étape 1. Son nom doit commencer par **RestApiStack**.

1. Pour **Sous-réseaux**, sélectionnez les deux sous-réseaux privés de votre VPC. Leurs noms finissent par `PrivateSubnet`.

1. Pour **Groupes de sécurité**, sélectionnez l’ID de groupe commençant par `private-integrations-tutorial` et contenant la description `RestApiStack/RestApiTutorialService/Service/SecurityGroup`.

1. Choisissez **Créer**.

Une fois que vous avez créé votre lien VPC V2, API Gateway fournit des interfaces réseau élastiques pour accéder à votre VPC. Ce processus peut prendre quelques minutes. En attendant, vous pouvez créer votre API.

## Étape 3 : Création d'une API REST
<a name="http-api-private-integration-create-api"></a>

L'API REST fournit un point de terminaison HTTP pour votre service Amazon ECS.



**Pour créer une API REST**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez **Créer une API**, puis pour **API REST**, choisissez **Créer**.

1. Pour **Nom**, saisissez **private-integration-api**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API** (Créer une API).

   Après avoir créé votre API, vous créez une méthode.

1. Choisissez **Créer une méthode** puis procédez comme suit :

   1. Pour **Type de méthode**, sélectionnez `GET`.

   1. Pour **Type d’intégration**, sélectionnez **Lien VPC**.

   1. Activez **Intégration de proxy VPC**.

   1. Pour **Méthode HTTP**, sélectionnez `GET`.

   1. Pour le lien **VPC, choisissez le lien** VPC V2 que vous avez créé à l'étape précédente.

   1. Pour la **cible d'intégration**, entrez l'équilibreur de charge que vous avez créé avec le CloudFormation modèle à l'étape 1. Son nom doit commencer par **rest-**.

   1. Pour **URL du point de terminaison**, saisissez `http://private-integrations-tutorial.com`.

      L'URL est utilisée pour définir l'`Host`en-tête de la demande d'intégration. Dans ce cas, l'en-tête de l'hôte est**private-integrations-tutorial**.

   1. Choisissez **Créer une méthode**.

      Grâce à l'intégration du proxy, l'API est prête à être testée.

## Étape 4 : Testez votre API
<a name="rest-api-private-integration-test-api"></a>

Ensuite, vous testez l'appel de la méthode API.

**Pour tester votre API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Choisissez le **test**

   Vérifiez que la réponse de votre API est un message de bienvenue qui vous indique que votre application est en cours d’exécution sur Amazon ECS.

## Étape 5 : déploiement de votre API
<a name="rest-api-private-integration-deploy-api"></a>

Ensuite, vous déployez votre API.

**Pour déployer votre API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **Prod**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

## Étape 6 : appelez votre API
<a name="rest-api-private-integration-call"></a>

Une fois votre API déployée, vous pouvez l'appeler.

**Pour appeler votre API**

1. Entrez cette URL d’invocation dans un navigateur Web.

   L’URL complète doit ressembler à `https://abcd123.execute-api.us-east-2.amazonaws.com/Prod`. 

   Votre navigateur envoie une requête `GET` à l’API.

1. Vérifiez que la réponse de votre API est un message de bienvenue qui vous indique que votre application est en cours d’exécution sur Amazon ECS.

   Si le message de bienvenue s'affiche, vous avez créé avec succès un service Amazon ECS qui s'exécute dans un Amazon VPC, et vous avez utilisé une API REST API Gateway avec un lien VPC V2 pour accéder au service Amazon ECS.

## Étape 7 : nettoyer
<a name="rest-api-private-integration-cleanup"></a>

Pour éviter des coûts inutiles, supprimez les ressources que vous avez créées dans le cadre de ce didacticiel. Les étapes suivantes suppriment votre lien VPC V2, votre CloudFormation stack et votre API REST.

**Pour supprimer une API REST**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Sur la **APIs**page, sélectionnez une API. Choisissez **Actions**, choisissez **Supprimer**, puis confirmez votre choix.

**Pour supprimer un lien VPC**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez **Lien VPC**.

1. Sélectionnez votre lien VPC, choisissez **Supprimer**, puis confirmez votre choix.

**Pour supprimer une CloudFormation pile**

1. Ouvrez la CloudFormation console à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Sélectionnez votre CloudFormation pile.

1. Choisissez **Supprimer**, puis confirmez votre choix.

# Tutoriel : Création d'une API REST avec une AWS intégration
<a name="getting-started-aws-proxy"></a>

 Les deux rubriques [Didacticiel : création d’une API REST avec une intégration de proxy Lambda](api-gateway-create-api-as-simple-proxy-for-lambda.md) et [Didacticiel : création d’une API REST avec une intégration Lambda sans proxy](getting-started-lambda-non-proxy-integration.md) décrivent comment créer une API Gateway pour exposer la fonction intégrée Lambda. En outre, vous pouvez créer une API API Gateway pour exposer d'autres AWS services, tels qu'Amazon SNS, Amazon S3, Amazon Kinesis, etc. AWS Lambda Ceci est rendu possible par l’intégration `AWS`. L’intégration Lambda ou l’intégration proxy Lambda est un cas particulier, où l’invocation de la fonction Lambda est exposée via l’API Gateway. 

 Tous les AWS services de support sont dédiés APIs à exposer leurs fonctionnalités. Cependant, les protocoles d’application ou les interfaces de programmation sont susceptibles de différer d’un service à un autre. Une API API Gateway `AWS` intégrée présente l'avantage de fournir un protocole d'application cohérent permettant à votre client d'accéder à différents AWS services. 

 Dans cette procédure, nous avons créé une API pour exposer Amazon SNS. Pour d'autres exemples d'intégration d'une API à d'autres AWS services, consultez[Didacticiels et ateliers Amazon API Gateway](api-gateway-tutorials.md). 

 Contrairement à l’intégration de proxy Lambda, il n’y a pas d’intégration de proxy correspondante pour d’autres services AWS . Ainsi, une méthode d'API est intégrée à une seule AWS action. Pour plus de flexibilité, vous pouvez configurer une intégration de proxy Lambda, similaire à l’intégration de proxy. La fonction Lambda analyse et traite ensuite les demandes d'autres actions. AWS 

 API Gateway ne fait pas une nouvelle tentative lorsque le délai est dépassé pour le point de terminaison. L’appelant de l’API doit implémenter une logique de nouvelle tentative pour gérer les dépassements de délai du point de terminaison. 

 Cette procédure repose sur les instructions et les concepts décrits dans [Didacticiel : création d’une API REST avec une intégration Lambda sans proxy](getting-started-lambda-non-proxy-integration.md). Si vous n’avez pas encore effectué cette procédure, nous vous conseillons de le faire en premier. 



**Topics**
+ [

## Conditions préalables
](#getting-started-aws-proxy-prerequisites)
+ [

## Étape 1 : créer le rôle d'exécution du proxy de AWS service
](#getting-started-aws-proxy-add-roles)
+ [

## Étape 2 : créer la ressource
](#getting-started-aws-proxy-add-resources)
+ [

## Étape 3 : créer la méthode GET
](#getting-started-aws-proxy-add-methods)
+ [

## Étape 4 : spécifier les paramètres et tester la méthode
](#getting-started-aws-proxy-set-methods)
+ [

## Étape 5 : déployer l’API
](#getting-started-aws-proxy-deploy)
+ [

## Étape 6 : tester l’API
](#getting-started-aws-proxy-test)
+ [

## Étape 7 : nettoyer
](#getting-started-aws-proxy-clean-up)

## Conditions préalables
<a name="getting-started-aws-proxy-prerequisites"></a>

Avant de commencer cette procédure, exécutez les étapes suivantes :

1. Suivez les étapes de [Configuration d’API Gateway avant son utilisation](setting-up.md).

1.  Créez une nouvelle API nommée `MyDemoAPI`. Pour de plus amples informations, veuillez consulter [Didacticiel : création d’une API REST avec une intégration HTTP sans proxy](api-gateway-create-api-step-by-step.md). 

1. Déployez l’API au moins une fois dans une étape nommée `test`. Pour plus d’informations, consultez [Déployer l’API](getting-started-lambda-non-proxy-integration.md#getting-started-deploy-api) dans [Choisissez un didacticiel AWS Lambda d'intégration](getting-started-with-lambda-integration.md).

1. Suivez le reste des étapes dans [Choisissez un didacticiel AWS Lambda d'intégration](getting-started-with-lambda-integration.md).

1. Créez au moins une rubrique dans Amazon Simple Notification Service (Amazon SNS). Vous utiliserez l'API déployée pour obtenir une liste des sujets associés à votre AWS compte sur Amazon SNS. Pour apprendre à créer une rubrique dans Amazon SNS, consultez [Création d’une rubrique](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html). (Vous n’avez pas besoin de copier l’ARN de la rubrique mentionné à l’étape 5.)

## Étape 1 : créer le rôle d'exécution du proxy de AWS service
<a name="getting-started-aws-proxy-add-roles"></a>

 Pour autoriser l’API à invoquer les actions Amazon SNS requises, vous devez avoir attaché les politiques IAM appropriées à un rôle IAM. Au cours de cette étape, vous allez créer un rôle IAM.

**Pour créer le rôle d'exécution du proxy de AWS service**

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

1. Sélectionnez **Roles**.

1. Choisissez **Créer un rôle**.

1.  Choisissez le **AWS service** sous **Sélectionner le type d'entité de confiance**, puis sélectionnez **API Gateway** et sélectionnez **Allows API Gateway to push CloudWatch logs vers Logs**.

1.  Choisissez **Suivant**, puis **Suivant**.

1. Pour **Nom du rôle**, saisissez **APIGatewaySNSProxyPolicy**, puis choisissez **Créer un rôle**.

1. Dans la liste **Roles**, choisissez le rôle que vous venez de créer. Vous devrez peut-être faire défiler la page ou utiliser la barre de recherche pour rechercher le rôle.

1. Pour le rôle sélectionné, sélectionnez l’onglet **Ajouter des autorisations**.

1. Choisissez **Attacher des politiques** dans la liste déroulante.

1. Dans la barre de recherche, saisissez **AmazonSNSReadOnlyAccess** et choisissez **Ajouter des autorisations**. 
**Note**  
Ce didacticiel utilise une politique gérée pour plus de simplicité. Il est recommandé de créer votre propre politique IAM afin d’accorder les autorisations minimales requises. 

1. Notez l’**ARN du rôle** nouvellement créé. Vous l’utiliserez ultérieurement.

## Étape 2 : créer la ressource
<a name="getting-started-aws-proxy-add-resources"></a>

Au cours de cette étape, vous créez une ressource qui permet au proxy de AWS service d'interagir avec le AWS service.

**Pour créer la ressource**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Sélectionnez la racine de la ressource, **/**, représentée par une seule barre oblique (**/**), puis choisissez **Créer une ressource**.

1. Maintenez **Ressource proxy** désactivée.

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **mydemoawsproxy**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

## Étape 3 : créer la méthode GET
<a name="getting-started-aws-proxy-add-methods"></a>

Au cours de cette étape, vous créez une méthode GET qui permet au proxy de AWS service d'interagir avec le AWS service.

**Pour créer la méthode `GET`**

1. Sélectionnez la ressource **/mydemoawsproxy**, puis choisissez **Créer une méthode**.

1. Pour le type de méthode, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS**.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre rubrique Amazon SNS.

1. Pour **Service AWS**, sélectionnez **Amazon SNS**.

1. Laissez **Sous-domaine AWS ** vide.

1. Pour **Méthode HTTP**, sélectionnez **GET**.

1. Pour **Type d’action**, sélectionnez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **ListTopics**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de rôle pour **APIGatewaySNSProxyPolicy**.

1. Choisissez **Créer une méthode**.

## Étape 4 : spécifier les paramètres et tester la méthode
<a name="getting-started-aws-proxy-set-methods"></a>

Vous pouvez maintenant tester votre méthode `GET` pour vérifier qu’elle a été correctement configurée pour répertorier vos rubriques Amazon SNS.

**Pour tester la méthode `GET`**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Sélectionnez **Tester)**.

   Le résultat affiche une réponse semblable à ce qui suit :

   ```
   {
     "ListTopicsResponse": {
       "ListTopicsResult": {
         "NextToken": null,
         "Topics": [
           {
             "TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-1"
           },
           {
             "TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-2"
           },
           ...
           {
             "TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-N"
           }
         ]
       },
       "ResponseMetadata": {
         "RequestId": "abc1de23-45fa-6789-b0c1-d2e345fa6b78"
       }
     }
   }
   ```

## Étape 5 : déployer l’API
<a name="getting-started-aws-proxy-deploy"></a>

Dans cette étape, vous allez déployer l’API afin de pouvoir l’appeler en dehors de la console API Gateway.

**Pour déployer l’API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **test**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Deploy (Déployer)**.

## Étape 6 : tester l’API
<a name="getting-started-aws-proxy-test"></a>

Au cours de cette étape, vous sortez de la console API Gateway et vous utilisez votre proxy de AWS service pour interagir avec le service Amazon SNS.

1. Dans le volet de navigation principal, choisissez **Étape**.

1. Sous **Détails de l’étape**, choisissez l’icône de copie pour copier l’URL d’invocation de votre API.

   Elle doit ressembler à ce qui suit :

   ```
   https://my-api-id.execute-api.region-id.amazonaws.com/test
   ```

1. Collez l’URL dans la zone d’adresse d’un nouvel onglet du navigateur.

1. Ajoutez `/mydemoawsproxy` afin que l’URL ressemble à ce qui suit :

   ```
   https://my-api-id.execute-api.region-id.amazonaws.com/test/mydemoawsproxy
   ```

   Accédez à l’URL. Des informations similaires à celles qui suivent doivent s’afficher :

   ```
   {"ListTopicsResponse":{"ListTopicsResult":{"NextToken": null,"Topics":[{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-1"},{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-2"},...{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-N}]},"ResponseMetadata":{"RequestId":"abc1de23-45fa-6789-b0c1-d2e345fa6b78}}}
   ```

## Étape 7 : nettoyer
<a name="getting-started-aws-proxy-clean-up"></a>

Vous pouvez supprimer les ressources IAM dont le proxy de AWS service a besoin pour fonctionner.

**Avertissement**  
Si vous supprimez une ressource IAM sur laquelle repose un proxy de AWS service, ce proxy de AWS service et tous APIs ceux qui en dépendent ne fonctionneront plus. La suppression d’une ressource IAM ne peut pas être annulée. Si vous souhaitez réutiliser cette ressource IAM, vous devez la recréer.

**Pour supprimer les ressources IAM associées**

1. Ouvrez la console IAM à l’adresse [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Dans la zone **Details**, sélectionnez **Roles**.

1. Sélectionnez **APIGatewayAWSProxyExecRole**, puis **Role Actions (Actions du rôle)**, et **Delete Role (Supprimer le rôle)**. À l’invite, sélectionnez **Yes, Delete**.

1. Dans la zone **Details**, sélectionnez **Policies**.

1. Sélectionnez **APIGatewayAWSProxyExecPolicy**, puis choisissez **Policy Actions (Actions de stratégie)** et **Delete (Supprimer)**. À l’invite, sélectionnez **Delete (Supprimer)**.

 Vous avez terminé cette procédure. Pour des discussions plus détaillées sur la création d'une API en tant que proxy de AWS service[Didacticiel : création d’une API REST en tant que proxy Amazon S3](integrating-api-with-aws-services-s3.md), consultez[Tutoriel : Création d'une API REST de calculatrice avec deux intégrations AWS de services et une intégration Lambda sans proxy](integrating-api-with-aws-services-lambda.md), ou[Didacticiel : création d’une API REST en tant que proxy Amazon Kinesis](integrating-api-with-aws-services-kinesis.md). 

# Tutoriel : Création d'une API REST de calculatrice avec deux intégrations AWS de services et une intégration Lambda sans proxy
<a name="integrating-api-with-aws-services-lambda"></a>

Le [Didacticiel : création d’une API REST avec une intégration Lambda sans proxy](getting-started-lambda-non-proxy-integration.md) utilise exclusivement l’intégration `Lambda Function`. L’intégration `Lambda Function` est un cas particulier du type d’intégration `AWS Service` qui effectue une grande partie de la configuration de l’intégration pour vous, comme l’ajout automatique des autorisations basées sur les ressources requises pour invoquer la fonction Lambda. Ici, deux des trois intégrations utilisent l’intégration `AWS Service`. Ce type d’intégration offre davantage de contrôle, mais vous devez exécuter manuellement les tâches telles que la création et la spécification d’un rôle IAM contenant les autorisations appropriées.



Dans ce didacticiel, vous allez créer une fonction Lambda `Calc` pour implémenter les opérations arithmétiques de base, en acceptant et en renvoyant des données d’entrée et de sortie au format JSON. Ensuite, vous allez créer une API REST et l’intégrer avec la fonction Lambda de différentes manières :

1. En exposant une méthode `GET` sur la ressource `/calc` pour appeler la fonction Lambda, en fournissant l’entrée en tant que paramètres de chaîne de requête. (Intégration `AWS Service`)

1. En exposant une méthode `POST` sur la ressource `/calc` pour appeler la fonction Lambda, en fournissant l’entrée dans la charge utile de la demande de méthode. (Intégration `AWS Service`)

1. En exposant une méthode `GET` sur les ressources `/calc/{operand1}/{operand2}/{operator}` imbriquées pour appeler la fonction Lambda, en fournissant les données d’entrée en tant que paramètres de chemin. (Intégration `Lambda Function`)

Outre ce didacticiel, vous pouvez vous reporter au [fichier de définitions OpenAPI](api-as-lambda-proxy-export-swagger-with-extensions.md) pour l’API `Calc`, que vous pouvez importer dans API Gateway en suivant les instructions de [Développez REST APIs à l'aide d'OpenAPI dans API Gateway](api-gateway-import-api.md).

**Topics**
+ [

## Création d’un rôle IAM assumable
](#api-as-lambda-proxy-setup-iam-role-policies)
+ [

## Création d’une fonction Lambda `Calc`
](#api-as-lambda-proxy-create-lambda-function)
+ [

## Test de la fonction Lambda `Calc`
](#api-as-lambda-proxy-test-lambda-function-)
+ [

## Création d’une API `Calc`
](#api-as-lambda-proxy-create-api-resources)
+ [

## Intégration 1 : Création d’une méthode `GET` avec des paramètres de requête pour appeler la fonction Lambda
](#api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function)
+ [

## Intégration 2 : Création d’une méthode `POST` avec une charge utile JSON pour appeler la fonction Lambda
](#api-as-lambda-proxy-expose-post-method-with-json-body-to-call-lambda-function)
+ [

## Intégration 3 : Création d’une méthode `GET` avec des paramètres de chemin pour appeler la fonction Lambda
](#api-as-lambda-proxy-expose-get-method-with-path-parameters-to-call-lambda-function)
+ [

# Définitions OpenAPI de l’exemple d’API intégré avec une fonction Lambda
](api-as-lambda-proxy-export-swagger-with-extensions.md)

## Création d’un rôle IAM assumable
<a name="api-as-lambda-proxy-setup-iam-role-policies"></a>

Pour que votre API invoque votre fonction Lambda `Calc`, vous devez disposer d’un rôle IAM assumable API Gateway, qui est un rôle IAM ayant la relation de confiance suivante :

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

Le rôle que vous créez doit disposer de l'autorisation Lambda [InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html). Dans le cas contraire, l’appelant d’API recevra une réponse `500 Internal Server Error`. Pour accorder cette autorisation au rôle, vous devez lui attacher la politique IAM suivante :

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
```

------

Voici comment procéder :

**Création d’un rôle IAM assumable API Gateway**

1. Connectez-vous à la console IAM.

1. Sélectionnez **Roles**.

1. Choisissez **Create Role (Créer le rôle)**.

1. Sous **Sélectionner un type d’entité de confiance**, choisissez **AWS Service**.

1. Sous **Choose the service that will use this role (Choisir le service qui utilisera ce rôle)**, choisissez **Lambda**.

1. Sélectionnez **Next: Permissions (Suivant : autorisations)**.

1. Choisissez **Create Policy (Créer une politique)**.

   Une nouvelle fenêtre de console **Create Policy (Créer une politique)** s’ouvre. Dans cette fenêtre, procédez de la façon suivante :

   1. Dans l’onglet **JSON**, remplacez la politique existante par la suivante :

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "lambda:InvokeFunction",
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. Choisissez **Examiner une politique**.

   1. Sous **Review Policy (Examiner une politique)**, procédez comme suit :

      1. Pour **Nom**, tapez un nom, par exemple **lambda\$1execute**.

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

1. Dans la fenêtre de console d’origine **Create Role (Créer un rôle)**, procédez comme suit :

   1. Sous **Attach permissions policies (Attacher des politiques d’autorisations)**, choisissez votre politique **lambda\$1execute** dans la liste déroulante.

      Si votre politique n’est pas répertoriée dans la liste, cliquez sur le bouton d’actualisation en haut de la liste. (N’actualisez pas la page du navigateur.)

   1. Choisissez **Next:Tags (Suivant : balises)**.

   1. Choisissez **Next: Review (Suivant : vérifier)**.

   1. Sous **Role name (Nom du rôle)**, saisissez un nom tel que **lambda\$1invoke\$1function\$1assume\$1apigw\$1role**.

   1. Choisissez **Créer un rôle**.

1. Choisissez votre rôle **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** dans la liste.

1. Choisissez l’onglet **Trust relationships**.

1. Choisissez **Modifier la relation d’approbation**.

1. Remplacez la politique existante comme suit :

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "lambda.amazonaws.com",
             "apigateway.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. Choisissez **Update Trust Policy**.

1. Notez l’ARN du rôle que vous venez de créer. Vous en aurez besoin ultérieurement.

## Création d’une fonction Lambda `Calc`
<a name="api-as-lambda-proxy-create-lambda-function"></a>

Vous créerez ensuite une fonction Lambda à l’aide de la console Lambda.

1. Dans la console Lambda, choisissez **Create function (Créer une fonction)**.

1. Choisissez **Créer à partir de zéro**.

1. Pour **Nom**, saisissez **Calc**.

1. Pour **Exécution**, choisissez le dernier environnement d’exécution **Node.js** ou **Python** compatible.

1. Pour toutes les autres options, utilisez le paramètre par défaut.

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

1.  Copiez la fonction Lambda suivante dans votre environnement d’exécution préféré et collez-la dans l’éditeur de code de la console Lambda. 

------
#### [ Node.js ]

   ```
   export const handler = async function (event, context) {
     console.log("Received event:", JSON.stringify(event));
   
     if (
       event.a === undefined ||
       event.b === undefined ||
       event.op === undefined
     ) {
       return "400 Invalid Input";
     }
   
     const res = {};
     res.a = Number(event.a);
     res.b = Number(event.b);
     res.op = event.op;
     if (isNaN(event.a) || isNaN(event.b)) {
       return "400 Invalid Operand";
     }
     switch (event.op) {
       case "+":
       case "add":
         res.c = res.a + res.b;
         break;
       case "-":
       case "sub":
         res.c = res.a - res.b;
         break;
       case "*":
       case "mul":
         res.c = res.a * res.b;
         break;
       case "/":
       case "div":
         if (res.b == 0) {
           return "400 Divide by Zero";
         } else {
           res.c = res.a / res.b;
         }
         break;
       default:
         return "400 Invalid Operator";
     }
   
     return res;
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       try:
           (event['a']) and (event['b']) and (event['op'])
       except KeyError:
           return '400 Invalid Input'
   
       try:
           res = {
               "a": float(
                   event['a']), "b": float(
                   event['b']), "op": event['op']}
       except ValueError:
           return '400 Invalid Operand'
   
       if event['op'] == '+':
           res['c'] = res['a'] + res['b']
       elif event['op'] == '-':
           res['c'] = res['a'] - res['b']
       elif event['op'] == '*':
           res['c'] = res['a'] * res['b']
       elif event['op'] == '/':
           if res['b'] == 0:
               return '400 Divide by Zero'
           else:
               res['c'] = res['a'] / res['b']
       else:
           return '400 Invalid Operator'
   
       return res
   ```

------

1. Sous Execution role (Rôle d’exécution), choisissez **Choose an existing role (Choisir un rôle existant)**.

1. Entrez l’ARN du rôle **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** que vous avez créé précédemment.

1. Choisissez **Deploy (Déployer)**.

 Cette fonction nécessite deux opérandes (`a` et `b`) et un opérateur (`op`) à partir du paramètre d’entrée `event`. L’entrée est un objet JSON au format suivant : 

```
{
  "a": "Number" | "String",
  "b": "Number" | "String",
  "op": "String"
}
```

Cette fonction renvoie le résultat calculé (`c`) et les données d’entrée. En cas d’entrée non valide, la fonction renvoie la valeur null ou la chaîne « Opération non valide » en tant que résultat. La sortie est au format JSON suivant : 

```
{
  "a": "Number",
  "b": "Number",
  "op": "String",
  "c": "Number" | "String"
}
```

Vous devez tester la fonction dans la console Lambda avant de l’intégrer à l’API dans l’étape suivante. 

## Test de la fonction Lambda `Calc`
<a name="api-as-lambda-proxy-test-lambda-function-"></a>

Voici comment tester la fonction `Calc` dans la console Lambda :

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

1. Entrez **calc2plus5** comme nom de l’événement de test.

1. Remplacez la définition de l’événement de test par ce qui suit :

   ```
   {
     "a": "2",
     "b": "5",
     "op": "+"
   }
   ```

1. Choisissez **Save (Enregistrer)**.

1. Sélectionnez **Test (Tester)**.

1. Développez **Résultat de l’exécution : réussite**. Vous devez voir ce qui suit :

   ```
   {
     "a": 2,
     "b": 5,
     "op": "+",
     "c": 7
   }
   ```

## Création d’une API `Calc`
<a name="api-as-lambda-proxy-create-api-resources"></a>

La procédure suivante explique comment créer une API pour la fonction Lambda `Calc` que vous venez de créer. Dans les sections suivantes, vous allez y ajouter des ressources et des méthodes.

**Pour créer une API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1.  Sous **API name (Nom de l’API)**, saisissez **LambdaCalc**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Laissez **Type de point de terminaison d’API** défini sur **Régional**.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API (Créer une API)**.

## Intégration 1 : Création d’une méthode `GET` avec des paramètres de requête pour appeler la fonction Lambda
<a name="api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function"></a>

Lorsque vous créez une méthode `GET` qui transmet les paramètres de chaîne de requête à la fonction Lambda, vous permettez à l’API d’être appelée à partir d’un navigateur. Cette approche peut être utile, en particulier si APIs elle permet le libre accès.

Une fois que vous avez créé une API, vous créez une ressource. En règle générale, les ressources API sont organisées dans une arborescence des ressources selon la logique de l’application. Pour cette étape, vous créez une ressource **/calc.** 

**Pour créer une ressource **/calc****

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

1. Maintenez **Ressource proxy** désactivée. 

1. Conservez **Chemin de la ressource** sous la forme `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **calc**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

Lorsque vous créez une méthode `GET` qui transmet les paramètres de chaîne de requête à la fonction Lambda, vous permettez à l’API d’être appelée à partir d’un navigateur. Cette approche peut être utile, en particulier si APIs elle permet le libre accès.

Dans cette méthode, Lambda exige que la requête `POST` soit utilisée pour invoquer une fonction Lambda. Cet exemple montre que la méthode HTTP dans une demande de méthode de serveur frontal peut être différente de la demande d’intégration sur le backend.

**Pour créer une méthode `GET`**

1. Sélectionnez la ressource **/calc**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS**.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre fonction Lambda.

1. Pour **Service AWS**, sélectionnez **Lambda**.

1. Laissez **Sous-domaine AWS ** vide.

1. Pour **Méthode HTTP**, sélectionnez **POST**.

1. Pour **Type d’action**, sélectionnez **Utiliser un remplacement de chemin**. Cette option nous permet de spécifier l’ARN de l’action [Invoke (Appel)](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) pour exécuter notre fonction `Calc`. 

1. Pour **Remplacement de chemin**, saisissez **2015-03-31/functions/arn:aws:lambda:*us-east-2*:*account-id*:function:Calc/invocations**. Pour** *account-id***, entrez votre Compte AWS identifiant. Pour***us-east-2***, entrez l' Région AWS endroit où vous avez créé votre fonction Lambda. 

1. Pour **Rôle d’exécution**, saisissez l’ARN de rôle pour **lambda\$1invoke\$1function\$1assume\$1apigw\$1role**.

1. Ne modifiez pas les paramètres de **Cache d’informations d’identification** et de **Délai d’attente par défaut**.

1. Choisissez **Paramètres de requête de méthode**.

1. Pour **Validateur de requête**, sélectionnez **Valider les paramètres de chaîne de requête et les en-têtes**.

   Ce paramètre renvoie un message d’erreur si le client ne spécifie pas les paramètres requis.

1. Choisissez **Paramètres de chaîne de requête d’URL**.

   Maintenant, vous allez configurer les paramètres de chaîne de requête pour la méthode **GET** sur la ressource **/calc** de sorte qu’elle reçoive l’entrée au nom de la fonction Lambda du backend.

   Pour créer les paramètres de chaîne de requête, procédez comme suit :

   1. Sélectionnez **Add query string** (Ajouter une chaîne de requêtes).

   1. Pour **Nom**, saisissez **operand1**.

   1. Activez **Obligatoire**.

   1. Maintenez **Mise en cache** désactivée.

   Répétez les mêmes étapes et créez une chaîne de requête nommée **operand2** et une chaîne de requête nommée **operator**.

1. Choisissez **Créer une méthode**.

Maintenant, vous créez un modèle de mappage afin de convertir les chaînes de requête fournies par le client en la charge utile de requête d’intégration, comme requis par la fonction `Calc`. Ce modèle mappe les trois paramètres de chaîne de requête déclarés dans **Demande de méthode** aux valeurs de propriété désignées de l’objet JSON en tant que données d’entrée de la fonction Lambda du backend. L’objet JSON transformé sera inclus en tant que charge utile de la demande d’intégration. 

**Pour mapper les paramètres d’entrée à la requête d’intégration**

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**.

1. Pour **Transmission du corps de requête**, sélectionnez **Lorsqu’aucun modèle n’est défini (recommandé)**.

1. Choisissez **Modèles de mappage**.

1. Sélectionnez **Add mapping template**.

1. Pour **Type de contenu**, entrez **application/json**.

1. Pour **Corps du modèle**, entrez le code suivant :

   ```
   {
       "a":  "$input.params('operand1')",
       "b":  "$input.params('operand2')", 
       "op": "$input.params('operator')"   
   }
   ```

1. Choisissez **Enregistrer**.

Vous pouvez maintenant tester votre méthode `GET` pour vérifier qu’elle a été correctement configurée pour invoquer la fonction Lambda.

**Pour tester la méthode `GET`**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Chaînes de requête**, saisissez **operand1=2&operand2=3&operator=\$1**.

1. Sélectionnez **Test**.

   Les résultats doivent ressembler à ce qui suit :  
![\[Création d’une API dans API Gateway en tant que proxy Lambda\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_lambda_calc_get_method_test_new_console.png)

## Intégration 2 : Création d’une méthode `POST` avec une charge utile JSON pour appeler la fonction Lambda
<a name="api-as-lambda-proxy-expose-post-method-with-json-body-to-call-lambda-function"></a>

En créant une méthode `POST` avec une charge utile JSON pour appeler la fonction Lambda, vous faites en sorte que le client doive fournir les données d’entrée nécessaires à la fonction du backend dans le corps de la demande. Pour vous assurer que le client charge les données d’entrée correctes, vous allez activer la validation de demande sur la charge utile.

**Pour créer une méthode `POST` avec une charge utile JSON**

1. Sélectionnez la ressource **/calc**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **POST**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS**.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre fonction Lambda.

1. Pour **Service AWS**, sélectionnez **Lambda**.

1. Laissez **Sous-domaine AWS ** vide.

1. Pour **Méthode HTTP**, sélectionnez **POST**.

1. Pour **Type d’action**, sélectionnez **Utiliser un remplacement de chemin**. Cette option nous permet de spécifier l’ARN de l’action [Invoke (Appel)](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) pour exécuter notre fonction `Calc`. 

1. Pour **Remplacement de chemin**, saisissez **2015-03-31/functions/arn:aws:lambda:*us-east-2*:*account-id*:function:Calc/invocations**. Pour** *account-id***, entrez votre Compte AWS identifiant. Pour***us-east-2***, entrez l' Région AWS endroit où vous avez créé votre fonction Lambda. 

1. Pour **Rôle d’exécution**, saisissez l’ARN de rôle pour **lambda\$1invoke\$1function\$1assume\$1apigw\$1role**.

1. Ne modifiez pas les paramètres de **Cache d’informations d’identification** et de **Délai d’attente par défaut**.

1. Choisissez **Créer une méthode**.

Maintenant, vous créez un modèle d’**entrée** pour décrire la structure des données d’entrée et valider le corps de la requête entrante.

**Pour créer un modèle d’entrée**

1. Dans le volet de navigation principal, choisissez **Modèles**.

1. Sélectionnez **Créer un modèle**.

1. Pour **Nom**, saisissez **input**.

1. Pour **Type de contenu**, entrez **application/json**. 

   Si aucun type de contenu correspondant n’est trouvé, la validation de demande n’est pas effectuée. Pour utiliser le même modèle quel que soit le type de contenu, saisissez **\$1default**.

1. Pour **Schéma du modèle**, saisissez le modèle qui suit :

   ```
   {
       "type":"object",
       "properties":{
           "a":{"type":"number"},
           "b":{"type":"number"},
           "op":{"type":"string"}
       },
       "title":"input"
   }
   ```

1. Sélectionnez **Créer un modèle**.

Vous créez maintenant un modèle de **sortie**. Ce modèle décrit la structure de données de la sortie calculée à partir du serveur principal. Elle peut être utilisée pour mapper les données de réponse d’intégration à un autre modèle. Ce didacticiel s’appuie sur le comportement de transmission et n’utilise pas ce modèle.

**Pour créer un modèle de sortie**

1. Sélectionnez **Créer un modèle**.

1. Pour **Nom**, saisissez **output**.

1. Pour **Type de contenu**, entrez **application/json**. 

   Si aucun type de contenu correspondant n’est trouvé, la validation de demande n’est pas effectuée. Pour utiliser le même modèle quel que soit le type de contenu, saisissez **\$1default**.

1. Pour **Schéma du modèle**, saisissez le modèle qui suit :

   ```
   {
       "type":"object",
       "properties":{
           "c":{"type":"number"}
       },
       "title":"output"
   }
   ```

1. Sélectionnez **Créer un modèle**.

Vous créez maintenant un modèle de **résultat**. Ce modèle décrit la structure de données des données de réponse renvoyées. Il fait référence aux schémas d’**entrée** et de **sortie** définis dans votre API.

**Pour créer un modèle de résultat**

1. Sélectionnez **Créer un modèle**.

1. Pour **Nom**, saisissez **result**.

1. Pour **Type de contenu**, entrez **application/json**. 

   Si aucun type de contenu correspondant n’est trouvé, la validation de demande n’est pas effectuée. Pour utiliser le même modèle quel que soit le type de contenu, saisissez **\$1default**.

1. Pour **Schéma du modèle**, entrez le modèle suivant avec votre*restapi-id*. Votre *restapi-id* nom est répertorié entre parenthèses en haut de la console dans le flux suivant : `API Gateway > APIs > LambdaCalc (abc123).`

   ```
   {
       "type":"object",
       "properties":{
           "input":{
               "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/input"
           },
           "output":{
               "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/output"
           }
       },
       "title":"result"
   }
   ```

1. Sélectionnez **Créer un modèle**.

Vous configurez maintenant la demande de méthode de votre méthode POST pour activer la validation de la demande sur le corps de requête entrante.

**Pour activer la validation de la demande sur la méthode POST**

1. Dans le volet de navigation principal, choisissez **Ressources**, puis sélectionnez la méthode `POST` dans l’arborescence de ressources.

1. Dans l’onglet **Demande de méthode**, sous **Paramètres de requête de méthode**, choisissez **Modifier**.

1. Pour **Validateur de requête**, sélectionnez **Valider le corps**.

1. Choisissez **Corps de la requête**, puis choisissez **Ajouter un modèle**.

1. Pour **Type de contenu**, entrez **application/json**.

   Si aucun type de contenu correspondant n’est trouvé, la validation de demande n’est pas effectuée. Pour utiliser le même modèle quel que soit le type de contenu, saisissez **\$1default**.

1. Pour **Modèle**, sélectionnez **entrée**.

1. Choisissez **Enregistrer**.

Vous pouvez maintenant tester votre méthode `POST` pour vérifier qu’elle a été correctement configurée pour invoquer la fonction Lambda.

**Pour tester la méthode `POST`**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Corps de la requête**, entrez la charge utile de JSON suivante.

   ```
   {
       "a": 1,
       "b": 2,
       "op": "+"
   }
   ```

1. Sélectionnez **Tester)**.

   Vous devriez voir la sortie suivante :

   ```
   {
     "a": 1,
     "b": 2,
     "op": "+",
     "c": 3
   }
   ```

## Intégration 3 : Création d’une méthode `GET` avec des paramètres de chemin pour appeler la fonction Lambda
<a name="api-as-lambda-proxy-expose-get-method-with-path-parameters-to-call-lambda-function"></a>

Vous allez maintenant créer une méthode `GET` sur une ressource spécifiée par une séquence de paramètres de chemin pour appeler la fonction Lambda du backend. Les valeurs de paramètre de chemin spécifient les données d’entrée de la fonction Lambda. Vous allez utiliser un modèle de mappage afin de mapper les valeurs de paramètres de chemin entrantes à la charge utile de demande d’intégration requise.

La structure de ressource d’API qui en résulte ressemble à ce qui suit :

![\[Création d’une API dans API Gateway en tant que proxy Lambda\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_lambda_create_api_resources_new_console.png)


**Pour créer une ressource **/\$1operand1\$1/\$1operand2\$1/\$1operator\$1****

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

1. Pour **Chemin de ressource**, sélectionnez `/calc`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1operand1\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

1. Pour **Chemin de ressource**, sélectionnez `/calc/{operand1}/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1operand2\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

1. Pour **Chemin de ressource**, sélectionnez `/calc/{operand1}/{operand2}/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1operator\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

Cette fois, vous allez utiliser l’intégration Lambda intégrée dans la console API Gateway afin de configurer l’intégration de la méthode.

**Pour configurer une intégration de méthode**

1. Sélectionnez la ressource**/\$1operand1\$1/\$1operand2\$1/\$1operator\$1**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Lambda**.

1. Maintenez **Intégration proxy Lambda** désactivée.

1. Pour la **fonction Lambda**, sélectionnez l' Région AWS endroit où vous avez créé votre fonction Lambda et entrez. **Calc**

1. Maintenez **Délai d’expiration par défaut** activé.

1. Choisissez **Créer une méthode**.

Vous créez maintenant un modèle de mappage pour mapper les trois paramètres de chemin d’URL, déclarés lors de la création de la ressource **/calc/\$1operand1\$1/\$1operand2\$1/\$1operator\$1**, aux valeurs de propriété désignées de l’objet JSON. Étant donné que les chemins d’URL doivent être codés en URL, l’opérateur de division doit être spécifié sous la forme `%2F` au lieu de `/`. Ce modèle convertit `%2F` en `'/'` avant de le transmettre à la fonction Lambda. 

**Pour créer un modèle de mappage**

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**.

1. Pour **Transmission du corps de requête**, sélectionnez **Lorsqu’aucun modèle n’est défini (recommandé)**.

1. Choisissez **Modèles de mappage**.

1. Pour **Type de contenu**, entrez **application/json**.

1. Pour **Corps du modèle**, entrez le code suivant :

   ```
   {
      "a": "$input.params('operand1')",
      "b": "$input.params('operand2')",
      "op": #if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end
   }
   ```

1. Choisissez **Enregistrer**.

Vous pouvez maintenant tester votre méthode `GET` pour vérifier qu’elle a été correctement configurée pour invoquer la fonction Lambda et transmettre le résultat d’origine via la réponse d’intégration sans mappage. 

**Pour tester la méthode `GET`**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Chemin**, procédez comme suit :

   1. Pour **opérande 1**, saisissez **1**.

   1. Pour **opérande 2**, saisissez **1**.

   1. Pour **opérateur**, saisissez **\$1**.

1. Sélectionnez **Test**.

1. Le résultat doit se présenter comme suit :  
![\[Testez la méthode GET dans la console API Gateway.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_lambda_calc_get_method_test_path_parm_new_console.png)

Ensuite, vous modélisez la structure de données de la charge utile de réponse de méthode après le schéma `result`.

Par défaut, un modèle vide est attribué au corps de réponse de méthode. Cela entraînera la transmission du corps de réponse d’intégration sans mappage. Cependant, lorsque vous générez un kit SDK pour l’un des langages fortement typés, comme Java ou Objective-C, les utilisateurs de votre kit SDK recevront un objet vide comme résultat. Pour vous assurer que le client REST et les clients SDK reçoivent les résultats escomptés, vous devez modéliser les données de réponse à l’aide d’un schéma prédéfini. Ici, vous allez définir un modèle pour le corps de réponse de méthode et construire un modèle de mappage pour traduire le corps de réponse d’intégration en corps de réponse de méthode.

**Pour créer une réponse de méthode**

1. Dans l’onglet **Méthode de réponse**, sous **Réponse 200**, choisissez **Modifier**.

1. Sous **Corps de la réponse**, choisissez **Ajouter un modèle**.

1. Pour **Type de contenu**, entrez **application/json**.

1. Pour **Modèle**, sélectionnez **Résultat**.

1. Choisissez **Enregistrer**.

La définition du modèle pour le corps de réponse de méthode garantit que les données de réponse seront intégrées dans l’objet `result` d’un kit SDK donné. Pour vous assurer que les données de réponse d’intégration sont mappées en conséquence, un modèle de mappage est nécessaire.

**Pour créer un modèle de mappage**

1. Dans l’onglet **Réponse d’intégration**, sous **Par défaut - Réponse**, choisissez **Modifier**.

1. Choisissez **Modèles de mappage**.

1. Pour **Type de contenu**, entrez **application/json**.

1. Pour **Corps du modèle**, entrez le code suivant :

   ```
   #set($inputRoot = $input.path('$'))
   {
     "input" : {
       "a" : $inputRoot.a,
       "b" : $inputRoot.b,
       "op" : "$inputRoot.op"
     },
     "output" : {
       "c" : $inputRoot.c
     }
   }
   ```

1. Choisissez **Enregistrer**.

**Pour tester le modèle de mappage**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Pour **Chemin**, procédez comme suit :

   1. Pour **opérande 1**, saisissez **1**.

   1. Pour **opérande 2**, saisissez **2**.

   1. Pour **opérateur**, saisissez **\$1**.

1. Sélectionnez **Tester)**.

1. Le résultat ressemble à ce qui suit :

   ```
   {
     "input": {
       "a": 1,
       "b": 2,
       "op": "+"
     },
     "output": {
       "c": 3
     }
   }
   ```

À ce stade, vous pouvez appeler l’API uniquement à l’aide de la fonctionnalité **Tester** dans la console API Gateway. Afin de la rendre disponible votre API pour les clients, vous devez la déployer. Veillez toujours à redéployer votre API chaque fois que vous ajoutez, modifiez ou supprimez une ressource ou une méthode, mettez à jour un mappage de données ou mettez à jour des paramètres d’étape. Sinon, les nouvelles fonctionnalités ou les mises à jour ne seront pas disponibles pour les clients de votre API, comme suit :

**Pour déployer l’API**

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **Prod**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Déployer**.

1.  (Facultatif) Sous **Détails de l’étape**, pour **Invoquer une URL**, vous pouvez choisir l’icône de copie pour copier l’URL d’invocation de votre API. Vous pouvez l’utiliser avec des outils tels que [Postman](https://www.postman.com) et [cURL](https://curl.se/) pour tester votre API.

**Note**  
Veillez toujours à redéployer votre API chaque fois que vous ajoutez, modifiez ou supprimez une ressource ou une méthode, mettez à jour un mappage de données ou mettez à jour des paramètres d’étape. Sinon, les nouvelles fonctions ou les mises à jour ne seront pas disponibles pour les clients de votre API.

# Définitions OpenAPI de l’exemple d’API intégré avec une fonction Lambda
<a name="api-as-lambda-proxy-export-swagger-with-extensions"></a>

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2017-04-20T04:08:08Z",
    "title": "LambdaCalc"
  },
  "host": "uojnr9hd57.execute-api.us-east-1.amazonaws.com",
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/calc": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "operand2",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "operator",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "operand1",
            "in": "query",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            },
            "headers": {
              "operand_1": {
                "type": "string"
              },
              "operand_2": {
                "type": "string"
              },
              "operator": {
                "type": "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.operator": "integration.response.body.op",
                "method.response.header.operand_2": "integration.response.body.b",
                "method.response.header.operand_1": "integration.response.body.a"
              },
              "responseTemplates": {
                "application/json": "#set($res = $input.path('$'))\n{\n    \"result\": \"$res.a, $res.b, $res.op => $res.c\",\n  \"a\" : \"$res.a\",\n  \"b\" : \"$res.b\",\n  \"op\" : \"$res.op\",\n  \"c\" : \"$res.c\"\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n    \"a\":  \"$input.params('operand1')\",\n    \"b\":  \"$input.params('operand2')\", \n    \"op\": \"$input.params('operator')\"   \n}"
          },
          "type": "aws"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "Input",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Input"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate body",
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $inputRoot.a,\n  \"b\" : $inputRoot.b,\n  \"op\" : $inputRoot.op,\n  \"c\" : $inputRoot.c\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "type": "aws"
        }
      }
    },
    "/calc/{operand1}/{operand2}/{operator}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "operand2",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "operator",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "operand1",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n   \"a\": \"$input.params('operand1')\",\n   \"b\": \"$input.params('operand2')\",\n   \"op\": #if($input.params('operator')=='%2F')\"/\"#{else}\"$input.params('operator')\"#end\n   \n}"
          },
          "contentHandling": "CONVERT_TO_TEXT",
          "type": "aws"
        }
      }
    }
  },
  "definitions": {
    "Input": {
      "type": "object",
      "required": [
        "a",
        "b",
        "op"
      ],
      "properties": {
        "a": {
          "type": "number"
        },
        "b": {
          "type": "number"
        },
        "op": {
          "type": "string",
          "description": "binary op of ['+', 'add', '-', 'sub', '*', 'mul', '%2F', 'div']"
        }
      },
      "title": "Input"
    },
    "Output": {
      "type": "object",
      "properties": {
        "c": {
          "type": "number"
        }
      },
      "title": "Output"
    },
    "Result": {
      "type": "object",
      "properties": {
        "input": {
          "$ref": "#/definitions/Input"
        },
        "output": {
          "$ref": "#/definitions/Output"
        }
      },
      "title": "Result"
    }
  },
  "x-amazon-apigateway-request-validators": {
    "Validate body": {
      "validateRequestParameters": false,
      "validateRequestBody": true
    },
    "Validate query string parameters and headers": {
      "validateRequestParameters": true,
      "validateRequestBody": false
    }
  }
}
```

------

# Didacticiel : création d’une API REST en tant que proxy Amazon S3
<a name="integrating-api-with-aws-services-s3"></a>

À titre d’exemple pour présenter l’utilisation d’une API REST dans API Gateway comme proxy Amazon S3, cette section explique comment créer et configurer une API REST pour exposer les opérations Amazon S3 suivantes : 
+ Exposition de la méthode GET sur la ressource racine de l’API pour [afficher la liste de tous les compartiments Amazon S3 d’un appelant](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html).
+ Exposition de la méthode GET sur une ressource Folder pour [afficher la liste de tous les objets d’un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html).
+ Exposez GET sur une Folder/Item ressource pour [afficher ou télécharger un objet depuis un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).

 Vous pouvez importer l’exemple d’API en tant que proxy Amazon S3, comme illustré dans [Définitions OpenAPI de l’exemple d’API en tant que proxy Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md). Cet échantillon contient des méthodes plus exposées. Pour plus d’informations sur l’importation d’une API à l’aide de la définition OpenAPI, consultez [Développez REST APIs à l'aide d'OpenAPI dans API Gateway](api-gateway-import-api.md).

**Note**  
 Pour intégrer votre API Amazon API Gateway avec Amazon S3, vous devez choisir une région où les services API Gateway et Amazon S3 sont disponibles. Pour connaître la disponibilité dans les régions, consultez les [points de terminaison et quotas Amazon API Gateway](https://docs.aws.amazon.com/general/latest/gr/apigateway.html). 

**Topics**
+ [

## Configuration d’autorisations IAM pour l’API afin d’appeler des actions Amazon S3
](#api-as-s3-proxy-iam-permissions)
+ [

## Création de ressources d’API pour représenter des ressources Amazon S3
](#api-as-s3-proxy-create-resources)
+ [

## Exposition d’une méthode d’API pour afficher la liste des compartiments Amazon S3 de l’appelant
](#api-root-get-as-s3-get-service)
+ [

## Exposition de méthodes d’API pour accéder à un compartiment Amazon S3
](#api-folder-operations-as-s3-bucket-actions)
+ [

## Exposition de méthodes d’API pour accéder à un objet Amazon S3 dans un compartiment
](#api-items-in-folder-as-s3-objects-in-bucket)
+ [

# Définitions OpenAPI de l’exemple d’API en tant que proxy Amazon S3
](api-as-s3-proxy-export-swagger-with-extensions.md)
+ [

# Appel de l’API à l’aide d’un client d’API REST
](api-as-s3-proxy-test-using-postman.md)

## Configuration d’autorisations IAM pour l’API afin d’appeler des actions Amazon S3
<a name="api-as-s3-proxy-iam-permissions"></a>

 Pour autoriser l’API à invoquer les actions Amazon S3 requises, vous devez avoir attaché les politiques IAM appropriées à un rôle IAM. Au cours de cette étape, vous allez créer un rôle IAM.

**Pour créer le rôle d'exécution du proxy de AWS service**

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

1. Sélectionnez **Roles**.

1. Choisissez **Créer un rôle**.

1.  Choisissez le **AWS service** sous **Sélectionner le type d'entité de confiance**, puis sélectionnez **API Gateway** et sélectionnez **Allows API Gateway to push CloudWatch logs vers Logs**.

1.  Choisissez **Suivant**, puis **Suivant**.

1. Pour **Nom du rôle**, saisissez **APIGatewayS3ProxyPolicy**, puis choisissez **Créer un rôle**.

1. Dans la liste **Roles**, choisissez le rôle que vous venez de créer. Vous devrez peut-être faire défiler la page ou utiliser la barre de recherche pour rechercher le rôle.

1. Pour le rôle sélectionné, sélectionnez l’onglet **Ajouter des autorisations**.

1. Choisissez **Attacher des politiques** dans la liste déroulante.

1. Dans la barre de recherche, saisissez **AmazonS3FullAccess** et choisissez **Ajouter des autorisations**. 
**Note**  
Ce didacticiel utilise une politique gérée pour plus de simplicité. Il est recommandé de créer votre propre politique IAM afin d’accorder les autorisations minimales requises. 

1. Notez l’**ARN du rôle** nouvellement créé. Vous l’utiliserez ultérieurement.

## Création de ressources d’API pour représenter des ressources Amazon S3
<a name="api-as-s3-proxy-create-resources"></a>

Vous allez utiliser la ressource racine de l’API (`/`) comme conteneur des compartiments Amazon S3 d’un appelant authentifié. Vous allez également créer les ressources `Folder` et `Item` pour représenter respectivement un compartiment Amazon S3 spécifique et un objet Amazon S3 spécifique. Le nom du dossier et la clé de l’objet seront spécifiés sous la forme de paramètres de chemin dans le cadre d’une URL de demande, par l’appelant. 

**Note**  
Lorsque vous accédez à des objets dont la clé d’objet inclut `/` ou n’importe quel autre caractère spécial, ce caractère doit être encodé en URL. Par exemple, `test/test.txt` doit être codé en `test%2Ftest.txt`.

**Pour créer une ressource d’API qui expose les fonctions de service Amazon S3**

1.  Dans le même temps Région AWS que vous avez créé votre compartiment Amazon S3, créez une API nommée **MyS3**. La ressource racine de cette API (**/**) représente le service Amazon S3. Dans cette étape, vous créez deux ressources supplémentaires **/\$1folder\$1** et **/\$1item\$1**.

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

1. Maintenez **Ressource proxy** désactivée. 

1. Pour **Chemin de ressource**, sélectionnez `/`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1folder\$1**.

1. Gardez **CORS (Partage des ressources entre origines multiples)** non coché.

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

1. Sélectionnez la ressource **/\$1folder\$1**, puis choisissez **Créer une ressource**.

1. Suivez les étapes précédentes pour créer une ressource enfant de **/\$1folder\$1** nommée **\$1item\$1**.

   Votre API finale doit ressembler à ce qui suit :

      
![\[Créer une API dans API Gateway en tant que proxy Amazon S3\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_s3_create_api-resources_new_console.png)

## Exposition d’une méthode d’API pour afficher la liste des compartiments Amazon S3 de l’appelant
<a name="api-root-get-as-s3-get-service"></a>

L’obtention de la liste des compartiments Amazon S3 de l’appelant implique l’appel de l’action [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) sur Amazon S3. Sur la ressource racine de l’API (**/**), créez la méthode GET. Configurez la méthode GET de façon à ce qu’elle s’intègre avec Amazon S3, comme suit. 

**Pour créer et initialiser la méthode `GET /` de l’API**

1. Sélectionnez la ressource **/**, puis choisissez **Créer une méthode**. 

1. Pour le type de méthode, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS**.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre compartiment Amazon S3. 

1. Pour **Service AWS**, sélectionnez **Amazon Simple Storage Service**.

1. Laissez **Sous-domaine AWS ** vide.

1. Pour **Méthode HTTP**, sélectionnez **GET**.

1. Pour **Type d’action**, sélectionnez **Utiliser un remplacement de chemin**.

   Avec le remplacement du chemin, API Gateway transfère la demande client à Amazon S3 en tant que [demande de type chemin d’API REST Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAPI.html), dans laquelle une ressource Amazon S3 est exprimée par le chemin de ressource du modèle `s3-host-name/bucket/key`. API Gateway définit le `s3-host-name` et transmet les valeurs spécifiées par le client `bucket` et `key` du client vers Amazon S3.

1. Pour **Remplacement de chemin**, saisissez **/**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de rôle pour **APIGatewayS3ProxyPolicy**.

1. Choisissez **Paramètres de requête de méthode**.

   Vous allez utiliser les paramètres de requête de méthode pour contrôler qui peut appeler cette méthode de votre API.

1. Pour **Autorisation**, dans le menu déroulant, sélectionnez `AWS_IAM`.

      
![\[Déclaration des types de réponse de méthode\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_s3_setup_method_request_authorization_new_console.png)

1. Choisissez **Créer une méthode**.

Cette configuration intègre la demande `GET https://your-api-host/stage/` front-end avec la méthode `GET https://your-s3-host/` back-end.

 Pour que votre API renvoie correctement à l’appelant les réponses positives et les exceptions, vous allez déclarer les réponses 200, 400 et 500 dans **Réponse de méthode**. Vous allez utiliser le mappage par défaut pour les réponses 200 afin que les réponses back-end du code de statut non déclarées ici soient renvoyées à l’appelant en tant que réponses 200. 

**Pour déclarer les types de réponse pour la méthode `GET /`**

1.  Dans l’onglet **Méthode de réponse**, sous **Réponse 200**, choisissez **Modifier**.

1. Choisissez **Ajouter un en-tête**, puis procédez comme suit :

   1. Pour **Nom de l’en-tête**, saisissez **Content-Type**.

   1. Sélectionnez **Add header**.

   Répétez ces étapes pour créer un en-tête **Timestamp** et un en-tête **Content-Length**.

1. Choisissez **Enregistrer**.

1. Dans l’onglet **Réponse de méthode**, sous **Réponses de méthode**, choisissez **Créer une réponse**.

1. Pour **Code de statut HTTP**, saisissez **400**.

   Vous ne définissez aucun en-tête pour cette réponse.

1. Choisissez **Enregistrer**.

1. Répétez les étapes suivantes pour créer la réponse 500.

   Vous ne définissez aucun en-tête pour cette réponse.

Étant donné que la réponse d’intégration réussie d’Amazon S3 renvoie la liste des compartiments en tant que données utiles XML et que la réponse de méthode par défaut d’API Gateway renvoie des données utiles JSON, vous devez mapper la valeur du paramètre d’en-tête Content-Type du back-end à celle du front-end. Sinon, le client recevra `application/json` pour le type de contenu quand le corps de la réponse est en fait une chaîne XML. La procédure suivante montre comment effectuer cette configuration. En outre, vous souhaitez également afficher au client d’autres paramètres d’en-tête, comme Date et Content-Length. 

**Pour configurer des mappages d’en-tête de réponse pour la méthode GET /**

1. Dans l’onglet **Réponse d’intégration**, sous **Par défaut - Réponse**, choisissez **Modifier**.

1. Pour l’en-tête **Content-Length**, saisissez **integration.response.header.Content-Length** pour la valeur de mappage.

1. Pour l’en-tête **Content-Type**, saisissez **integration.response.header.Content-Type** pour la valeur de mappage.

1. Pour l’en-tête **Timestamp**, saisissez **integration.response.header.Date** pour la valeur de mappage.

1. Choisissez **Enregistrer**. Le résultat devrait ressembler à ce qui suit :

      
![\[Mappage des en-têtes de réponse d’intégration aux en-têtes de réponse de méthode\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_s3_setup_integration_response_headers_new_console.png)

1. Dans l’onglet **Réponse d’intégration**, sous **Réponses d’intégration**, choisissez **Créer une réponse**.

1. Pour **HTTP status regex (Regex statut HTTP)**, saisissez **4\$1d\$12\$1**. Cela mappe tous les codes de statut de réponse HTTP 4xx à la réponse de la méthode.

1. Pour **Code de statut de la réponse de méthode**, sélectionnez **400**.

1. Choisissez **Créer**.

1. Répétez les étapes suivantes afin de créer une réponse d’intégration pour la réponse de la méthode 500. Pour **HTTP status regex (Regex statut HTTP)**, saisissez **5\$1d\$12\$1**.

À titre de bonne pratique, vous pouvez tester l’API que vous avez configurée jusqu’à présent.

**Pour tester la méthode `GET /`**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Sélectionnez **Tester)**. Le résultat doit ressembler à l’image suivante :

      
![\[Résultat du test de la méthode GET sur la ressource racine de l’API dans un compartiment\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_s3_test_root_get_result_new_console.png)

## Exposition de méthodes d’API pour accéder à un compartiment Amazon S3
<a name="api-folder-operations-as-s3-bucket-actions"></a>

Pour utiliser un compartiment Amazon S3, vous allez exposer la méthode `GET` sur la ressource /\$1folder\$1 afin de répertorier les objets dans un compartiment. Les instructions sont similaires à celles décrites dans [Exposition d’une méthode d’API pour afficher la liste des compartiments Amazon S3 de l’appelant](#api-root-get-as-s3-get-service). Pour d’autres méthodes, vous pouvez importer l’exemple d’API ici, [Définitions OpenAPI de l’exemple d’API en tant que proxy Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md).

**Pour exposer la méthode GET sur une ressource de dossier**

1. Sélectionnez la ressource **/\$1folder\$1**, puis choisissez **Créer une méthode**. 

1. Pour le type de méthode, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS**.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre compartiment Amazon S3. 

1. Pour **Service AWS**, sélectionnez **Amazon Simple Storage Service**.

1. Laissez **Sous-domaine AWS ** vide.

1. Pour **Méthode HTTP**, sélectionnez **GET**.

1. Pour **Type d’action**, sélectionnez **Utiliser un remplacement de chemin**.

1. Pour **Remplacement de chemin**, saisissez **\$1bucket\$1**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de rôle pour **APIGatewayS3ProxyPolicy**.

1. Choisissez **Créer une méthode**.

Vous définissez le paramètre de chemin `{folder}` dans l’URL de point de terminaison Amazon S3. Vous devez mapper le paramètre de chemin `{folder}` de la requête de méthode au paramètre de chemin `{bucket}` de la requête d’intégration.

**Pour mapper `{folder}` à `{bucket}`**

1.  Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**. 

1. Choisissez **Paramètres de chemin d’URL**, puis choisissez **Ajouter un paramètre de chemin**.

1. Pour **Nom**, saisissez **bucket**.

1. Pour **Mappage à partir de**, entrez **method.request.path.folder**.

1. Choisissez **Enregistrer**.

Maintenant, vous testez votre API. 

**Pour tester la méthode `/{folder} GET`.**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Sous **Chemin**, pour le **dossier**, saisissez le nom de votre compartiment.

1. Sélectionnez **Tester)**.

   Le résultat du test contient une liste des objets contenus dans votre compartiment.

      
![\[Testez la méthode GET pour créer un compartiment Amazon S3.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_s3_test_api_folder_get_new_console.png)

## Exposition de méthodes d’API pour accéder à un objet Amazon S3 dans un compartiment
<a name="api-items-in-folder-as-s3-objects-in-bucket"></a>

Amazon S3 prend en charge les actions GET, DELETE, HEAD, OPTIONS, POST et PUT pour accéder aux objets d’un compartiment donné et les gérer. Dans ce didacticiel, vous allez exposer une méthode `GET` sur la ressource `{folder}/{item}` pour obtenir une image à partir d’un compartiment. Pour d’autres applications de la ressource `{folder}/{item}`, consultez l’exemple d’API,[Définitions OpenAPI de l’exemple d’API en tant que proxy Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md).

**Pour exposer la méthode GET sur une ressource d’élément**

1. Sélectionnez la ressource **/\$1item\$1**, puis choisissez **Créer une méthode**. 

1. Pour le type de méthode, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS**.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre compartiment Amazon S3. 

1. Pour **Service AWS**, sélectionnez **Amazon Simple Storage Service**.

1. Laissez **Sous-domaine AWS ** vide.

1. Pour **Méthode HTTP**, sélectionnez **GET**.

1. Pour **Type d’action**, sélectionnez **Utiliser un remplacement de chemin**.

1. Pour **Remplacement de chemin**, saisissez **\$1bucket\$1/\$1object\$1**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de rôle pour **APIGatewayS3ProxyPolicy**.

1. Choisissez **Créer une méthode**.

Vous définissez les paramètres de chemin `{folder}` et `{item}` dans l’URL de point de terminaison Amazon S3. Vous devez mapper le paramètre de chemin de la requête de méthode au paramètre de chemin de la requête d’intégration.

Dans cette étape, vous effectuez les opérations suivantes :
+ Mappez le paramètre de chemin `{folder}` de la demande de méthode au paramètre de chemin `{bucket}` de la demande d’intégration.
+ Mappez le paramètre de chemin `{item}` de la demande de méthode au paramètre de chemin `{object}` de la demande d’intégration.

**Pour mapper `{folder}` à `{bucket}` et `{item}` à `{object}`**

1.  Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**. 

1. Choisissez **paramètres de chemin d’URL**.

1. Choisissez **Ajouter un paramètre de chemin**.

1. Pour **Nom**, saisissez **bucket**.

1. Pour **Mappage à partir de**, entrez **method.request.path.folder**.

1. Choisissez **Ajouter un paramètre de chemin**.

1. Pour **Nom**, saisissez **object**.

1. Pour **Mappage à partir de**, entrez **method.request.path.item**.

1. Choisissez **Enregistrer**.

**Pour tester la méthode `/{folder}/{object} GET`.**

1. Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

1. Sous **Chemin**, pour le **dossier**, saisissez le nom de votre compartiment.

1. Sous **Chemin**, pour l’**élément**, saisissez le nom d’un élément.

1. Sélectionnez **Tester)**.

   Le corps de la réponse contiendra le contenu de l’élément.

      
![\[Testez la méthode GET pour créer un compartiment Amazon S3.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/aws_proxy_s3_test_api_item_get_new_console.png)

   La requête renvoie correctement le texte brut (« Hello world ») comme contenu du fichier spécifié (test.txt) dans le compartiment Amazon S3 donné (amzn-s3-demo-bucket).

 Pour télécharger ou charger des fichiers binaires (dans API Gateway, tout contenu autre que du contenu JSON codé en UTF-8), des paramètres d’API supplémentaires sont requis. La procédure à suivre est expliquée ci-après : 

**Pour télécharger ou charger des fichiers binaires à partir de S3**

1.  Enregistrez les types de média du fichier concerné dans les API binaryMediaTypes. Vous pouvez réaliser cette opération dans la console : 

   1. Choisissez **Paramètres de l’API** pour l’API.

   1. Sous **Types de supports binaires**, choisissez **Gérer les types de supports**.

   1. Choisissez **Ajouter un type de support binaire**, puis saisissez le type de support requis, par exemple `image/png`.

   1. Choisissez **Save changes** (Enregistrer les modifications) pour sauvegarder le paramètre.

1. Ajoutez l'en-tête `Content-Type` (pour le téléchargement) and/or `Accept` (pour le téléchargement) à la demande de méthode pour demander au client de spécifier le type de support binaire requis et de le mapper à la demande d'intégration.

1. Définissez **Traitement du contenu** sur `Passthrough` dans la demande d’intégration (pour charger) et dans une réponse d’intégration (pour télécharger). Assurez-vous qu’aucun modèle de mappage n’est défini pour le type de contenu en question. Pour de plus amples informations, veuillez consulter [Transformations de données pour REST APIs dans API Gateway](rest-api-data-transformations.md).

La taille de la charge utile ne doit pas dépasser 10 Mo. Voir [Quotas pour la configuration et l’exécution d’une API REST dans API Gateway](api-gateway-execution-service-limits-table.md).

Assurez-vous que les types de contenu appropriés ont été ajoutés dans les métadonnées des fichiers sur Amazon S3. Pour du contenu multimédia lisible en streaming, `Content-Disposition:inline` peut également être ajouté aux métadonnées.

Pour plus d’informations sur la prise en charge des fichiers binaires dans API Gateway, consultez [Conversions du type de contenu dans API Gateway](api-gateway-payload-encodings-workflow.md).

# Définitions OpenAPI de l’exemple d’API en tant que proxy Amazon S3
<a name="api-as-s3-proxy-export-swagger-with-extensions"></a>

Les définitions d’OpenAPI suivantes décrivent une API qui fonctionne comme un proxy Amazon S3. Cette API contient plus d’opérations Amazon S3 que l’API que vous avez créée dans le didacticiel. Les méthodes suivantes sont exposées dans les définitions d’OpenAPI :
+ Exposition de la méthode GET sur la ressource racine de l’API pour [afficher la liste de tous les compartiments Amazon S3 d’un appelant](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html).
+ Exposition de la méthode GET sur une ressource Folder pour [afficher la liste de tous les objets d’un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html).
+ Exposition de la méthode PUT sur une ressource Folder pour [ajouter un compartiment à Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html).
+ Exposition de la méthode DELETE sur une ressource Folder pour [supprimer un compartiment d’Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html).
+ Exposez GET sur une Folder/Item ressource pour [afficher ou télécharger un objet depuis un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).
+ Exposez PUT sur une Folder/Item ressource pour [charger un objet dans un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html).
+ Exposez HEAD sur une Folder/Item ressource pour [obtenir les métadonnées d'un objet dans un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html).
+ Exposez DELETE sur une Folder/Item ressource pour [supprimer un objet d'un compartiment Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html).

Pour plus d’informations sur l’importation d’une API à l’aide de la définition OpenAPI, consultez [Développez REST APIs à l'aide d'OpenAPI dans API Gateway](api-gateway-import-api.md).

Pour obtenir des instructions sur la création d’une API similaire, consultez [Didacticiel : création d’une API REST en tant que proxy Amazon S3](integrating-api-with-aws-services-s3.md).

Pour savoir comment invoquer cette API à l'aide de [Postman](https://www.postman.com/), qui prend en charge l'autorisation AWS IAM, consultez. [Appel de l’API à l’aide d’un client d’API REST](api-as-s3-proxy-test-using-postman.md)

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-10-13T23:04:43Z",
    "title": "MyS3"
  },
  "host": "9gn28ca086.execute-api.{region}.amazonaws.com",
  "basePath": "/S3",
  "schemes": [
    "https"
  ],
  "paths": {
    "/": {
      "get": {
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Timestamp": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length",
                "method.response.header.Timestamp": "integration.response.header.Date"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path//",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      }
    },
    "/{folder}": {
      "get": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Date": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Date": "integration.response.header.Date",
                "method.response.header.Content-Length": "integration.response.header.content-length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      },
      "put": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.bucket": "method.request.path.folder",
            "integration.request.header.Content-Type": "method.request.header.Content-Type"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "PUT",
          "type": "aws"
        }
      },
      "delete": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Date": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Date": "integration.response.header.Date"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "DELETE",
          "type": "aws"
        }
      }
    },
    "/{folder}/{item}": {
      "get": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "content-type": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.content-type": "integration.response.header.content-type",
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      },
      "head": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "HEAD",
          "type": "aws"
        }
      },
      "put": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder",
            "integration.request.header.Content-Type": "method.request.header.Content-Type"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "PUT",
          "type": "aws"
        }
      },
      "delete": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200"
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "DELETE",
          "type": "aws"
        }
      }
    }
  },
  "securityDefinitions": {
    "sigv4": {
      "type": "apiKey",
      "name": "Authorization",
      "in": "header",
      "x-amazon-apigateway-authtype": "awsSigv4"
    }
  },
  "definitions": {
    "Empty": {
      "type": "object",
      "title": "Empty Schema"
    }
  }
}
```

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "MyS3",
    "version" : "2016-10-13T23:04:43Z"
  },
  "servers" : [ {
    "url" : "https://9gn28ca086.execute-api.{region}.amazonaws.com/{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "S3"
      }
    }
  } ],
  "paths" : {
    "/{folder}" : {
      "get" : {
        "parameters" : [ {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Date" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "GET",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Date" : "integration.response.header.Date",
                "method.response.header.Content-Length" : "integration.response.header.content-length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "put" : {
        "parameters" : [ {
          "name" : "Content-Type",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "PUT",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.bucket" : "method.request.path.folder",
            "integration.request.header.Content-Type" : "method.request.header.Content-Type"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "delete" : {
        "parameters" : [ {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Date" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "DELETE",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Date" : "integration.response.header.Date"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      }
    },
    "/{folder}/{item}" : {
      "get" : {
        "parameters" : [ {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "content-type" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "GET",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.content-type" : "integration.response.header.content-type",
                "method.response.header.Content-Type" : "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "put" : {
        "parameters" : [ {
          "name" : "Content-Type",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "PUT",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder",
            "integration.request.header.Content-Type" : "method.request.header.Content-Type"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "delete" : {
        "parameters" : [ {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "DELETE",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200"
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "head" : {
        "parameters" : [ {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "HEAD",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      }
    },
    "/" : {
      "get" : {
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Timestamp" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "GET",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path//",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length",
                "method.response.header.Timestamp" : "integration.response.header.Date"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "Empty" : {
        "title" : "Empty Schema",
        "type" : "object"
      }
    }
  }
}
```

------

# Appel de l’API à l’aide d’un client d’API REST
<a name="api-as-s3-proxy-test-using-postman"></a>

Pour fournir un end-to-end didacticiel, nous montrons maintenant comment appeler l'API à l'aide de [Postman](https://www.postman.com/), qui prend en charge l'autorisation AWS IAM.<a name="api-as-s3-proxy-test-using-postman-steps"></a>

**Pour appeler notre API proxy Amazon S3 à l’aide de Postman**

1. Déployez ou redéployez l’API. Notez l’URL de base de l’API qui s’affiche à côté d’**Invoke URL** en haut de **Stage Editor**.

1. Lancez Postman.

1. Choisissez **Autorisation**, puis choisissez `AWS Signature`. Entrez l'ID de clé d'accès et la clé d'accès secrète de votre utilisateur IAM dans les champs de **SecretKey**saisie **AccessKey**et, respectivement. Entrez l'adresse Région AWS vers laquelle votre API est déployée dans la **AWS zone de texte Région**. Saisissez `execute-api` dans le champ de saisie **Nom du service**.

   Vous pouvez créer une paire de clés à partir de l’onglet **Security Credentials (Informations d’identification de sécurité** de votre compte d’utilisateur IAM dans IAM Management Console.

1. Pour ajouter un compartiment nommé `amzn-s3-demo-bucket` à votre compte Amazon S3 dans la région `{region}` :

   1. Choisissez **PUT** dans la liste déroulante de méthodes et le tapez l’URL de la méthode (`https://api-id.execute-api.aws-region.amazonaws.com/stage/folder-name`)

   1. Définissez la valeur de l’en-tête `Content-Type` sur `application/xml`. Vous devrez peut-être supprimer des en-têtes existants avant de définir le type de contenu.

   1. Choisissez l’élément de menu **Body** et tapez le fragment XML suivant comme corps de la demande :

      ```
      <CreateBucketConfiguration> 
        <LocationConstraint>{region}</LocationConstraint> 
      </CreateBucketConfiguration>
      ```

   1. Choisissez **Send** pour envoyer la demande. Si l’opération aboutit, vous devez recevoir une réponse `200 OK` avec une charge utile vide. 

1. Pour ajouter un fichier texte à un compartiment, suivez les instructions ci-dessus. Si vous spécifiez le nom de compartiment **amzn-s3-demo-bucket** pour `{folder}` et le nom de fichier **Readme.txt** pour `{item}` dans l’URL, et si vous fournissez la chaîne de texte **Hello, World\$1** comme contenu de fichier (qui devient de ce fait la charge utile de la demande), la demande devient :

   ```
   PUT /S3/amzn-s3-demo-bucket/Readme.txt HTTP/1.1
   Host: 9gn28ca086.execute-api.{region}.amazonaws.com
   Content-Type: application/xml
   X-Amz-Date: 20161015T062647Z
   Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=ccadb877bdb0d395ca38cc47e18a0d76bb5eaf17007d11e40bf6fb63d28c705b
   Cache-Control: no-cache
   Postman-Token: 6135d315-9cc4-8af8-1757-90871d00847e
   
   Hello, World!
   ```

   Si tout se passe bien, vous devez recevoir une réponse `200 OK` avec une charge utile vide.

1. Pour obtenir le contenu du fichier `Readme.txt` que nous venons d’ajouter au compartiment `amzn-s3-demo-bucket`, exécutez une demande GET comme suit :

   ```
   GET /S3/amzn-s3-demo-bucket/Readme.txt HTTP/1.1
   Host: 9gn28ca086.execute-api.{region}.amazonaws.com
   Content-Type: application/xml
   X-Amz-Date: 20161015T063759Z
   Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ba09b72b585acf0e578e6ad02555c00e24b420b59025bc7bb8d3f7aed1471339
   Cache-Control: no-cache
   Postman-Token: d60fcb59-d335-52f7-0025-5bd96928098a
   ```

   Si la demande aboutit, vous devez recevoir une réponse `200 OK` avec la chaîne de texte `Hello, World!` comme charge utile.

1. Pour répertorier les éléments du compartiment `amzn-s3-demo-bucket`, envoyez la demande suivante :

   ```
   GET /S3/amzn-s3-demo-bucket HTTP/1.1
   Host: 9gn28ca086.execute-api.{region}.amazonaws.com
   Content-Type: application/xml
   X-Amz-Date: 20161015T064324Z
   Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=4ac9bd4574a14e01568134fd16814534d9951649d3a22b3b0db9f1f5cd4dd0ac
   Cache-Control: no-cache
   Postman-Token: 9c43020a-966f-61e1-81af-4c49ad8d1392
   ```

   Si la demande aboutit, vous devez recevoir une réponse `200 OK` avec une charge utile XML montrant un seul élément dans le compartiment spécifié, sauf si vous avez ajouté d’autres fichiers au compartiment avant d’envoyer cette demande.

   ```
   <?xml version="1.0" encoding="UTF-8"?>
   <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
       <Name>apig-demo-5</Name>
       <Prefix></Prefix>
       <Marker></Marker>
       <MaxKeys>1000</MaxKeys>
       <IsTruncated>false</IsTruncated>
       <Contents>
           <Key>Readme.txt</Key>
           <LastModified>2016-10-15T06:26:48.000Z</LastModified>
           <ETag>"65a8e27d8879283831b664bd8b7f0ad4"</ETag>
           <Size>13</Size>
           <Owner>
               <ID>06e4b09e9d...603addd12ee</ID>
               <DisplayName>user-name</DisplayName>
           </Owner>
           <StorageClass>STANDARD</StorageClass>
       </Contents>
   </ListBucketResult>
   ```

**Note**  
Pour charger ou télécharger une image, vous devez affecter la valeur CONVERT\$1TO\$1BINARY au paramètre de gestion de contenu.

# Didacticiel : création d’une API REST en tant que proxy Amazon Kinesis
<a name="integrating-api-with-aws-services-kinesis"></a>

Cette page explique comment créer et configurer une API REST avec une intégration du type `AWS` pour accéder à Kinesis. 

**Note**  
 Pour intégrer votre API API Gateway avec Kinesis, vous devez choisir une région où les services API Gateway et Kinesis sont disponibles. Pour connaître la disponibilité dans les régions, consultez [Points de terminaison de service et quotas](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html).

 À titre d’illustration, nous allons créer un exemple d’API pour permettre à un client d’effectuer les tâches suivantes : 

1. Affichage de la liste des flux disponibles de l’utilisateur dans Kinesis 

1. Création, description ou suppression d’un flux spécifique

1. Lecture ou écriture des enregistrements de données du flux spécifié

 Pour effectuer les tâches précédentes, l’API expose les méthodes sur diverses ressources pour appeler les actions suivantes, respectivement : 

1. L’action `ListStreams` dans Kinesis 

1. L’action `CreateStream`, `DescribeStream` ou `DeleteStream`

1. L’action `GetRecords` ou `PutRecords` (y compris `PutRecord`) dans Kinesis

 Plus précisément, nous allons concevoir l’API comme suit : 
+  Exposez une méthode HTTP GET sur la `/streams` ressource de l'API et intégrez-la à l'[ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html)action dans Kinesis pour répertorier les flux du compte de l'appelant. 
+  Exposez une méthode HTTP POST sur la `/streams/{stream-name}` ressource de l'API et intégrez-la à l'[CreateStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.html)action dans Kinesis pour créer un flux nommé dans le compte de l'appelant. 
+  Exposez une méthode HTTP GET sur la `/streams/{stream-name}` ressource de l'API et intégrez-la à l'[DescribeStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStream.html)action dans Kinesis pour décrire un flux nommé dans le compte de l'appelant. 
+  Exposez une méthode HTTP DELETE sur la `/streams/{stream-name}` ressource de l'API et intégrez-la à l'[DeleteStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DeleteStream.html)action dans Kinesis pour supprimer un flux dans le compte de l'appelant. 
+  Exposez une méthode HTTP PUT sur la `/streams/{stream-name}/record` ressource de l'API et intégrez-la à l'[PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html)action dans Kinesis. Cela permet au client d’ajouter un enregistrement de données unique au flux nommé. 
+  Exposez une méthode HTTP PUT sur la `/streams/{stream-name}/records` ressource de l'API et intégrez-la à l'[PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html)action dans Kinesis. Cela permet au client d’ajouter une liste d’enregistrements de données au flux nommé. 
+  Exposez une méthode HTTP GET sur la `/streams/{stream-name}/records` ressource de l'API et intégrez-la à l'[GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html)action dans Kinesis. Cela permet au client d’afficher la liste des enregistrements de données du flux nommé, avec un itérateur de partition spécifique. Un itérateur de partition spécifie la position de la partition à partir de laquelle la lecture séquentielle des enregistrements de données doit commencer.
+  Exposez une méthode HTTP GET sur la `/streams/{stream-name}/sharditerator` ressource de l'API et intégrez-la à l'[GetShardIterator](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html)action dans Kinesis. Cette méthode d’assistance doit être fournie à l’action `ListStreams` dans Kinesis. 

 Vous pouvez appliquer les instructions présentées ici aux autres actions Kinesis. Pour obtenir la liste complète des actions Kinesis, consultez la [Référence d’API Amazon Kinesis](https://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html). 

 Au lieu d’utiliser la console API Gateway pour créer l’exemple d’API, vous pouvez importer l’exemple d’API dans API Gateway à l’aide de l’[API d’importation](https://docs.aws.amazon.com/apigateway/latest/api/API_ImportRestApi.html) d’API Gateway. Pour plus d’informations sur l’utilisation de la fonction d’importation d’API, consultez [Développez REST APIs à l'aide d'OpenAPI dans API Gateway](api-gateway-import-api.md). 

## Création d’un rôle et d’une politique IAM pour permettre à l’API d’accéder à Kinesis
<a name="integrate-with-kinesis-create-iam-role-and-policy"></a>

 Pour autoriser l’API à invoquer des actions Kinesis, vous devez avoir attaché les politiques IAM appropriées à un rôle IAM. Au cours de cette étape, vous allez créer un rôle IAM.

**Pour créer le rôle d'exécution du proxy de AWS service**

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

1. Sélectionnez **Roles**.

1. Choisissez **Créer un rôle**.

1.  Choisissez le **AWS service** sous **Sélectionner le type d'entité de confiance**, puis sélectionnez **API Gateway** et sélectionnez **Allows API Gateway to push CloudWatch logs vers Logs**.

1.  Choisissez **Suivant**, puis **Suivant**.

1. Pour **Nom du rôle**, saisissez **APIGatewayKinesisProxyPolicy**, puis choisissez **Créer un rôle**.

1. Dans la liste **Roles**, choisissez le rôle que vous venez de créer. Vous devrez peut-être faire défiler la page ou utiliser la barre de recherche pour rechercher le rôle.

1. Pour le rôle sélectionné, sélectionnez l’onglet **Ajouter des autorisations**.

1. Choisissez **Attacher des politiques** dans la liste déroulante.

1. Dans la barre de recherche, saisissez **AmazonKinesisFullAccess** et choisissez **Ajouter des autorisations**. 
**Note**  
Ce didacticiel utilise une politique gérée pour plus de simplicité. Il est recommandé de créer votre propre politique IAM afin d’accorder les autorisations minimales requises. 

1. Notez l’**ARN du rôle** nouvellement créé. Vous l’utiliserez ultérieurement.

## Création d’une API en tant que proxy Kinesis
<a name="api-gateway-create-api-as-kinesis-proxy"></a>

Procédez comme suit pour créer l’API dans la console API Gateway.

**Pour créer une API en tant que proxy AWS de service pour Kinesis**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Si vous utilisez API Gateway pour la première fois, vous voyez une page qui vous présente les fonctions du service. Sous **REST API (API REST)**, choisissez **Build (Création)**. Lorsque la fenêtre contextuelle **Create Example API (Créer API exemple)** s’affiche, cliquez sur **OK**.

   Si ce n’est pas la première fois que vous utilisez API Gateway, choisissez **Create API (Créer une API)**. Sous **REST API (API REST)**, choisissez **Build (Création)**.

1. Choisissez **New API (Nouvelle API)**. 

1. Sous **API name (Nom de l’API)**, saisissez **KinesisProxy**. Conservez les valeurs par défaut pour tous les autres champs. 

1. (Facultatif) Sous **Description**, entrez une description.

1. Pour le **type d'adresse IP**, sélectionnez **IPv4**.

1. Sélectionnez **Create API (Créer une API)**. 

 Une fois l’API créée, la console API Gateway affiche la page **Resources**, qui contient uniquement la ressource racine (`/`) de cette API. 

## Liste des flux dans Kinesis
<a name="api-gateway-list-kinesis-streams"></a>

 Kinesis prend en charge l’action `ListStreams` avec l’appel API REST suivant : 

```
POST /?Action=ListStreams HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
        
{
   ...
}
```

Dans la demande API REST ci-dessus, l’action est spécifiée dans le paramètre de requête `Action`. Vous pouvez également spécifier l’action dans l’en-tête `X-Amz-Target`, plutôt que :

```
POST / HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
X-Amz-Target: Kinesis_20131202.ListStreams        
{
   ...
}
```

Dans ce didacticiel, nous utilisons le paramètre de requête pour spécifier l’action.

Pour exposer une action Kinesis dans l’API, ajoutez une ressource `/streams` à la racine de l’API. Ensuite, définissez une méthode `GET` sur la ressource et intégrez-la avec l’action `ListStreams` de Kinesis. 

La procédure suivante décrit comment répertorier les flux Kinesis à l’aide de la console API Gateway. 

**Pour répertorier les flux Kinesis à l’aide de la console API Gateway**

1. Sélectionnez la ressource `/`, puis choisissez **Créer une ressource**. 

1. Sous **Resource Name (Nom de la ressource)**, entrez **streams**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

1.  Choisissez la ressource `/streams`, puis choisissez **Créer une méthode** et procédez comme suit :

   1. Pour **Type de méthode**, sélectionnez **GET**.
**Note**  
Le verbe HTTP pour une méthode appelée par un client peut différer du verbe HTTP pour une intégration requise par le serveur principal. Nous sélectionnons `GET` dans ce cas, car l’affichage de la liste des flux est intuitivement une opération READ. 

   1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

   1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

   1. Pour **Service AWS**, sélectionnez **Kinesis**.

   1. Laissez **Sous-domaine AWS ** vide.

   1. Dans le champ **HTTP Method**, sélectionnez **POST**.
**Note**  
Nous avons choisi `POST` dans ce cas, car Kinesis exige que l’action `ListStreams` soit appelée avec lui. 

   1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

   1. Pour **Nom de l’action**, saisissez **ListStreams**.

   1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

   1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

   1. Choisissez **Créer une méthode**.

1. Dans l’onglet **Requête d’intégration**, sous **Paramètres de requête d’intégration**, choisissez **Modifier**. 

1. Pour **Transmission du corps de requête**, sélectionnez **Lorsqu’aucun modèle n’est défini (recommandé)**.

1.  Choisissez **Paramètres des en-têtes de requête d’URL** et procédez comme suit :

   1. Choisissez le **paramètre Ajouter des en-têtes de requête**.

   1. Pour **Nom**, saisissez **Content-Type**.

   1. Pour **Mappage à partir de**, entrez **'application/x-amz-json-1.1'**.

    Nous avons utilisé un mappage de paramètre de requête pour définir l’en-tête `Content-Type` sur la valeur statique de `'application/x-amz-json-1.1'` afin d’informer Kinesis que l’entrée est une version spécifique de JSON. 

1. Choisissez **Modèles de mappage**, puis choisissez **Ajouter un modèle de mappage**, puis procédez comme suit :

   1. Pour **Type de contenu**, saisissez **application/json**.

   1. Pour **Corps du modèle**, saisissez **\$1\$1**.

   1. Choisissez **Enregistrer**.

    La [ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html#API_ListStreams_RequestSyntax)demande prend une charge utile au format JSON suivant : 

   ```
   {
       "ExclusiveStartStreamName": "string",
       "Limit": number
   }
   ```

   Cependant, les propriétés sont facultatives. Pour utiliser les valeurs par défaut, nous avons choisi une charge utile JSON vide dans ce cas.

1. Testez la méthode GET sur la ressource **/streams** pour invoquer l’action `ListStreams` dans Kinesis :

   Choisissez l’onglet **Test**. Vous devrez peut-être choisir la flèche droite pour afficher l’onglet.

   Choisissez **Tester** pour tester votre méthode.

    Si vous avez déjà créé deux flux nommés « myStream » et « yourStream » dans Kinesis, le test réussi renvoie une réponse 200 OK contenant la charge utile suivante : 

   ```
   {
        "HasMoreStreams": false,
        "StreamNames": [
            "myStream",
            "yourStream"
        ]
   }
   ```

## Création, description et suppression d’un flux dans Kinesis
<a name="api-gateway-create-describe-delete-stream"></a>

 La création, la description et la suppression d’un flux dans Kinesis impliquent respectivement d’effectuer les demandes d’API REST Kinesis suivantes : 

```
POST /?Action=CreateStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "ShardCount": number,
    "StreamName": "string"
}
```

```
POST /?Action=DescribeStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "StreamName": "string"
}
```

```
POST /?Action=DeleteStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "StreamName":"string"
}
```

 Nous pouvons créer l’API pour qu’elle accepte l’entrée requises en tant que charge utile JSON de la demande de méthode et la transmette via la demande d’intégration. Cependant, pour fournir davantage d’exemples de mappage de données entre les demandes de méthode et d’intégration, et entre les réponses de méthode et d’intégration, nous allons créer notre API légèrement différemment. 

 Nous exposons les méthodes `GET``POST`,, et `Delete` HTTP sur une to-be-named `Stream` ressource. Nous utilisons la variable de chemin `{stream-name}` comme espace réservé de la ressource de flux et intégrons respectivement ces méthodes d’API avec les actions `DescribeStream`, `CreateStream` et `DeleteStream` de Kinesis, respectivement. Nous exigeons que le client transmette les autres données d’entrée, telles que les en-têtes, les paramètres de requête ou la charge utile d’une demande de méthode. Nous fournissons des modèles de mappage pour transformer ces données en charge utile de la demande d’intégration requise. 

**Pour créer la ressource \$1stream-name\$1**

1. Sélectionnez la ressource **/streams**, puis choisissez **Créer une ressource**.

1. Maintenez **Ressource proxy** désactivée. 

1. Pour **Chemin de ressource**, sélectionnez `/streams`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **\$1stream-name\$1**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

**Pour configurer et tester la méthode GET sur une ressource de flux**

1. Sélectionnez la ressource **/\$1stream-name\$1**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **DescribeStream**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Choisissez **Créer une méthode**.

1. Dans la section **Requête d’intégration**, ajoutez les **Paramètres d’en-tête de requête d’URL** suivants :

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   La tâche suit la même procédure pour configurer le mappage de paramètre de demande pour la méthode `GET /streams`.

1. Ajoutez le modèle de mappage de corps suivant pour mapper des données à partir de la demande de méthode `GET /streams/{stream-name}` à la demande d’intégration `POST /?Action=DescribeStream` :

   ```
   {
       "StreamName": "$input.params('stream-name')"
   }
   ```

   Ce modèle de mappage génère la charge utile de demande d’intégration requise pour l’action `DescribeStream` de Kinesis à partir de la valeur du paramètre de chemin `stream-name` de la demande de méthode.

1. Pour tester la méthode `GET /stream/{stream-name}` permettant d’invoquer l’action `DescribeStream` dans Kinesis, cliquez sur l’onglet **Tester**.

1. Pour **Chemin**, sous **nom du flux**, entrez le nom d’un flux Kinesis existant.

1. Sélectionnez **Tester)**. Si le test aboutit, une réponse 200 OK est renvoyée avec une charge utile similaire à celle qui suit : 

   ```
   {
     "StreamDescription": {
       "HasMoreShards": false,
       "RetentionPeriodHours": 24,
       "Shards": [
         {
           "HashKeyRange": {
             "EndingHashKey": "68056473384187692692674921486353642290",
             "StartingHashKey": "0"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "49559266461454070523309915164834022007924120923395850242"
           },
           "ShardId": "shardId-000000000000"
         },
         ...
         {
           "HashKeyRange": {
             "EndingHashKey": "340282366920938463463374607431768211455",
             "StartingHashKey": "272225893536750770770699685945414569164"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "49559266461543273504104037657400164881014714369419771970"
           },
           "ShardId": "shardId-000000000004"
         }
       ],
       "StreamARN": "arn:aws:kinesis:us-east-1:12345678901:stream/myStream",
       "StreamName": "myStream",
       "StreamStatus": "ACTIVE"
     }
   }
   ```

    Après avoir déployé l’API, vous pouvez exécuter une demande REST sur cette méthode d’API : 

   ```
   GET https://your-api-id.execute-api.region.amazonaws.com/stage/streams/myStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   ```

**Pour configurer et tester la méthode POST sur une ressource de flux**

1. Sélectionnez la ressource **/\$1stream-name\$1**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **POST**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **CreateStream**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Choisissez **Créer une méthode**.

1. Dans la section **Requête d’intégration**, ajoutez les **Paramètres d’en-tête de requête d’URL** suivants :

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   La tâche suit la même procédure pour configurer le mappage de paramètre de demande pour la méthode `GET /streams`.

1.  Ajoutez le modèle de mappage de corps suivant pour mapper des données à partir de la demande de méthode `POST /streams/{stream-name}` à la demande d’intégration `POST /?Action=CreateStream` : 

   ```
   {
       "ShardCount": #if($input.path('$.ShardCount') == '') 5 #else $input.path('$.ShardCount') #end,
       "StreamName": "$input.params('stream-name')"
   }
   ```

    Dans le modèle de mappage précédent, nous configurons `ShardCount` sur une valeur fixe de 5, si le client ne spécifie aucune valeur dans la charge utile de la demande de méthode. 

1. Pour tester la méthode `POST /stream/{stream-name}` permettant d’invoquer l’action `CreateStream` dans Kinesis, cliquez sur l’onglet **Tester**.

1. Pour **Chemin**, sous **nom du flux**, entrez le nom d’un nouveau flux Kinesis.

1. Sélectionnez **Tester)**. Si le test aboutit, une réponse 200 OK est renvoyée sans aucune donnée. 

    Après avoir déployé l’API, vous pouvez également exécuter une demande d’API REST avec la méthode POST sur une ressource de flux pour appeler l’action `CreateStream` dans Kinesis : 

   ```
   POST https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   
   { 
       "ShardCount": 5
   }
   ```

**Configuration et test de la méthode DELETE sur une ressource de flux**

1. Sélectionnez la ressource **/\$1stream-name\$1**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **DELETE**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **DeleteStream**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Choisissez **Créer une méthode**.

1. Dans la section **Requête d’intégration**, ajoutez les **Paramètres d’en-tête de requête d’URL** suivants :

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   La tâche suit la même procédure pour configurer le mappage de paramètre de demande pour la méthode `GET /streams`.

1.  Ajoutez le modèle de mappage de corps suivant pour mapper des données à partir de la demande de méthode `DELETE /streams/{stream-name}` à la demande d’intégration correspondante de `POST /?Action=DeleteStream` : 

   ```
   {
       "StreamName": "$input.params('stream-name')"
   }
   ```

    Ce modèle de mappage génère l’entrée requise pour l’action `DELETE /streams/{stream-name}` à partir du nom du chemin de l’URL fourni par le client de `stream-name`. 

1. Pour tester la méthode `DELETE /stream/{stream-name}` permettant d’invoquer l’action `DeleteStream` dans Kinesis, cliquez sur l’onglet **Tester**.

1. Pour **Chemin**, sous **nom du flux**, entrez le nom d’un flux Kinesis existant.

1. Sélectionnez **Tester)**. Si le test aboutit, une réponse 200 OK est renvoyée sans aucune donnée. 

    Après avoir déployé l’API, vous pouvez également exécuter la demande d’API REST suivante avec la méthode DELETE sur la ressource de flux pour appeler l’action `DeleteStream` dans Kinesis : 

   ```
   DELETE https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   
   {}
   ```

## Obtention d’enregistrements d’un flux et ajout d’enregistrements à un flux dans Kinesis
<a name="api-gateway-get-and-add-records-to-stream"></a>

 Après avoir créé un flux dans Kinesis, vous pouvez ajouter des enregistrements de données à ce flux et lire les données du flux. L'ajout d'enregistrements de données implique d'appeler l'[PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html#API_PutRecord_Examples)action [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html#API_PutRecords_Examples)ou dans Kinesis. La première ajoute plusieurs enregistrements, tandis que la seconde ajoute un seul enregistrement au flux. 

```
POST /?Action=PutRecords HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "Records": [
        {
            "Data": blob,
            "ExplicitHashKey": "string",
            "PartitionKey": "string"
        }
    ],
    "StreamName": "string"
}
```

ou

```
POST /?Action=PutRecord HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "Data": blob,
    "ExplicitHashKey": "string",
    "PartitionKey": "string",
    "SequenceNumberForOrdering": "string",
    "StreamName": "string"
}
```

 Ici, `StreamName` identifie le flux cible pour ajouter des enregistrements. `StreamName`, `Data`, et `PartitionKey` sont des données d’entrée requises. Dans notre exemple, nous utilisons les valeurs par défaut de toutes les données d’entrée facultatives et nous ne spécifierons pas explicitement leurs valeurs dans les données d’entrée de la demande de méthode. 

 Lire des données dans Kinesis revient à lancer l'action suivante : [GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html#API_GetRecords_Examples) 

```
POST /?Action=GetRecords HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "ShardIterator": "string",
    "Limit": number
}
```

Ici, le flux source à partir duquel nous obtenons les enregistrements est spécifié dans la valeur requise `ShardIterator`, comme indiqué dans l’action Kinesis suivante pour obtenir un itérateur de partition :

```
POST /?Action=GetShardIterator HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes
                
{
    "ShardId": "string",
    "ShardIteratorType": "string",
    "StartingSequenceNumber": "string",
    "StreamName": "string"
}
```

 Pour les actions `GetRecords` et `PutRecords`, nous exposons respectivement les méthodes `GET` et `PUT` sur une ressource `/records` qui est ajoutée à une ressource de flux nommé (`/{stream-name}`). De même, nous exposons l’action `PutRecord` en tant que méthode `PUT` sur une ressource `/record`. 

 Étant donné que l’action `GetRecords` utilise comme données d’entrée une valeur `ShardIterator`, qui est obtenue en appelant l’action d’assistance `GetShardIterator`, nous exposons une méthode d’assistance `GET` sur une ressource `ShardIterator` (`/sharditerator`). 

**Pour créer les ressources /record, /records et /sharditerator**

1. Sélectionnez la ressource **/\$1stream-name\$1**, puis choisissez **Créer une ressource**.

1. Maintenez **Ressource proxy** désactivée. 

1. Pour **Chemin de ressource**, sélectionnez `/{stream-name}`.

1. Sous **Resource Name (Nom de la ressource)**, entrez **record**.

1. Maintenez **CORS (Partage des ressources entre origines multiples)** désactivé.

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

1. Répétez les étapes précédentes pour créer une ressource **/records** et une ressource **/sharditerator**. L’API finale doit ressembler à ce qui suit :

      
![\[Création de méthodes Records:GET|PUT|PUT|GET pour l’API\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/api-gateway-kinesis-proxy-setup-streams-stream-record-method-new-console.png)

 Les quatre procédures suivantes expliquent comment configurer chacune des méthodes, comment mapper les données des demandes de méthode aux demandes d’intégration et comment tester les méthodes. 

**Pour configurer et tester la méthode `PUT /streams/{stream-name}/record` de façon à ce qu’elle appelle `PutRecord` dans Kinesis**

1. Sélectionnez **/record**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **PUT**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **PutRecord**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Choisissez **Créer une méthode**.

1. Dans la section **Requête d’intégration**, ajoutez les **Paramètres d’en-tête de requête d’URL** suivants :

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   La tâche suit la même procédure pour configurer le mappage de paramètre de demande pour la méthode `GET /streams`.

1.  Ajoutez le modèle de mappage de corps suivant pour mapper des données à partir de la demande de méthode `PUT /streams/{stream-name}/record` à la demande d’intégration correspondante de `POST /?Action=PutRecord` : 

   ```
   {
       "StreamName": "$input.params('stream-name')",
       "Data": "$util.base64Encode($input.json('$.Data'))",
       "PartitionKey": "$input.path('$.PartitionKey')"
   }
   ```

    Ce modèle de mappage suppose que la charge utile de la demande de méthode est au format suivant : 

   ```
   {
      "Data": "some data",
      "PartitionKey": "some key"
   }
   ```

   Ces données peuvent être modélisées par le schéma JSON suivant :

   ```
   {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "PutRecord proxy single-record payload",
     "type": "object",
     "properties": {
         "Data": { "type": "string" },
         "PartitionKey": { "type": "string" }
     }
   }
   ```

    Vous pouvez créer un modèle pour inclure ce schéma et utiliser ce modèle pour faciliter la génération du modèle de mappage. Cependant, vous pouvez également générer un modèle de mappage sans utiliser aucun modèle. 

1.  Pour tester la méthode `PUT /streams/{stream-name}/record`, définissez la variable de chemin `stream-name` sur le nom d’un flux existant, fournissez une charge utile au format requis, puis envoyez la demande de méthode. Si le test aboutit, le résultat est une réponse `200 OK ` avec une charge utile au format suivant : 

   ```
   {
     "SequenceNumber": "49559409944537880850133345460169886593573102115167928386",
     "ShardId": "shardId-000000000004"
   }
   ```

**Pour configurer et tester la méthode `PUT /streams/{stream-name}/records` de façon à ce qu’elle appelle `PutRecords` dans Kinesis**

1. Sélectionnez **/records**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **PUT**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **PutRecords**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Choisissez **Créer une méthode**.

1. Dans la section **Requête d’intégration**, ajoutez les **Paramètres d’en-tête de requête d’URL** suivants :

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   La tâche suit la même procédure pour configurer le mappage de paramètre de demande pour la méthode `GET /streams`.

1.  Ajoutez le modèle de mappage de corps suivant pour mapper des données à partir de la requête de méthode `PUT /streams/{stream-name}/records` à la requête d’intégration correspondante de `POST /?Action=PutRecords` : 

   ```
   {
       "StreamName": "$input.params('stream-name')",
       "Records": [
          #foreach($elem in $input.path('$.records'))
             {
               "Data": "$util.base64Encode($elem.data)",
               "PartitionKey": "$elem.partition-key"
             }#if($foreach.hasNext),#end
           #end
       ]
   }
   ```

   Ce modèle de mappage suppose que la charge utile de la demande de méthode puisse être modélisée par le schéma JSON suivant :

   ```
   {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "PutRecords proxy payload data",
     "type": "object",
     "properties": {
       "records": {
         "type": "array",
         "items": {
           "type": "object",
           "properties": {
             "data": { "type": "string" },
             "partition-key": { "type": "string" }
           }
         }
       }
     }
   }
   ```

    Vous pouvez créer un modèle pour inclure ce schéma et utiliser ce modèle pour faciliter la génération du modèle de mappage. Cependant, vous pouvez également générer un modèle de mappage sans utiliser aucun modèle. 

   Dans ce didacticiel, nous avons utilisé deux formats de charge utile légèrement différents pour illustrer qu’un développeur d’API peut choisir d’exposer le format de données principal au client ou de lui cacher. Un format concerne la méthode `PUT /streams/{stream-name}/records` (ci-dessus). Un autre format est utilisé pour la méthode `PUT /streams/{stream-name}/record` (dans la procédure précédente). Dans un environnement de production, vous devez maintenir la cohérence des deux formats. 

1. 

    Pour tester la méthode `PUT /streams/{stream-name}/records`, définissez la variable de chemin `stream-name` sur un flux existant, fournissez la charge utile suivante, puis envoyez la demande de méthode. 

   ```
   {
       "records": [
           {
               "data": "some data",
               "partition-key": "some key"
           },
           {
               "data": "some other data",
               "partition-key": "some key"
           }
       ]
   }
   ```

   Si le test aboutit, le résultat est une réponse 200 OK avec une charge utile semblable à la sortie suivante : 

   ```
   {
     "FailedRecordCount": 0,
     "Records": [
       {
         "SequenceNumber": "49559409944537880850133345460167468741933742152373764162",
         "ShardId": "shardId-000000000004"
       },
       {
         "SequenceNumber": "49559409944537880850133345460168677667753356781548470338",
         "ShardId": "shardId-000000000004"
       }
     ]
   }
   ```

**Pour configurer et tester la méthode `GET /streams/{stream-name}/sharditerator`, appelez `GetShardIterator` dans Kinesis**

La méthode `GET /streams/{stream-name}/sharditerator` est une méthode d’assistance permettant d’acquérir un itérateur de partition requis avant d’appeler la méthode `GET /streams/{stream-name}/records`.

1. Sélectionnez la ressource **/sharditerator**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **GetShardIterator**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Choisissez **Paramètres de chaîne de requête d’URL**.

   L’action `GetShardIterator` nécessite une valeur ShardId en entrée. Pour transmettre une valeur `ShardId` fournie par le client, nous ajoutons un paramètre de requête `shard-id` à la requête de méthode, comme indiqué dans l’étape suivante. 

1. Sélectionnez **Add query string** (Ajouter une chaîne de requêtes).

1. Pour **Nom**, saisissez **shard-id**.

1. Gardez **Obligatoire** et **Mise en cache** désactivés.

1. Choisissez **Créer une méthode**.

1. Dans la section **Requête d’intégration**, ajoutez le modèle de mappage pour générer l’entrée requise (`ShardId` et `StreamName`) pour l’action `GetShardIterator` à partir des paramètres `shard-id` et `stream-name` de la requête de méthode. En outre, le modèle de mappage définit également `ShardIteratorType` à `TRIM_HORIZON` en tant que valeur par défaut.

   ```
   {
       "ShardId": "$input.params('shard-id')",
       "ShardIteratorType": "TRIM_HORIZON",
       "StreamName": "$input.params('stream-name')"
   }
   ```

1.  À l’aide de l’option **Test** de la console API Gateway, entrez un nom de flux existant en tant que valeur de variable `stream-name` **Path (Chemin)**, définissez la `shard-id` **chaîne de requête** sur une valeur `ShardId` existante (par exemple, `shard-000000000004`) et choisissez **Test**. 

    Si le test aboutit, la charge utile de la réponse est similaire à la sortie suivante : 

   ```
   {
     "ShardIterator": "AAAAAAAAAAFYVN3VlFy..."
   }
   ```

   Notez la valeur `ShardIterator`. Vous en avez besoin pour obtenir les enregistrements d’un flux.

**Pour configurer et tester la méthode `GET /streams/{stream-name}/records` pour appeler l’action `GetRecords` dans Kinesis**

1. Sélectionnez **/records**, puis choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez **GET**.

1. Pour **Type d’intégration**, sélectionnez **Service AWS **.

1. Pour **Région AWS**, sélectionnez l' Région AWS endroit où vous avez créé votre flux Kinesis. 

1. Pour **Service AWS**, sélectionnez **Kinesis**.

1. Laissez **Sous-domaine AWS ** vide.

1. Dans le champ **HTTP Method**, sélectionnez **POST**.

1. Pour **Type d’action**, choisissez **Utiliser un nom d’action**.

1. Pour **Nom de l’action**, saisissez **GetRecords**.

1. Pour **Rôle d’exécution**, saisissez l’ARN de votre rôle d’exécution.

1. Conservez la valeur par défaut de **Transmettre** pour **Gestion de contenu**.

1. Développez **En-têtes de demande HTTP**.

    L’action `GetRecords` nécessite une valeur `ShardIterator` en entrée. Pour transmettre une valeur `ShardIterator` fournie par le client, nous ajoutons un paramètre d’en-tête `Shard-Iterator` à la demande de méthode.

1. Sélectionnez **Add header**.

1. Pour **Nom**, saisissez **Shard-Iterator**.

1. Gardez **Obligatoire** et **Mise en cache** désactivés.

1. Choisissez **Créer une méthode**.

1.  Dans la section **Requête d’intégration**, ajoutez le modèle de mappage suivant pour mapper la valeur du paramètre d’en-tête `Shard-Iterator` à la valeur de propriété `ShardIterator` de la charge utile JSON pour l’action `GetRecords` dans Kinesis. 

   ```
   {
       "ShardIterator": "$input.params('Shard-Iterator')"
   }
   ```

1.  À l’aide de l’option **Tester** dans la console API Gateway, saisissez un nom de flux existant comme valeur de variable `stream-name` **Chemin**, définissez l’**en-tête** `Shard-Iterator` sur la valeur `ShardIterator` obtenue à partir de l’exécution de test de la méthode `GET /streams/{stream-name}/sharditerator` (ci-dessus) et choisissez **Tester**. 

    Si le test aboutit, la charge utile de la réponse est similaire à la sortie suivante : 

   ```
   {
     "MillisBehindLatest": 0,
     "NextShardIterator": "AAAAAAAAAAF...",
     "Records": [ ... ]
   }
   ```

# Définitions OpenAPI d’un exemple d’API en tant que proxy Kinesis
<a name="api-as-kinesis-proxy-export-swagger-with-extensions"></a>

Vous trouverez ci-après des définitions OpenAPI pour l’exemple d’API en tant que proxy Kinesis utilisé dans ce didacticiel. 

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi": "3.0.0",
  "info": {
    "title": "KinesisProxy",
    "version": "2016-03-31T18:25:32Z"
  },
  "paths": {
    "/streams/{stream-name}/sharditerator": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "shard-id",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardId\": \"$input.params('shard-id')\",\n    \"ShardIteratorType\": \"TRIM_HORIZON\",\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/records": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Shard-Iterator",
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardIterator\": \"$input.params('Shard-Iterator')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "put": {
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
              }
            },
            "application/x-amz-json-1.1": {
              "schema": {
                "$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Records\": [\n          {\n            \"Data\": \"$util.base64Encode($elem.data)\",\n            \"PartitionKey\": \"$elem.partition-key\"\n          }#if($foreach.hasNext),#end\n    ]\n}",
            "application/x-amz-json-1.1": "{\n  \"StreamName\": \"$input.params('stream-name')\",\n  \"records\" : [\n    {\n        \"Data\" : \"$elem.data\",\n        \"PartitionKey\" : \"$elem.partition-key\"\n    }#if($foreach.hasNext),#end\n  ]\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "post": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardCount\": 5,\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "delete": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          },
          "400": {
            "description": "400 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {}
          },
          "500": {
            "description": "500 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {}
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/record": {
      "put": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n    \"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Empty": {
        "type": "object"
      },
      "PutRecordsMethodRequestPayload": {
        "type": "object",
        "properties": {
          "records": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "string"
                },
                "partition-key": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-03-31T18:25:32Z",
    "title": "KinesisProxy"
  },
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/streams": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardCount\": 5,\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "delete": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response",
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "500": {
            "description": "500 response",
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/record": {
      "put": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n    \"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/records": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "Shard-Iterator",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardIterator\": \"$input.params('Shard-Iterator')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "put": {
        "consumes": [
          "application/json",
          "application/x-amz-json-1.1"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "PutRecordsMethodRequestPayload",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PutRecordsMethodRequestPayload"
            }
          },
          {
            "in": "body",
            "name": "PutRecordsMethodRequestPayload",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PutRecordsMethodRequestPayload"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Records\": [\n          {\n            \"Data\": \"$util.base64Encode($elem.data)\",\n            \"PartitionKey\": \"$elem.partition-key\"\n          }#if($foreach.hasNext),#end\n    ]\n}",
            "application/x-amz-json-1.1": "{\n  \"StreamName\": \"$input.params('stream-name')\",\n  \"records\" : [\n    {\n        \"Data\" : \"$elem.data\",\n        \"PartitionKey\" : \"$elem.partition-key\"\n    }#if($foreach.hasNext),#end\n  ]\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/sharditerator": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "shard-id",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardId\": \"$input.params('shard-id')\",\n    \"ShardIteratorType\": \"TRIM_HORIZON\",\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    }
  },
  "definitions": {
    "Empty": {
      "type": "object"
    },
    "PutRecordsMethodRequestPayload": {
      "type": "object",
      "properties": {
        "records": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string"
              },
              "partition-key": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}
```

------

# Tutoriel : Création d'une API REST à l'aide AWS SDKs du AWS CLI
<a name="api-gateway-create-api-cli-sdk"></a>

Utilisez le didacticiel suivant pour créer une PetStore API prenant en charge les `GET /pets/{petId}` méthodes `GET /pets` et. Ces méthodes sont intégrées avec un point de terminaison HTTP. Vous pouvez suivre ce didacticiel en utilisant le AWS SDK pour JavaScript, le SDK pour Python (Boto3) ou le. AWS CLI Vous pouvez utiliser les fonctions ou commandes suivantes pour configurer votre API :

------
#### [ JavaScript v3 ]
+ [ CreateRestApiCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/CreateRestApiCommand/)
+ [ CreateResourceCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/CreateResourceCommand/)
+ [ PutMethodCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutMethodCommand/)
+ [ PutMethodResponseCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutMethodResponseCommand/)
+ [ PutIntegrationCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutIntegrationCommand/)
+ [ PutIntegrationResponseCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutIntegrationResponseCommand/)
+ [ CreateDeploymentCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/CreateDeploymentCommand/)

------
#### [ Python ]
+ [ create\$1rest\$1api](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/create_rest_api.html)
+ [ create\$1resource](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/create_resource.html)
+ [ put\$1method](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_method.html)
+ [ put\$1method\$1response](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_method_response.html)
+ [ put\$1integration](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_integration.html)
+ [ put\$1integration\$1response](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_integration_response.html)
+ [ create\$1deployment](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/create_deployment.html)

------
#### [ AWS CLI ]
+ [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html)
+  [create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) 
+  [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) 
+  [put-method-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method-response.html) 
+  [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) 
+  [put-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration-response.html) 
+  [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) 

------

Pour plus d'informations sur le AWS SDK pour la JavaScript version 3, voir À [quoi sert le AWS SDK ? JavaScript](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html) . Pour plus d’informations sur le kit SDK pour Python (Boto3), consultez [AWS SDK pour Python (Boto3)](https://docs.aws.amazon.com/pythonsdk). Pour plus d'informations sur le AWS CLI, voir [Qu'est-ce que le AWS CLI ?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) .

## Configuration d'une API optimisée pour les périphériques PetStore
<a name="api-gateway-create-api-cli-sdk-tutorial"></a>

Dans ce didacticiel, les exemples de commandes utilisent des valeurs d'espace réservé pour des valeurs IDs telles que l'ID d'API et l'ID de ressource. Lorsque vous réalisez ce didacticiel, remplacez ces valeurs par les vôtres.

**Pour configurer une API optimisée pour les périphériques à l'aide PetStore de AWS SDKs**

1. Utilisez l’exemple suivant pour créer une entité `RestApi` :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient, CreateRestApiCommand} from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateRestApiCommand({
       name: "Simple PetStore (JavaScript v3 SDK)",
       description: "Demo API created using the AWS SDK for JavaScript v3",
       version: "0.00.001",
       binaryMediaTypes: [
       '*']
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.error(Couldn't create API:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie l’ID d’API et l’ID de ressource racine de votre API dans une sortie similaire à la suivante :

   ```
   {
     id: 'abc1234',
     name: 'PetStore (JavaScript v3 SDK)',
     description: 'Demo API created using the AWS SDK for node.js',
     createdDate: 2017-09-05T19:32:35.000Z,
     version: '0.00.001',
     rootResourceId: 'efg567'
     binaryMediaTypes: [ '*' ] 
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_rest_api(
           name='Simple PetStore (Python SDK)',
           description='Demo API created using the AWS SDK for Python',
           version='0.00.001',
           binaryMediaTypes=[
               '*'
           ]
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Couldn't create REST API %s.", error)
       raise
   attribute=["id","name","description","createdDate","version","binaryMediaTypes","apiKeySource","endpointConfiguration","disableExecuteApiEndpoint","rootResourceId"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie l’ID d’API et l’ID de ressource racine de votre API dans une sortie similaire à la suivante :

   ```
   {'id': 'abc1234', 'name': 'Simple PetStore (Python SDK)', 'description': 'Demo API created using the AWS SDK for Python', 'createdDate': datetime.datetime(2024, 4, 3, 14, 31, 39, tzinfo=tzlocal()), 'version': '0.00.001', 'binaryMediaTypes': ['*'], 'apiKeySource': 'HEADER', 'endpointConfiguration': {'types': ['EDGE']}, 'disableExecuteApiEndpoint': False, 'rootResourceId': 'efg567'}
   ```

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

   ```
   aws apigateway create-rest-api --name 'Simple PetStore (AWS CLI)' --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "id": "abcd1234", 
       "name": "Simple PetStore (AWS CLI)", 
       "createdDate": "2022-12-15T08:07:04-08:00",
       "apiKeySource": "HEADER",
       "endpointConfiguration": {
           "types": [
               "EDGE"
           ]
       },
       "disableExecuteApiEndpoint": false,
       "rootResourceId": "efg567"
   }
   ```

------

   L’API que vous avez créée possède l’ID d’API `abcd1234` et l’ID de ressource racine `efg567`. Vous allez utiliser ces valeurs pour configurer votre API.

1. Ensuite, vous allez ajouter une ressource enfant sous la racine et spécifier `RootResourceId` comme valeur de la propriété `parentId`. Utilisez l’exemple suivant pour créer une ressource `/pets` pour votre API :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  CreateResourceCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateResourceCommand({
       restApiId: 'abcd1234',
       parentId: 'efg567',
       pathPart: 'pets'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The '/pets' resource setup failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie des informations sur votre ressource dans une sortie similaire à la suivante :

   ```
   {
       "path": "/pets", 
       "pathPart": "pets", 
       "id": "aaa111", 
       "parentId": "efg567'"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_resource(
           restApiId='abcd1234',
           parentId='efg567',
           pathPart='pets'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The '/pets' resource setup failed: %s.", error)
       raise
   attribute=["id","parentId", "pathPart", "path",]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie des informations sur votre ressource dans une sortie similaire à la suivante :

   ```
   {'id': 'aaa111', 'parentId': 'efg567', 'pathPart': 'pets', 'path': '/pets'}
   ```

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

   ```
   aws apigateway create-resource --rest-api-id abcd1234 \
     --region us-west-2 \
     --parent-id efg567 \
     --path-part pets
   ```

   Voici la sortie de cette commande :

   ```
   {
       "id": "aaa111", 
       "parentId": "efg567",
       "pathPart": "pets",
       "path": "/pets"
   }
   ```

------

   La ressource `/pets` que vous avez créée possède l’ID de ressource `aaa111`. Vous allez utiliser cette valeur pour configurer votre API.

1. Ensuite, vous allez ajouter une ressource enfant sous la ressource `/pets`. La ressource enfant `/{petId}` possède un paramètre de chemin pour `{petId}`. Pour qu’un chemin fasse partie d’un paramètre de chemin, vous devez l’entourer d’une paire d’accolades, `{ }`. Utilisez l’exemple suivant pour créer une ressource `/pets/{petId}` pour votre API :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  CreateResourceCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateResourceCommand({
       restApiId: 'abcd1234',
       parentId: 'aaa111',
       pathPart: '{petId}'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The '/pets/{petId}' resource setup failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie des informations sur votre ressource dans une sortie similaire à la suivante :

   ```
   {
       "path": "/pets/{petId}", 
       "pathPart": "{petId}", 
       "id": "bbb222", 
       "parentId": "aaa111'"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_resource(
           restApiId='abcd1234',
           parentId='aaa111',
           pathPart='{petId}'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The '/pets/{petId}' resource setup failed: %s.", error)
       raise
   attribute=["id","parentId", "pathPart", "path",]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie des informations sur votre ressource dans une sortie similaire à la suivante :

   ```
   {'id': 'bbb222', 'parentId': 'aaa111', 'pathPart': '{petId}', 'path': '/pets/{petId}'}
   ```

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

   ```
   aws apigateway create-resource --rest-api-id abcd1234 \
     --region us-west-2 \
     --parent-id aaa111 \
     --path-part '{petId}'
   ```

   Voici la sortie de cette commande :

   ```
   {
       "id": "bbb222",
       "parentId": "aaa111",
       "path": "/pets/{petId}", 
       "pathPart": "{petId}"
   }
   ```

------

   La ressource `/pets/{petId}` que vous avez créée possède l’ID de ressource `bbb222`. Vous allez utiliser cette valeur pour configurer votre API.

1. Au cours des deux étapes suivantes, vous allez ajouter des méthodes HTTP à vos ressources. Dans ce didacticiel, vous allez définir les méthodes pour qu’elles soient en accès libre en définissant `authorization-type` sur `NONE`. Pour autoriser uniquement les utilisateurs authentifiés à appeler la méthode, vous pouvez utiliser des rôles et des politiques IAM, un mécanisme d’autorisation Lambda (anciennement appelé mécanisme d’autorisation personnalisée) ou un groupe d’utilisateurs Amazon Cognito. Pour de plus amples informations, veuillez consulter [Contrôler et gérer l'accès à REST APIs dans API Gateway](apigateway-control-access-to-api.md).

   Utilisez l’exemple suivant pour ajouter la méthode HTTP `GET` à la ressource `/pets` :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       authorizationType: 'NONE'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets' method setup failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "GET", 
       "authorizationType": "NONE"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           authorizationType='NONE'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The 'GET /pets' method setup failed: %s", error)
       raise
   attribute=["httpMethod","authorizationType","apiKeyRequired"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'httpMethod': 'GET', 'authorizationType': 'NONE', 'apiKeyRequired': False}
   ```

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

   ```
   aws apigateway put-method --rest-api-id abcd1234 \
     --resource-id aaa111 \
     --http-method GET \
     --authorization-type "NONE" \
     --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "httpMethod": "GET", 
       "authorizationType": "NONE",
       "apiKeyRequired": false
   }
   ```

------

1. Utilisez l’exemple suivant pour ajouter la méthode HTTP `GET` à la ressource `/pets/{petId}` et définir la propriété `requestParameters` de manière à ce qu’elle transmettre la valeur `petId` fournie par le client au backend :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       authorizationType: 'NONE'
       requestParameters: {
           "method.request.path.petId" : true
       }
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets/{petId}' method setup failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "GET", 
       "authorizationType": "NONE",
       "requestParameters": {
          "method.request.path.petId": true
       }
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           authorizationType='NONE',
           requestParameters={
               "method.request.path.petId": True
           }
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The 'GET /pets/{petId}' method setup failed: %s", error)
       raise
   attribute=["httpMethod","authorizationType","apiKeyRequired", "requestParameters" ]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'httpMethod': 'GET', 'authorizationType': 'NONE', 'apiKeyRequired': False, 'requestParameters': {'method.request.path.petId': True}}
   ```

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

   ```
   aws apigateway put-method --rest-api-id abcd1234 \
     --resource-id bbb222 --http-method GET \
     --authorization-type "NONE" \
     --region us-west-2 \
     --request-parameters method.request.path.petId=true
   ```

   Voici la sortie de cette commande :

   ```
   {
       "httpMethod": "GET", 
       "authorizationType": "NONE", 
       "apiKeyRequired": false, 
       "requestParameters": {
           "method.request.path.petId": true
       }
   }
   ```

------

1. Utilisez l’exemple suivant pour ajouter la réponse de la méthode 200 OK à la méthode `GET /pets` :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       statusCode: '200'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the 200 OK response for the 'GET /pets' method failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method_response(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           statusCode='200'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the 200 OK response for the 'GET /pets' method failed %s.", error)
       raise
   attribute=["statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   logger.info(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-method-response --rest-api-id abcd1234 \ 
     --resource-id aaa111 --http-method GET \
     --status-code 200  --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "statusCode": "200"
   }
   ```

------

1. Utilisez l’exemple suivant pour ajouter la réponse de la méthode 200 OK à la méthode `GET /pets/{petId}` :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       statusCode: '200'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the 200 OK response for the 'GET /pets/{petId}' method failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method_response(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           statusCode='200'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the 200 OK response for the 'GET /pets/{petId}' method failed %s.", error)
       raise
   attribute=["statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   logger.info(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-method-response --rest-api-id abcd1234 \ 
     --resource-id bbb222 --http-method GET \
     --status-code 200  --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "statusCode": "200"
   }
   ```

------

1. Utilisez l’exemple suivant pour configurer une intégration pour la méthode `GET /pets` avec un point de terminaison HTTP. Le point de terminaison HTTP est `http://petstore-demo-endpoint.execute-api.com/petstore/pets`.

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       type: 'HTTP',
       integrationHttpMethod: 'GET',
       uri: 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the integration of the 'GET /pets' method of the API failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "httpMethod": "GET", 
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "type": "HTTP", 
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets", 
       "cacheNamespace": "ccc333"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           type='HTTP',
           integrationHttpMethod='GET',
           uri='http://petstore-demo-endpoint.execute-api.com/petstore/pets'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration of the 'GET /' method of the API failed %s.", error)
       raise
   attribute=["httpMethod","passthroughBehavior","cacheKeyParameters", "type", "uri", "cacheNamespace"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'httpMethod': 'GET', 'passthroughBehavior': 'WHEN_NO_MATCH', 'cacheKeyParameters': [], 'type': 'HTTP', 'uri': 'http://petstore-demo-endpoint.execute-api.com/petstore/pets', 'cacheNamespace': 'ccc333'}
   ```

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

   ```
   aws apigateway put-integration --rest-api-id abcd1234 \
     --resource-id aaa111 --http-method GET --type HTTP \
     --integration-http-method GET \
     --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets' \
     --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "type": "HTTP",
       "httpMethod": "GET",
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
       "connectionType": "INTERNET",
       "passthroughBehavior": "WHEN_NO_MATCH",
       "timeoutInMillis": 29000,
       "cacheNamespace": "6sxz2j",
       "cacheKeyParameters": []
   }
   ```

------

1. Utilisez l’exemple suivant pour configurer une intégration pour la méthode `GET /pets/{petId}` avec un point de terminaison HTTP. Le point de terminaison HTTP est `http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}`. À cette étape, vous allez mapper le paramètre de chemin `petId` à celui du point de terminaison d’intégration de `id`.

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       type: 'HTTP',
       integrationHttpMethod: 'GET',
       uri: 'http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}'
       requestParameters: {
           "integration.request.path.id": "method.request.path.petId"
        }
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the integration of the 'GET /pets/{petId}' method of the API failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "httpMethod": "GET", 
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "type": "HTTP", 
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}", 
       "cacheNamespace": "ddd444",
       "requestParameters": {
          "integration.request.path.id": "method.request.path.petId"
       }
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration(
           restApiId='ieps9b05sf',
           resourceId='t8zeb4',
           httpMethod='GET',
           type='HTTP',
           integrationHttpMethod='GET',
           uri='http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}',
           requestParameters={
               "integration.request.path.id": "method.request.path.petId"
           }
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration of the 'GET /pets/{petId}' method of the API failed %s.", error)
       raise
   attribute=["httpMethod","passthroughBehavior","cacheKeyParameters", "type", "uri", "cacheNamespace", "requestParameters"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'httpMethod': 'GET', 'passthroughBehavior': 'WHEN_NO_MATCH', 'cacheKeyParameters': [], 'type': 'HTTP', 'uri': 'http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}', 'cacheNamespace': 'ddd444', 'requestParameters': {'integration.request.path.id': 'method.request.path.petId'}}}
   ```

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

   ```
   aws apigateway put-integration --rest-api-id abcd1234 \
     --resource-id bbb222 --http-method GET --type HTTP \
     --integration-http-method GET \
     --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}' \ 
     --request-parameters '{"integration.request.path.id":"method.request.path.petId"}' \
     --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "type": "HTTP",
       "httpMethod": "GET",
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
       "connectionType": "INTERNET",
       "requestParameters": {
           "integration.request.path.id": "method.request.path.petId"
       },
       "passthroughBehavior": "WHEN_NO_MATCH",
       "timeoutInMillis": 29000,
       "cacheNamespace": "rjkmth",
       "cacheKeyParameters": []
   }
   ```

------

1. Utilisez l’exemple suivant pour ajouter la réponse d’intégration pour l’intégration `GET /pets` :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       statusCode: '200',
       selectionPattern: ''
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets' method integration response setup failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "selectionPattern": "", 
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration_response(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           statusCode='200',
           selectionPattern='',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration response of the 'GET /pets' method of the API failed: %s", error)
       raise
   attribute=["selectionPattern","statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'selectionPattern': "", 'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-integration-response --rest-api-id abcd1234 \
     --resource-id aaa111 --http-method GET \
     --status-code 200 --selection-pattern ""  \
     --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "statusCode": "200",
       "selectionPattern": "" 
   }
   ```

------

1. Utilisez l’exemple suivant pour ajouter la réponse d’intégration pour l’intégration `GET /pets/{petId}` :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       statusCode: '200',
       selectionPattern: ''
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets/{petId}' method integration response setup failed:\n", err)
   }
   })();
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {
       "selectionPattern": "", 
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration_response(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           statusCode='200',
           selectionPattern='',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration response of the 'GET /pets/{petId}' method of the API failed: %s", error)
       raise
   attribute=["selectionPattern","statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Un appel réussi renvoie une sortie similaire à la suivante :

   ```
   {'selectionPattern': "", 'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-integration-response --rest-api-id abcd1234 \
     --resource-id bbb222 --http-method GET 
     --status-code 200 --selection-pattern ""  
     --region us-west-2
   ```

   Voici la sortie de cette commande :

   ```
   {
       "statusCode": "200",
       "selectionPattern": "" 
   }
   ```

------

   Une fois que vous avez créé la réponse d'intégration, votre API peut interroger les animaux de compagnie disponibles sur le PetStore site Web et consulter un animal individuel avec un identifiant spécifique. Avant que votre API puisse être appelée par vos clients, vous devez la déployer. Nous vous recommandons de la tester avant de la déployer.

1. Utilisez l’exemple suivant pour tester la méthode `GET /pets` : 

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  TestInvokeMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new TestInvokeMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       pathWithQueryString: '/',
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The test on 'GET /pets' method failed:\n", err)
   }
   })();
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.test_invoke_method(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           pathWithQueryString='/',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Test invoke method on 'GET /pets' failed: %s", error)
       raise
   print(result)
   ```

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

   ```
   aws apigateway test-invoke-method --rest-api-id abcd1234 /
     --resource-id aaa111 /
     --http-method GET /
     --path-with-query-string '/'
   ```

------

1. Utilisez l’exemple suivant pour tester la méthode `GET /pets/{petId}` avec une valeur `petId` de 3 :

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  TestInvokeMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new TestInvokeMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       pathWithQueryString: '/pets/3',
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The test on 'GET /pets/{petId}' method failed:\n", err)
   }
   })();
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.test_invoke_method(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           pathWithQueryString='/pets/3',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Test invoke method on 'GET /pets/{petId}' failed: %s", error)
       raise
   print(result)
   ```

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

   ```
   aws apigateway test-invoke-method --rest-api-id abcd1234 /
     --resource-id bbb222 /
     --http-method GET /
     --path-with-query-string '/pets/3'
   ```

------

   Après avoir testé votre API, vous pouvez la déployer dans une étape.

1. Utilisez l’exemple suivant pour déployer votre API dans l’étape nommée `test`. Lorsque vous déployez votre API dans une étape, les appelants d’API peuvent invoquer votre API.

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  CreateDeploymentCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateDeploymentCommand({
       restApiId: 'abcd1234',
       stageName: 'test',
       stageDescription: 'test deployment'
   });
   try {
       const results = await apig.send(command)
       console.log("Deploying API succeeded\n", results)
   } catch (err) {
       console.log("Deploying API failed:\n", err)
   }
   })();
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_deployment(
           restApiId='ieps9b05sf',
           stageName='test',
           stageDescription='my test stage',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Error deploying stage  %s.", error)
       raise
   print('Deploying API succeeded')
   print(result)
   ```

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

   ```
   aws apigateway create-deployment --rest-api-id abcd1234 \ 
     --region us-west-2 \
     --stage-name test \
     --stage-description 'Test stage' \
     --description 'First deployment'
   ```

   Voici la sortie de cette commande :

   ```
   {
       "id": "ab1c1d",
       "description": "First deployment",
       "createdDate": "2022-12-15T08:44:13-08:00"
   }
   ```

------

   Vos clients peuvent désormais appeler votre API. Vous pouvez tester cette API en saisissant l’URL `https://abcd1234.execute-api.us-west-2.amazonaws.com/test/pets` dans un navigateur et en remplaçant `abcd1234` par l’identifiant de votre API.

Pour plus d'exemples de création ou de mise à jour d'une API à l'aide de AWS SDKs ou de AWS CLI, consultez la section [Actions pour API Gateway en utilisant AWS SDKs](https://docs.aws.amazon.com/code-library/latest/ug/api-gateway_code_examples_actions.html).

## Automatisation de la configuration de votre API
<a name="api-gateway-create-api-cli-sdk-iac"></a>

Au lieu de créer votre API step-by-step, vous pouvez automatiser la création et le nettoyage des AWS ressources en utilisant OpenAPI CloudFormation ou Terraform pour créer votre API.

### Définition OpenAPI 3.0
<a name="api-gateway-create-api-cli-sdk-template-OpenAPI"></a>

Vous pouvez importer une définition OpenAPI dans API Gateway. Pour de plus amples informations, veuillez consulter [Développez REST APIs à l'aide d'OpenAPI dans API Gateway](api-gateway-import-api.md).

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "Simple PetStore (OpenAPI)",
    "description" : "Demo API created using OpenAPI",
    "version" : "2024-05-24T20:39:34Z"
  },
  "servers" : [ {
    "url" : "{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "Prod"
      }
    }
  } ],
  "paths" : {
    "/pets" : {
      "get" : {
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : { }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "http",
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "passthroughBehavior" : "when_no_match",
          "timeoutInMillis" : 29000
        }
      }
    },
    "/pets/{petId}" : {
      "get" : {
        "parameters" : [ {
          "name" : "petId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : { }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "http",
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.path.id" : "method.request.path.petId"
          },
          "passthroughBehavior" : "when_no_match",
          "timeoutInMillis" : 29000
        }
      }
    }
  },
  "components" : { }
}
```

### AWS CloudFormation modèle
<a name="api-gateway-create-api-cli-sdk-template-CloudFormation"></a>

Pour déployer votre CloudFormation modèle, consultez la section [Création d'une pile sur la AWS CloudFormation console](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html).

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: Simple PetStore (AWS CloudFormation)
  PetsResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'pets'
  PetIdResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !Ref PetsResource
      PathPart: '{petId}'
  PetsMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref PetsResource
      HttpMethod: GET
      AuthorizationType: NONE
      Integration:
        Type: HTTP
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
        IntegrationResponses:
          - StatusCode: '200'
      MethodResponses:
        - StatusCode: '200'
  PetIdMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref PetIdResource
      HttpMethod: GET
      AuthorizationType: NONE
      RequestParameters: 
        method.request.path.petId: true
      Integration:
        Type: HTTP
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}
        RequestParameters:
          integration.request.path.id: method.request.path.petId
        IntegrationResponses:
          - StatusCode: '200'
      MethodResponses:
        - StatusCode: '200'
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - PetsMethodGet
    Properties:
      RestApiId: !Ref Api
      StageName: Prod
Outputs:
  ApiRootUrl:
    Description: Root Url of the API
    Value: !Sub 'https://${Api}.execute-api.${AWS::Region}.amazonaws.com/Prod'
```

### Configuration de Terraform
<a name="api-gateway-create-api-cli-sdk-template-terraform"></a>

Pour plus d’informations sur Terraform, consultez [Terraform](https://developer.hashicorp.com/terraform/intro).

```
provider "aws" {
  region = "us-east-1" # Update with your desired region
}
resource "aws_api_gateway_rest_api" "Api" {
  name        = "Simple PetStore (Terraform)"
  description = "Demo API created using Terraform"
}
resource "aws_api_gateway_resource" "petsResource"{
    rest_api_id = aws_api_gateway_rest_api.Api.id
    parent_id = aws_api_gateway_rest_api.Api.root_resource_id
    path_part = "pets"
}
resource "aws_api_gateway_resource" "petIdResource"{
    rest_api_id = aws_api_gateway_rest_api.Api.id
    parent_id = aws_api_gateway_resource.petsResource.id
    path_part = "{petId}"
}
resource "aws_api_gateway_method" "petsMethodGet" {
  rest_api_id   = aws_api_gateway_rest_api.Api.id
  resource_id   = aws_api_gateway_resource.petsResource.id
  http_method   = "GET"
  authorization = "NONE"
}


resource "aws_api_gateway_method_response" "petsMethodResponseGet" {
    rest_api_id = aws_api_gateway_rest_api.Api.id 
    resource_id = aws_api_gateway_resource.petsResource.id
    http_method = aws_api_gateway_method.petsMethodGet.http_method 
    status_code ="200"
}

resource "aws_api_gateway_integration" "petsIntegration" {
  rest_api_id = aws_api_gateway_rest_api.Api.id
  resource_id = aws_api_gateway_resource.petsResource.id
  http_method = aws_api_gateway_method.petsMethodGet.http_method
  type        = "HTTP"
  
  uri                     = "http://petstore-demo-endpoint.execute-api.com/petstore/pets"
  integration_http_method = "GET"
  depends_on              = [aws_api_gateway_method.petsMethodGet]
}

resource "aws_api_gateway_integration_response" "petsIntegrationResponse" {
    rest_api_id = aws_api_gateway_rest_api.Api.id
    resource_id = aws_api_gateway_resource.petsResource.id
    http_method = aws_api_gateway_method.petsMethodGet.http_method
    status_code = aws_api_gateway_method_response.petsMethodResponseGet.status_code
}

resource "aws_api_gateway_method" "petIdMethodGet" {
    rest_api_id   = aws_api_gateway_rest_api.Api.id
    resource_id   = aws_api_gateway_resource.petIdResource.id
    http_method   = "GET"
    authorization = "NONE"
    request_parameters = {"method.request.path.petId" = true}
}

resource "aws_api_gateway_method_response" "petIdMethodResponseGet" {
    rest_api_id = aws_api_gateway_rest_api.Api.id 
    resource_id = aws_api_gateway_resource.petIdResource.id
    http_method = aws_api_gateway_method.petIdMethodGet.http_method 
    status_code ="200"
}


resource "aws_api_gateway_integration" "petIdIntegration" {
    rest_api_id = aws_api_gateway_rest_api.Api.id
    resource_id = aws_api_gateway_resource.petIdResource.id
    http_method = aws_api_gateway_method.petIdMethodGet.http_method
    type        = "HTTP"
    uri                     = "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}"
    integration_http_method = "GET"
    request_parameters = {"integration.request.path.id" = "method.request.path.petId"}
    depends_on              = [aws_api_gateway_method.petIdMethodGet]
}

resource "aws_api_gateway_integration_response" "petIdIntegrationResponse" {
    rest_api_id = aws_api_gateway_rest_api.Api.id
    resource_id = aws_api_gateway_resource.petIdResource.id
    http_method = aws_api_gateway_method.petIdMethodGet.http_method
    status_code = aws_api_gateway_method_response.petIdMethodResponseGet.status_code
}


resource "aws_api_gateway_deployment" "Deployment" {
  rest_api_id = aws_api_gateway_rest_api.Api.id
  depends_on  = [aws_api_gateway_integration.petsIntegration,aws_api_gateway_integration.petIdIntegration ]
}
resource "aws_api_gateway_stage" "Stage" {
  stage_name    = "Prod"
  rest_api_id   = aws_api_gateway_rest_api.Api.id
  deployment_id = aws_api_gateway_deployment.Deployment.id
}
```

# Didacticiel : création d’une API REST privée
<a name="private-api-tutorial"></a>

Dans ce didacticiel, vous créez une API REST privée. Les clients peuvent accéder à l’API uniquement à partir de votre Amazon VPC. L’API est isolée de l’Internet public, ce qui est une exigence de sécurité commune.

Ce didacticiel vous prendra environ 30 minutes. Tout d'abord, vous utilisez un CloudFormation modèle pour créer un Amazon VPC, un point de terminaison VPC, une AWS Lambda fonction, puis vous lancez une instance Amazon EC2 que vous utiliserez pour tester votre API. Ensuite, vous l'utilisez AWS Management Console pour créer une API privée et y associer une politique de ressources qui autorise l'accès uniquement depuis votre point de terminaison VPC. Enfin, vous testez votre API. 

![\[Vue d’ensemble de l’API privée que vous créez dans ce didacticiel.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/private-api-tutorial-diagram.png)


Pour suivre ce didacticiel, vous avez besoin d'un AWS compte et d'un Gestion des identités et des accès AWS utilisateur disposant d'un accès à la console. Pour de plus amples informations, veuillez consulter [Configuration d’API Gateway avant son utilisation](setting-up.md).

Dans ce didacticiel, vous utiliserez l’ AWS Management Console. Pour un CloudFormation modèle qui crée cette API et toutes les ressources associées, consultez [template.yaml](samples/private-api-full-template.zip).

**Topics**
+ [

## Étape 1 : création de dépendances
](#private-api-tutorial-create-dependencies)
+ [

## Étape 2 : Créer une API privée
](#private-api-tutorial-create-api)
+ [

## Étape 3 : création d’une méthode et intégration
](#private-api-tutorial-create-method)
+ [

## Étape 4 : attacher une politique de ressources
](#private-api-tutorial-attach-resource-policy)
+ [

## Étape 5 : déploiement de votre API
](#private-api-tutorial-deploy-api)
+ [

## Étape 6 : vérifiez que votre API n’est pas accessible publiquement
](#private-api-tutorial-test-private-api)
+ [

## Étape 7 : connectez-vous à une instance dans votre VPC et appelez votre API
](#private-api-tutorial-connect-to-instance)
+ [

## Étape 8 : Nettoyage
](#private-api-tutorial-cleanup)
+ [

## Prochaines étapes : Automatisez avec CloudFormation
](#private-api-tutorial-next-steps)

## Étape 1 : création de dépendances
<a name="private-api-tutorial-create-dependencies"></a>

Téléchargez et décompressez [ce CloudFormation modèle](samples/private-api-starter-template.zip). Vous utilisez le modèle pour créer toutes les dépendances de votre API privée, y compris un Amazon VPC, un point de terminaison d’un VPC et une fonction Lambda qui sert de backend de votre API. Vous créerez l’API privée ultérieurement.

**Pour créer une CloudFormation pile**

1. Ouvrez la CloudFormation console à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Choisissez **Créer une pile**, puis choisissez **Avec de nouvelles ressources (standard).**

1. Dans **Spécifier le modèle**, choisissez **Charger un modèle de fichier**.

1. Sélectionnez le modèle que vous avez téléchargé.

1. Choisissez **Suivant**. 

1. Pour **Nom de la pile**, saisissez **private-api-tutorial**, puis choisissez **Suivant**.

1. Pour **Configurer les options de pile**, choisissez **Suivant**.

1. Pour les **fonctionnalités**, reconnaissez que CloudFormation vous pouvez créer des ressources IAM dans votre compte.

1. Choisissez **Suivant**, puis **Soumettre**.

CloudFormation fournit les dépendances de votre API, ce qui peut prendre quelques minutes. **Lorsque le statut de votre CloudFormation pile est **CREATE\$1COMPLETE**, choisissez Outputs.** Notez votre ID de point de terminaison d’un VPC. Vous en avez besoin pour les étapes ultérieures de ce didacticiel. 

## Étape 2 : Créer une API privée
<a name="private-api-tutorial-create-api"></a>

Vous créez une API privée pour autoriser uniquement les clients de votre VPC à y accéder.

**Pour créer une API privée**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez **Créer une API**, puis pour **API REST**, choisissez **Créer**.

1. Sous **API name (Nom de l’API)**, saisissez **private-api-tutorial**.

1. Pour **Type de point de terminaison d’API**, sélectionnez **Privé**.

1. Pour le point de **terminaison VPC IDs**, entrez l'ID du point de terminaison VPC dans les **sorties** de votre pile. CloudFormation 

1. Pour **Type d’adresse IP**, choisissez **Double pile**.

1. Sélectionnez **Create API** (Créer une API).

## Étape 3 : création d’une méthode et intégration
<a name="private-api-tutorial-create-method"></a>

Vous créez une méthode `GET` et l’intégration Lambda pour gérer les demandes `GET` à votre API. Lorsqu’un client appelle votre API, API Gateway envoie la demande à la fonction Lambda que vous avez créée à l’étape 1, puis renvoie une réponse au client.

**Pour créer une méthode et une intégration**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Choisissez **Créer une méthode**.

1. Pour **Type de méthode**, sélectionnez `GET`.

1. Pour **Type d’intégration**, sélectionnez **Fonction Lambda**.

1. Activez **Intégration de proxy Lambda**. Avec une intégration de proxy Lambda, API Gateway envoie un événement à Lambda avec une structure définie, et transforme la réponse de votre fonction Lambda en réponse HTTP.

1. Pour la **fonction Lambda**, choisissez la fonction que vous avez créée avec le CloudFormation modèle à l'étape 1. Le nom de la fonction commence par **private-api-tutorial**.

1. Choisissez **Créer une méthode**.

## Étape 4 : attacher une politique de ressources
<a name="private-api-tutorial-attach-resource-policy"></a>

Vous attachez une [politique de ressources](apigateway-resource-policies.md) à votre API qui permet aux clients d’appeler votre API uniquement via votre point de terminaison d’un VPC. Pour restreindre davantage l’accès à votre API, vous pouvez également configurer une [ politique de point de terminaison d’un VPC](apigateway-vpc-endpoint-policies.md) pour votre point de terminaison d’un VPC, ce n’est cependant pas nécessaire pour ce didacticiel.

**Pour attacher une politique de ressources**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Choisissez **Stratégie de ressources**, puis **Créer une stratégie**.

1. Saisissez la politique suivante. *vpceID*Remplacez-le par l'ID de point de terminaison de votre VPC figurant dans les **sorties** de votre CloudFormation stack.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*",
               "Condition": {
                   "StringNotEquals": {
                       "aws:sourceVpce": "vpce-abcd1234"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*"
           }
       ]
   }
   ```

------

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

## Étape 5 : déploiement de votre API
<a name="private-api-tutorial-deploy-api"></a>

Ensuite, vous déployez votre API pour la rendre disponible pour les clients de votre Amazon VPC.

**Pour déployer une API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Sélectionnez **Deploy API (Déployer une API)**.

1. Pour **Étape**, sélectionnez **Nouvelle étape**.

1. Sous **Stage name (Nom de l’étape)**, entrez **test**.

1. (Facultatif) Sous **Description**, entrez une description.

1. Choisissez **Deploy (Déployer)**.

Vous êtes désormais prêt à tester votre API.

## Étape 6 : vérifiez que votre API n’est pas accessible publiquement
<a name="private-api-tutorial-test-private-api"></a>

Utilisez `curl` pour vérifier que vous ne pouvez pas appeler votre API depuis l’extérieur de votre Amazon VPC.

**Pour tester votre API**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Choisissez votre API.

1. Dans le volet de navigation principal, choisissez **Étapes**, puis choisissez l’étape de **test**.

1. Sous **Détails de l’étape**, choisissez l’icône de copie pour copier l’URL d’invocation de votre API. L’URL ressemble à `https://abcdef123.execute-api.us-west-2.amazonaws.com/test`. Le point de terminaison d’un VPC que vous avez créé à l’étape 1 a un DNS privé activé de sorte que vous pouvez utiliser l’URL fournie pour appeler votre API.

1. Utilisez curl pour tenter d’appeler votre API depuis l’extérieur de votre VPC.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Curl indique que le point de terminaison de votre API ne peut pas être résolu. Si vous obtenez une réponse différente, revenez à l’étape 2 et assurez-vous que vous choisissez **Privé** pour le type de point de terminaison de votre API.

   ```
   curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

Ensuite, vous vous connectez à une instance Amazon EC2 dans votre VPC pour appeler votre API.

## Étape 7 : connectez-vous à une instance dans votre VPC et appelez votre API
<a name="private-api-tutorial-connect-to-instance"></a>

Ensuite, vous testez votre API depuis votre Amazon VPC. Pour accéder à votre API privée, vous vous connectez à une instance Amazon EC2 dans votre VPC, puis utilisez curl pour appeler votre API. Vous utilisez le Gestionnaire de session Systems Manager pour vous connecter à votre instance dans le navigateur.

**Pour tester votre API**

1. Ouvrez la console Amazon EC2 à l’adresse [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. Choisissez **Instances**.

1. Choisissez l'instance nommée **private-api-tutorial**que vous avez créée avec le CloudFormation modèle à l'étape 1.

1. Choisissez **Connecter**, puis **Session Manager**.

1. Choisissez **Connecter** pour lancer une session basée sur un navigateur vers votre instance.

1. Dans votre session Session Manager, utilisez curl pour appeler votre API. Vous pouvez appeler votre API car vous utilisez une instance dans votre Amazon VPC.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Vérifiez que vous obtenez la réponse `Hello from Lambda!`.

![\[Vous utilisez Session Manager pour appeler votre API depuis votre Amazon VPC.\]](http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/images/private-api-tutorial-invoke.png)


Vous avez créé avec succès une API accessible uniquement à partir de votre Amazon VPC, puis vous avez vérifié qu’elle fonctionne.

## Étape 8 : Nettoyage
<a name="private-api-tutorial-cleanup"></a>

Pour éviter des coûts inutiles, supprimez les ressources que vous avez créées dans le cadre de ce didacticiel. Les étapes suivantes suppriment votre API REST et votre CloudFormation stack.

**Pour supprimer une API REST**

1. Connectez-vous à la console API Gateway à l'adresse [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Sur la **APIs**page, sélectionnez une API. Choisissez **Actions d’API**, choisissez **Supprimer l’API**, puis confirmez votre choix.

**Pour supprimer une CloudFormation pile**

1. Ouvrez la CloudFormation console à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Sélectionnez votre CloudFormation pile.

1. Choisissez **Supprimer**, puis confirmez votre choix.

## Prochaines étapes : Automatisez avec CloudFormation
<a name="private-api-tutorial-next-steps"></a>

Vous pouvez automatiser la création et le nettoyage de toutes les AWS ressources impliquées dans ce didacticiel. Pour un exemple complet de modèle CloudFormation , veuillez consulter [template.yaml](samples/private-api-full-template.zip).