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.
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 _bulkmovies
:
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, 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
-
Ouvrez une invite de commandes et créez un répertoire de projet
my-opensearch-function
. Par exemple, sur macOS :mkdir my-opensearch-function
-
Accédez au répertoire du projet
my-sourcecode-function
.cd my-opensearch-function
-
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 -
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
-
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 .
-
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
-
Accédez à la console Lambda à l'adresse https://console.aws.amazon.com/lambda/home.
Dans le volet de navigation de gauche, sélectionnez Functions. -
Sélectionnez Create function (Créer une fonction).
-
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.
-
-
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. -
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.
Pour plus d'informations, consultez Gestionnaire de fonctions Lambda dans Python.opensearch-lambda
.lambda_handler
É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 _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
Pour créer votre API à l'aide de la console API Gateway
-
Accédez à la console API Gateway à l'adresse https://console.aws.amazon.com/apigateway/home
. Dans le volet de navigation de gauche, choisissez APIs. -
Recherchez API REST (non privée) et choisissez Créer.
-
Sur la page suivante, recherchez la section Créer une nouvelle API et assurez-vous que l'option Nouvelle API est sélectionnée.
-
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
-
-
Sélectionnez Create API (Créer une API).
-
Choisissez Actions (Actions) et Create Method (Créer une méthode).
-
Choisissez GET dans la liste déroulante et cliquez sur la coche pour confirmer.
-
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.
-
Choisissez Actions (Actions) et Deploy API (Déployer l'API).
-
Pour Étape de déploiement, choisissez Nouvelle étape et nommez l'étape
opensearch-api-test
. -
Choisissez Deploy (Déployer).
-
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://
). La demande nécessite un paramètre unique (some-id
.execute-api.us-west-1
.amazonaws.com/search-es-api-testq
), 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'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 :
{ "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.
-
Accédez à l'URL OpenSearch des tableaux de bord du domaine.
-
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. -
Choisissez Mapped users (Utilisateurs mappés), Manage mapping (Gérer le mappage).
-
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
-
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
-
Téléchargez sample-site.zip, décompressez-le et ouvrez
scripts/search.js
dans votre éditeur de texte favori. -
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. Laapigatewayendpoint
variable doit prendre la formehttps://
/.some-id
.execute-api.us-west-1
.amazonaws.com/opensearch-api-test -
Ouvrez
index.html
et essayez d'effectuer des recherches pour thor, house et d'autres termes.
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 :
-
Activez CORS sur la ressource GET. Sous Advanced (Avancé), configurez Access-Control-Allow-Credentials comme
'true'
. -
Redéployez votre API dans API Gateway (Actions, Deploy API) (Actions, Déploiement de l'API).
-
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.