Tutorial: Creazione di un'applicazione di ricerca con il servizio OpenSearch di Amazon
Un modo comune per creare un'applicazione di ricerca con Amazon OpenSearch Service è utilizzare moduli Web per inviare query utente a un server. Quindi, è possibile autorizzare il server a chiamare le API OpenSearch direttamente e fare in modo che il server invii richieste a OpenSearch Service. Se desideri scrivere codice lato client che non si basa su un server, tuttavia, devi compensare per i rischi di sicurezza e prestazioni. Consentire l'accesso pubblico, non firmato alle API OpenSearch non è consigliato. Gli utenti possono accedere a endpoint non protetti o influire sulle prestazioni del cluster tramite query eccessivamente estese (o troppe query).
In questo capitolo viene presentata una soluzione: utilizzare Amazon API Gateway per limitare gli utenti a un sottoinsieme di API OpenSearch e AWS Lambda per firmare le richieste da API Gateway a OpenSearch Service.
Si applicano i prezzi standard di API Gateway e Lambda, ma entro l'uso limitato di questo tutorial, i costi dovrebbero essere trascurabili.
Prerequisiti
Un prerequisito per questo tutorial è avere già un dominio OpenSearch Service. Se non ne hai ancora uno, segui i passaggi descritti in Creazione di un dominio OpenSearch Service per crearne uno.
Fase 1: Indicizzazione dei dati di esempio
Scaricare sample-movies.zip, decomprimerlo e utilizzare l'API _bulk
per aggiungere i 5.000 documenti all'indice movies
:
POST https://search-
my-domain
.us-west-1
.es.amazonaws.com/_bulk { "index": { "_index": "movies", "_type": "movie", "_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", "_type": "movie", "_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"}...
Per istruzioni, consultare Opzione 2: Caricamento di più documenti.
Fase 2: Creazione dell'API in API Gateway
L'uso di API Gateway consente di creare un'API più limitata e semplifica il processo di interazione con l'API _search
di OpenSearch. API Gateway consente inoltre di abilitare caratteristiche di sicurezza come l'autenticazione di Amazon Cognito e la limitazione delle richieste. Completare la procedura seguente per creare e implementare un'API:
Creazione e configurazione dell'API
Come creare l'API utilizzando la console API Gateway
-
All'interno di API Gateway, scegliere Crea API.
-
Individuare API REST (non privato) e scegliere Crea.
-
Configura i campi seguenti:
-
Nome API: opensearch-api
-
Descrizione :API pubblica per la ricerca di un dominio Amazon OpenSearch Service
-
Tipo di endpoint: regionale
-
-
Seleziona Create API (Crea API).
-
Scegliere Operazioni quindi Crea metodo.
-
Selezionare GET nel menu a discesa e fare clic sul segno di spunta per confermare.
-
Configurare le impostazioni seguenti, quindi scegliere Salva:
Impostazione | Value (Valore) |
---|---|
Tipo di integrazione | Funzione Lambda |
Utilizzo dellintegrazione proxy Lambda | Sì |
Regione Lambda | us-west-1 |
Funzione Lambda | opensearch-lambda (verrà configurato più avanti in Lambda) |
Utilizzo del timeout di default | Sì |
Se stai eseguendo queste fasi in ordine, vedrai un errore: "Function not found: arn:aws:lambda:us-west-1:123456789012:function:opensearch-lambda". Puoi ignorare questo errore, poiché configurerai la funzione Lambda nella fase 3.
Configurazione della richiesta del metodo
Scegliere Richiesta metodo e configurare le impostazioni seguenti:
Impostazione | Value (Valore) |
---|---|
Autorizzazione | NONE |
Convalidatore di richieste |
Convalida dei parametri e delle intestazioni delle stringhe di query |
Chiave API richiesta | false |
Parametri della stringa di query URL
Impostazione | Value (Valore) |
---|---|
Nome | q |
Obbligatorio |
Sì |
Implementazione dell'API e configurazione di una fase
La console API Gateway consente di distribuire un'API creando una distribuzione e associandola a una fase nuova o esistente.
-
Scegliere Operazioni e Implementa API.
-
Per Fase di implementazione, scegliere Nuova fase e nominare la fase
opensearch-api-test
. -
Selezionare Deploy (Distribuisci).
-
Configurare le seguenti impostazioni nell'editor della fase, quindi scegliere Salva modifiche:
Impostazione | Value (Valore) |
---|---|
Abilitazione della limitazione | Sì |
Tariffa |
1000 |
Burst | 500 |
Queste impostazioni configurano un'API che dispone di un solo metodo: una richiesta GET
alla root dell'endpoint (https://
). La richiesta richiede un singolo parametro (some-id
.execute-api.us-west-1
.amazonaws.com/search-es-api-testq
), la stringa di query da ricercare. Quando viene chiamato, il metodo passa la richiesta a Lambda, che esegue la funzione opensearch-lambda
. Per ulteriori informazioni, consultare Creazione di un'API in Amazon API Gateway e Implementazione di un'API REST in Amazon API Gateway.
Fase 3: Creazione e implementazione della funzione Lambda
Dopo aver creato l'API in API Gateway, creare la funzione Lambda a cui passare le richieste.
Creazione della funzione Lambda
In questa soluzione, API Gateway trasferisce le richieste alla seguente funzione Lambda Python 3.8, che interroga OpenSearch Service e restituisce risultati: Denominare la funzione opensearch-lambda
.
Poiché questa funzione di esempio utilizza librerie esterne, affinché il codice funzioni è necessario creare un pacchetto di implementazione e caricarlo in Lambda. Per ulteriori informazioni sulla creazione di funzioni Lambda e sui pacchetti di implementazione, consultare Implementa funzioni Lambda per Python con gli archivi di file .zip nella Guida per gli sviluppatori di AWS Lambda e Creazione il pacchetto di implementazione Lambda in questa guida.
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:// 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
Modifica del gestore
Il gestore è il metodo nel codice della funzione che elabora gli eventi. È necessario modificare il nome del gestore in base al nome del file nel pacchetto di implementazione in cui si trova la funzione Lambda. Ad esempio, se il file è denominato function.py
, rinominare il gestore in
. Per ulteriori informazioni, consultare Gestore della funzione Lambda in Python.function
.lambda_handler
Configurazione di un trigger
Scegliere Aggiungi trigger e creare l'endpoint HTTP che richiama la funzione. Il trigger deve avere la seguente configurazione:
Trigger | API | Fase della distribuzione | Sicurezza |
---|---|---|---|
API Gateway | opensearch-api | opensearch-api-test | Aperta |
Fase 4: (facoltativa) Modifica della policy di accesso al dominio
Il dominio OpenSearch Service deve consentire alla funzione Lambda di effettuare richieste GET
all'indice movies
. Se il dominio ha una policy di accesso aperto con il controllo granulare degli accessi abilitato, è possibile lasciarlo così com'è:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:us-west-1:123456789012:domain/
domain-name
/*" } ] }
In alternativa, è possibile scegliere di rendere la policy di accesso al dominio più granulare. Per esempio, la policy minima seguente consente a opensearch-lambda-role
(creato tramite Lambda) l'accesso in lettura all'indice movies
: Per ottenere il nome esatto del ruolo creato automaticamente da Lambda, passare alla console AWS Identity and Access Management(IAM), scegliere Ruoli e cercare "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" } ] }
Se è abilitato il controllo di accesso granulare per il dominio, potrebbe essere necessario mappare il ruolo a un utente in OpenSearch Dashboards, altrimenti vedrai errori di autorizzazione.
Per ulteriori informazioni sulle policy di accesso a , consulta Configurazione delle policy di accesso.
Fase 5: Test dell'applicazione Web
Per testare l'applicazione Web
-
Scaricare sample-site.zip, decomprimerlo e aprire
scripts/search.js
nell'editor di testo preferito. -
Aggiornare la variabile
apigatewayendpoint
in modo che punti all'endpoint API Gateway. Il formato dell'endpoint èhttps://
. Puoi trovare rapidamente l'endpoint in API Gateway scegliendo Stages (Fasi) e selezionando il nome dell'API.some-id
.execute-api.us-west-1
.amazonaws.com/opensearch-api-test -
Aprire
index.html
e provare a eseguire la ricerca di thor, house e qualche altro termine.
Risoluzione degli errori CORS
Anche se la funzione Lambda include contenuti nella risposta per il supporto di CORS, è comunque possibile che venga visualizzato il seguente errore:
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.
In tal caso, prova quanto seguente:
-
Abilita CORS sulla risorsa GET. In Advanced (Avanzati), imposta Access-Control-Allow-Credentials a
'true'
. -
Ridistribuisci la tua API in API Gateway (Actions (Operazioni),Deploy API (Distribuzione dell'API)).
-
Elimina e aggiungi nuovamente la tua attivazione della funzione Lambda.
Fasi successive
Questo capitolo è solo un punto di partenza per dimostrare un concetto. Potresti valutare se apportare le seguenti modifiche:
-
Aggiungere i propri dati al dominio OpenSearch Service.
-
Aggiungere metodi all'API.
-
Nella funzione Lambda, modificare la query di ricerca o potenziare campi diversi.
-
Utilizzare uno stile diverso per i risultati o modificare
search.js
per visualizzare campi diversi all'utente.