Tutoriel : Création d'une application de recherche avec Amazon OpenSearch Service - Amazon OpenSearch Service

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

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 à appeler directement les OpenSearch API 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. Il est déconseillé d'autoriser l'accès public non signé aux OpenSearch API. 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 d' OpenSearch API et AWS Lambda pour signer les demandes d'API Gateway to OpenSearch Service.

Schéma de flux de l'application de recherche.
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.

Prérequis

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 pour en créer un.

Étape 1 : Indexer des exemples de données

Téléchargez sample-movies.zip, décompressez-le et utilisez l'opération d'API _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'_bulkopération, vous devez copier et coller l'intégralité du contenu du sample-movies fichier. Pour de plus amples instructions, voirOption 2 : Charger plusieurs documents.

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

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

Créer la fonction Lambda

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
  2. Accédez au répertoire du projet my-sourcecode-function.

    cd my-opensearch-function
  3. 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
  4. 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
  5. 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 .
  6. 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 dans le Guide du développeur AWS Lambda et Créer le package de déploiement Lambda dans ce guide.

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

  1. Accédez à la console Lambda à l'adresse https://console.aws.amazon.com/lambda/home. Dans le volet de navigation de gauche, sélectionnez Functions.

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

  3. Configurez les champs suivants :

    • Nom de la fonction : opensearch-function

    • Temps d'exécution : Python 3.9

    • Architecture : x86_64

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

  4. 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.

  5. 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.

Étape 3 : Création de l'API dans API Gateway

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 _searchAPI. 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

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

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

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

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

  4. 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

  5. Sélectionnez Create API (Créer une API).

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

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

  8. 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

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

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).

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

  3. Choisissez Deploy (Déployer).

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

Paramètre Value
Activer les limitations Oui
Vitesse

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 et Déploiement d'une API REST dans Amazon API Gateway.

Étape 4 : (Facultatif) modifier la stratégie d'accès au domaine

Votre domaine OpenSearch de service doit autoriser la fonction Lambda à envoyer des GET requêtes à l'moviesindex. 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 :

{ "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 que Lambda crée automatiquement, accédez à la console AWS Identity and Access Management (IAM), choisissez Rôles et recherchez « lambda ».

{ "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 OpenSearch tableaux de bord, sinon vous verrez des erreurs d'autorisation.

Pour plus d'informations sur les stratégies d'accès, consultez Configuration des politiques d'accès.

Mapper le rôle Lambda (si vous utilisez le contrôle d'accès précis)

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.

  2. 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.

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

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

  5. 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

Pour tester l'application web
  1. Téléchargez sample-site.zip, décompressez-le et ouvrez scripts/search.js dans votre éditeur de texte favori.

  2. 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 /.

  3. Ouvrez index.html et essayez d'effectuer des recherches pour thor, house et d'autres termes.

    Exemple de recherche pour thor.

Dépannage des erreurs CORS

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 sur la ressource GET. Sous Advanced (Avancé), configurez Access-Control-Allow-Credentials comme 'true'.

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

  3. 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 :

    Déclencheur API Étape de déploiement Sécurité
    API Gateway opensearch-api opensearch-api-test Ouvrir

Étapes suivantes

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.