

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.

# Tutoriel : Création d'une application de recherche avec Amazon OpenSearch Service
<a name="search-example"></a>

Une méthode courante pour créer une application de recherche avec Amazon OpenSearch Service consiste à utiliser des formulaires Web pour envoyer les requêtes des utilisateurs à un serveur. Vous pouvez ensuite autoriser le serveur à les appeler OpenSearch APIs directement et demander au serveur d'envoyer des demandes au OpenSearch Service. Toutefois, si vous souhaitez écrire du code côté client qui ne repose sur aucun serveur, vous devez compenser les risques de sécurité et de performances. OpenSearch APIs Il est déconseillé d'autoriser l'accès public non signé au. Les utilisateurs risquent d'accéder à des points de terminaison non sécurisés, ou d'impacter les performances du cluster via des requêtes trop étendues (ou trop nombreuses).

Ce chapitre présente une solution : utilisez Amazon API Gateway pour limiter les utilisateurs à un sous-ensemble de l'API Gateway AWS Lambda to Service OpenSearch APIs et pour signer les demandes émanant d'API Gateway to OpenSearch Service.

![\[Schéma de flux de l'application de recherche.\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/search-application-diagram.png)


**Note**  
La tarification API Gateway et Lambda standard s'applique, mais les coûts devraient être négligeables dans le cadre de l'utilisation limitée de ce tutoriel.

## Conditions préalables
<a name="search-example-prereq"></a>

La condition préalable à ce didacticiel est un domaine OpenSearch de service. Si vous n'en avez pas déjà un, suivez les étapes décrites dans [Créer un domaine OpenSearch de service](gsgcreate-domain.md) pour en créer un.

## Étape 1 : Indexer des exemples de données
<a name="search-example-index"></a>

Téléchargez [sample-movies.zip](samples/sample-movies.zip), décompressez-le et utilisez l'opération d'API [\$1bulk](https://opensearch.org/docs/latest/api-reference/document-apis/bulk/) pour ajouter les 5 000 documents à l'index `movies` :

```
POST https://search-my-domain.us-west-1.es.amazonaws.com/_bulk
{ "index": { "_index": "movies", "_id": "tt1979320" } }
{"directors":["Ron Howard"],"release_date":"2013-09-02T00:00:00Z","rating":8.3,"genres":["Action","Biography","Drama","Sport"],"image_url":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg","plot":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.","title":"Rush","rank":2,"running_time_secs":7380,"actors":["Daniel Brühl","Chris Hemsworth","Olivia Wilde"],"year":2013,"id":"tt1979320","type":"add"}
{ "index": { "_index": "movies", "_id": "tt1951264" } }
{"directors":["Francis Lawrence"],"release_date":"2013-11-11T00:00:00Z","genres":["Action","Adventure","Sci-Fi","Thriller"],"image_url":"http://ia.media-imdb.com/images/M/MV5BMTAyMjQ3OTAxMzNeQTJeQWpwZ15BbWU4MDU0NzA1MzAx._V1_SX400_.jpg","plot":"Katniss Everdeen and Peeta Mellark become targets of the Capitol after their victory in the 74th Hunger Games sparks a rebellion in the Districts of Panem.","title":"The Hunger Games: Catching Fire","rank":4,"running_time_secs":8760,"actors":["Jennifer Lawrence","Josh Hutcherson","Liam Hemsworth"],"year":2013,"id":"tt1951264","type":"add"}
...
```

Notez que ce qui précède est un exemple de commande avec un petit sous-ensemble des données disponibles. Pour effectuer l'`_bulk`opération, vous devez copier et coller l'intégralité du contenu du `sample-movies` fichier. Pour de plus amples instructions, voir[Option 2 : Charger plusieurs documents](gsgupload-data.md#gsgmultiple-document).

Vous pouvez également utiliser la commande curl suivante pour obtenir le même résultat : 

```
curl -XPOST -u 'master-user:master-user-password' 'domain-endpoint/_bulk' --data-binary @bulk_movies.json -H 'Content-Type: application/json'
```

## Étape 2 : Création et déploiement de la fonction Lambda
<a name="search-example-lambda"></a>

Avant de créer votre API dans API Gateway, créez la fonction Lambda à laquelle elle transmet les demandes.

### Créer la fonction Lambda
<a name="sample-lamdba-python"></a>

Dans cette solution, API Gateway transmet les requêtes à une fonction Lambda, qui interroge le OpenSearch service et renvoie les résultats. Comme cet exemple de fonction utilise des bibliothèques externes, vous devez créer un package de déploiement et le télécharger sur Lambda.

**Pour créer le package de déploiement**

1. Ouvrez une invite de commandes et créez un répertoire de projet `my-opensearch-function`. Par exemple, sur macOS :

   ```
   mkdir my-opensearch-function
   ```

1. Accédez au répertoire du projet `my-sourcecode-function`.

   ```
   cd my-opensearch-function
   ```

1. Copiez le contenu de l'exemple de code Python suivant et enregistrez-le dans un nouveau fichier nommé`opensearch-lambda.py`. Ajoutez votre région et votre point de terminaison hôte au fichier.

   ```
   import boto3
   import json
   import requests
   from requests_aws4auth import AWS4Auth
   
   region = '' # For example, us-west-1
   service = 'es'
   credentials = boto3.Session().get_credentials()
   awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
   
   host = '' # The OpenSearch domain endpoint with https:// and without a trailing slash
   index = 'movies'
   url = host + '/' + index + '/_search'
   
   # Lambda execution starts here
   def lambda_handler(event, context):
   
       # Put the user query into the query DSL for more accurate search results.
       # Note that certain fields are boosted (^).
       query = {
           "size": 25,
           "query": {
               "multi_match": {
                   "query": event['queryStringParameters']['q'],
                   "fields": ["title^4", "plot^2", "actors", "directors"]
               }
           }
       }
   
       # Elasticsearch 6.x requires an explicit Content-Type header
       headers = { "Content-Type": "application/json" }
   
       # Make the signed HTTP request
       r = requests.get(url, auth=awsauth, headers=headers, data=json.dumps(query))
   
       # Create the response and add some extra content to support CORS
       response = {
           "statusCode": 200,
           "headers": {
               "Access-Control-Allow-Origin": '*'
           },
           "isBase64Encoded": False
       }
   
       # Add the search results to the response
       response['body'] = r.text
       return response
   ```

1. Installez les bibliothèques externes dans un nouveau `package` répertoire.

   ```
   pip3 install --target ./package boto3
   pip3 install --target ./package requests
   pip3 install --target ./package requests_aws4auth
   ```

1. Créez un package de déploiement avec la bibliothèque installée à la racine. La commande suivante génère un `my-deployment-package.zip` fichier dans le répertoire de votre projet. 

   ```
   cd package
   zip -r ../my-deployment-package.zip .
   ```

1. Ajoutez le fichier `opensearch-lambda.py` à la racine du fichier .zip.

   ```
   cd ..
   zip my-deployment-package.zip opensearch-lambda.py
   ```

Pour plus d'informations sur la création de fonctions Lambda et des packages de déploiement, consultez [Déployer des fonctions Lambda Python avec des archives de fichiers .zip](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html) dans le *Guide du développeur AWS Lambda * et [Créer le package de déploiement Lambda](integrations-s3-lambda.md#integrations-s3-lambda-deployment-package) dans ce guide.

Pour créer votre fonction à l'aide de la console Lambda

1. [Accédez à la console Lambda à https://console.aws.amazon.com/lambda/ la maison.](https://console.aws.amazon.com/lambda/home ) Dans le volet de navigation de gauche, sélectionnez **Functions**.

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

1. Configurez les champs suivants :
   + Nom de la fonction : opensearch-function
   + Temps d'exécution : Python 3.9
   + Architecture : x86\$164

   Conservez toutes les autres options par défaut et choisissez **Créer une fonction**. 

1. Dans la section **Source du code** de la page de résumé des fonctions, choisissez le menu déroulant **Télécharger depuis** et sélectionnez le **fichier .zip.** Localisez le `my-deployment-package.zip` fichier que vous avez créé et choisissez **Enregistrer**.

1. Le *gestionnaire* est la méthode de votre code de fonction qui traite les événements. Sous **Paramètres d'exécution**, choisissez **Modifier et modifiez** le nom du gestionnaire en fonction du nom du fichier dans votre package de déploiement où se trouve la fonction Lambda. Puisque votre fichier est nommé`opensearch-lambda.py`, renommez le gestionnaire en. `opensearch-lambda.lambda_handler` Pour plus d'informations, consultez [Gestionnaire de fonctions Lambda dans Python](https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html).

## Étape 3 : Création de l'API dans API Gateway
<a name="search-example-api"></a>

L'utilisation d'API Gateway vous permet de créer une API plus limitée et de simplifier le processus d'interaction avec l' OpenSearch `_search`API. API Gateway vous permet également d'activer des fonctions de sécurité, telles que l'authentification Amazon Cognito et la limitation des demandes. Effectuez les étapes suivantes pour créer et déployer une API :

### Créer et configurer l'API
<a name="create-api"></a>

Pour créer votre API à l'aide de la console API Gateway

1. Accédez à la console API Gateway à l'[https://console.aws.amazon.com/apigateway/accueil](https://console.aws.amazon.com/apigateway/home ). Dans le volet de navigation de gauche, choisissez **APIs**.

1. Recherchez **API REST** (non privée) et choisissez **Créer**.

1. Sur la page suivante, recherchez la section **Créer une nouvelle API** et assurez-vous que l'option **Nouvelle API** est sélectionnée.

1. Configurez les champs suivants :
   + Nom d'API :**opensearch-api**
   + Description : **API publique pour rechercher un domaine Amazon OpenSearch Service**
   + Type de point de terminaison : **régional**

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

1. Choisissez **Actions** (Actions) et **Create Method** (Créer une méthode).

1. Choisissez **GET** dans la liste déroulante et cliquez sur la coche pour confirmer.

1. Configurez les paramètres suivants, puis cliquez sur **Save** (Enregistrer) :


| Paramètre | Value | 
| --- | --- | 
| Type d’intégration | Fonction Lambda | 
| Utiliser une intégration proxy Lambda | Oui | 
| Région Lambda | us-west-1 | 
| Fonction Lambda | opensearch-lambda | 
| Utiliser le délai d'attente par défaut | Oui | 

### Configurer la demande de méthode
<a name="method-request"></a>

Choisissez **Demande de méthode** et configurez les paramètres suivants :


| Paramètre | Value | 
| --- | --- | 
| Autorisation | NONE | 
| Validateur de demande |  Valider les paramètres et en-têtes des chaînes de requête   | 
| Clé d'API requise | false | 

Sous **Paramètres de chaîne de requête URL**, choisissez **Ajouter une chaîne de requête** et configurez le paramètre suivant :


| Paramètre | Value | 
| --- | --- | 
| Nom | q | 
| Obligatoire |  Oui  | 

### Déployer l'API et configurer une étape
<a name="deploy-api"></a>

 La console API Gateway vous permet de déployer une API en créant un déploiement et en l’associant à une étape nouvelle ou existante. 

1. Choisissez **Actions** (Actions) et **Deploy API** (Déployer l'API).

1. Pour **Étape de déploiement**, choisissez **Nouvelle étape** et nommez l'étape `opensearch-api-test`.

1. Choisissez **Déployer**.

1. Configurez les paramètres suivants dans l'éditeur d'étape, puis choisissez **Enregistrer les modifications** :


| Paramètre | Value | 
| --- | --- | 
| Activer les limitations | Oui | 
| Taux |  1 000  | 
| Mode rafale | 500 | 

Ces paramètres permettent de configurer une API qui n'a qu'une méthode : une demande `GET` au point de terminaison racine (`https://some-id.execute-api.us-west-1.amazonaws.com/search-es-api-test`). La demande nécessite un paramètre unique (`q`), la chaîne de requête à rechercher. Lorsqu'elle est appelée, la méthode transmet la demande à Lambda, qui exécute la fonction `opensearch-lambda`. Pour plus d'informations, consultez [Création d'une API dans Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-create-api.html) et [Déploiement d'une API REST dans Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-deploy-api.html).

## Étape 4 : (Facultatif) modifier la stratégie d'accès au domaine
<a name="search-example-perms"></a>

Votre domaine OpenSearch de service doit autoriser la fonction Lambda à envoyer des `GET` requêtes à l'`movies`index. Si votre domaine dispose d'une stratégie d'accès libre où le contrôle détaillé de l'accès est activé, vous pouvez le laisser tel quel : 

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/*"
    }
  ]
}
```

------

Vous pouvez également choisir de rendre votre stratégie d'accès au domaine plus détaillée. Par exemple, la politique minimale suivante fournit un accès en lecture `opensearch-lambda-role` (créé par Lambda) à l'index `movies`. Pour obtenir le nom exact du rôle créé automatiquement par Lambda, accédez à la console Gestion des identités et des accès AWS (IAM), choisissez **Rôles** et recherchez « lambda ».

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/service-role/opensearch-lambda-role-1abcdefg"
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/movies/_search"
    }
  ]
}
```

------

**Important**  
Si le contrôle d'accès détaillé est activé pour le domaine, vous devez également [associer le rôle à un utilisateur dans les](fgac.md#fgac-mapping) OpenSearch tableaux de bord, sinon vous verrez des erreurs d'autorisation.

### Configurer les autorisations du rôle d'exécution Lambda
<a name="search-example-lambda-iam"></a>

Outre la configuration de la politique d'accès au domaine, vous devez également vous assurer que le rôle d'exécution Lambda dispose des autorisations IAM nécessaires pour accéder à votre OpenSearch domaine de service. La fonction Lambda nécessite des autorisations spécifiques selon que vous utilisez un domaine géré ou une collection OpenSearch Service Serverless.

**Pour les domaines OpenSearch de services gérés :**

Associez la politique IAM suivante à votre rôle d'exécution Lambda pour lui permettre d'envoyer des demandes à OpenSearch votre domaine de service :

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "es:ESHttpGet",
        "es:ESHttpPost"
      ],
      "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/*"
    }
  ]
}
```

------

**Pour les collections OpenSearch Service Serverless :**

Si vous utilisez OpenSearch Service Serverless, associez la politique IAM suivante à votre rôle d'exécution Lambda :

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "aoss:*",
      "Resource": "arn:aws:aoss:us-west-1:123456789012:collection/collection-id"
    }
  ]
}
```

------

Pour associer ces politiques à votre rôle d'exécution Lambda :

1. Accédez à la console IAM à [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)l'adresse.

1. Choisissez **Rôles** et recherchez votre rôle d'exécution Lambda (généralement nommé`opensearch-lambda-role-xxxxxxxx`).

1. Choisissez **Ajouter des autorisations**, puis **Créer une politique intégrée**.

1. Choisissez l'onglet **JSON** et collez la politique appropriée ci-dessus, en remplaçant les valeurs d'espace réservé par votre ressource ARNs réelle.

1. Choisissez **Réviser la politique**, saisissez un nom tel que`OpenSearchAccess`, puis choisissez **Créer une politique**.

**Note**  
Sans ces autorisations IAM, votre fonction Lambda recevra des erreurs « Accès refusé » lorsqu'elle tentera d'interroger OpenSearch votre domaine de service, même si la politique d'accès au domaine autorise les demandes.

Pour plus d'informations sur les stratégies d'accès, consultez [Configuration des politiques d'accès](createupdatedomains.md#createdomain-configure-access-policies).

## Mapper le rôle Lambda (si vous utilisez le contrôle d'accès précis)
<a name="search-example-perms-fgac"></a>

Le contrôle d'accès précis introduit une étape supplémentaire avant de pouvoir tester l'application. Même si vous utilisez l'authentification de base HTTP à d'autres fins, vous devez mapper le rôle Lambda à l'utilisateur, sinon vous verrez des erreurs d'autorisation.

1. Accédez à l'URL OpenSearch des tableaux de bord du domaine.

1. Dans le menu principal, choisissez **Sécurité**, **Rôles**, puis sélectionnez le lien vers `all_access` le rôle auquel vous devez associer le rôle Lambda.

1. Choisissez **Mapped users (Utilisateurs mappés)**, **Manage mapping (Gérer le mappage)**. 

1. Sous **Backend roles** (Rôles backend), ajoutez l'Amazon Resource Name (ARN) du rôle Lambda. L'ARN doit prendre la forme de`arn:aws:iam::123456789123:role/service-role/opensearch-lambda-role-1abcdefg`.

1. Sélectionnez **Mapper** et vérifiez que l'utilisateur ou le rôle s'affiche sous **Utilisateurs mappés**.

## Étape 5 : Tester l'application web
<a name="search-example-webpage"></a>

**Pour tester l'application web**

1. Téléchargez [sample-site.zip](samples/sample-site.zip), décompressez-le et ouvrez `scripts/search.js` dans votre éditeur de texte favori.

1. Mettez à jour la `apigatewayendpoint` variable pour qu'elle pointe vers votre point de terminaison API Gateway et ajoutez une barre oblique inverse à la fin du chemin indiqué. Vous pouvez rapidement trouver le point de terminaison dans API Gateway en choisissant **Stages** (Étapes) et en sélectionnant le nom de l'API. La `apigatewayendpoint` variable doit prendre la forme `https://some-id.execute-api.us-west-1.amazonaws.com/opensearch-api-test` /.

1. Ouvrez `index.html` et essayez d'effectuer des recherches pour *thor*, *house* et d'autres termes.  
![\[Exemple de recherche pour thor.\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/search-ui.png)

### Dépannage des erreurs CORS
<a name="search-example-cors"></a>

Même si la fonction Lambda inclut du contenu dans la réponse à la prise en charge de CORS, l'erreur suivante peut toujours s'afficher : 

```
Access to XMLHttpRequest at '<api-gateway-endpoint>' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present in the requested resource.
```

Si c'est le cas, essayez ce qui suit :

1. [Activez CORS](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html) sur la ressource GET. Sous **Advanced** (Avancé), configurez **Access-Control-Allow-Credentials** comme `'true'`.

1. Redéployez votre API dans API Gateway (**Actions**, **Deploy API**) (Actions, Déploiement de l'API).

1. Supprimez et ajoutez à nouveau votre déclencheur de fonction Lambda. Ajoutez-le à nouveau, choisissez **Ajouter un déclencheur** et créez le point de terminaison HTTP qui invoque votre fonction. Le déclencheur doit présenter la configuration suivante :    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/search-example.html)

## Étapes suivantes
<a name="search-example-next"></a>

Ce chapitre n'est qu'un point de départ pour illustrer un concept. Vous pouvez envisager les modifications suivantes :
+ Ajoutez vos propres données au domaine OpenSearch de service.
+ Ajouter des méthodes à votre API.
+ Dans la fonction Lambda, modifier la requête de recherche ou optimiser différents champs.
+ Appliquer des styles différents aux résultats ou modifier `search.js` afin d'afficher différents champs pour l'utilisateur.