Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Tutorial: creazione di un'applicazione di ricerca con Amazon OpenSearch Service
Un modo comune per creare un'applicazione di ricerca con Amazon OpenSearch Service consiste nell'utilizzare moduli Web per inviare le richieste degli utenti a un server. Quindi puoi autorizzare il server a chiamare direttamente le OpenSearch API e fare in modo che il server invii le richieste al servizio. OpenSearch Se desideri scrivere codice lato client che non si basa su un server, tuttavia, devi compensare per i rischi di sicurezza e prestazioni. Non è consigliabile consentire l'accesso pubblico e non firmato alle OpenSearch API. Gli utenti possono accedere a endpoint non protetti o influire sulle prestazioni del cluster tramite query eccessivamente estese (o troppe query).
Questo capitolo presenta una soluzione: usa Amazon API Gateway per limitare gli utenti a un sottoinsieme di OpenSearch API e AWS Lambda per firmare le richieste da API Gateway to OpenSearch Service.
Nota
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 è un OpenSearch dominio di servizio. Se non ne hai già uno, segui i passaggi in Creare un dominio di OpenSearch servizio per crearne uno.
Fase 1: Indicizzazione dei dati di esempio
Scaricare sample-movies.zip, decomprimerlo e utilizzare l'operazione dell'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"}
...
Nota che quanto sopra è un comando di esempio con un piccolo sottoinsieme dei dati disponibili. Per eseguire l'_bulk
operazione, è necessario copiare e incollare l'intero contenuto del sample-movies
file. Per ulteriori istruzioni, vedereOpzione 2: Caricamento di più documenti.
Puoi anche usare il seguente comando curl per ottenere lo stesso risultato:
curl -XPOST -u '
master-user
:master-user-password
' 'domain-endpoint/_bulk' --data-binary @bulk_movies.json -H 'Content-Type: application/json'
Fase 2: Creare e distribuire la funzione Lambda
Prima di creare l'API in API Gateway, crea la funzione Lambda a cui passa le richieste.
Creazione della funzione Lambda
In questa soluzione, API Gateway passa le richieste a una funzione Lambda, che interroga il OpenSearch servizio e restituisce i risultati. Poiché questa funzione di esempio utilizza librerie esterne, è necessario creare un pacchetto di distribuzione e caricarlo su Lambda.
Per creare il pacchetto di implementazione
-
Apri un prompt dei comandi e crea una directory di progetto
my-opensearch-function
. Ad esempio, su macOS:mkdir my-opensearch-function
-
Passa alla directory del progetto
my-sourcecode-function
.cd my-opensearch-function
-
Copia il contenuto del seguente codice Python di esempio e salvalo in un nuovo file denominato.
opensearch-lambda.py
Aggiungi la tua regione e l'endpoint host al file.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 -
Installa le librerie esterne in una nuova
package
directory.pip3 install --target ./package boto3 pip3 install --target ./package requests pip3 install --target ./package requests_aws4auth
-
Crea un pacchetto di implementazione con le librerie installate nella directory principale. Il comando seguente genera un
my-deployment-package.zip
file nella directory del progetto.cd package zip -r ../my-deployment-package.zip .
-
Aggiungi il file
opensearch-lambda.py
alla radice del file .zip.cd .. zip my-deployment-package.zip opensearch-lambda.py
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.
Per creare la tua funzione utilizzando la console Lambda
-
Accedi alla console Lambda all'indirizzo https://console.aws.amazon.com/lambda/home.
Nel riquadro di navigazione a sinistra, scegli Funzioni. -
Seleziona Crea funzione.
-
Configura i campi seguenti:
-
Nome della funzione: opensearch-function
-
Runtime: Python 3.9
-
Architettura: x86_64
Mantieni tutte le altre opzioni predefinite e scegli Crea funzione.
-
-
Nella sezione Codice sorgente della pagina di riepilogo della funzione, scegli il menu a discesa Carica da e seleziona il file.zip. Individua il
my-deployment-package.zip
file che hai creato e scegli Salva. -
Il gestore è il metodo nel codice della funzione che elabora gli eventi. In Impostazioni di runtime, scegli Modifica e modifica il nome del gestore in base al nome del file nel pacchetto di distribuzione in cui si trova la funzione Lambda. Poiché il file ha un nome
opensearch-lambda.py
, rinomina il gestore in.
Per ulteriori informazioni, consulta Gestore della funzione Lambda in Python.opensearch-lambda
.lambda_handler
Fase 3: Creare l'API in API Gateway
L'utilizzo di API Gateway consente di creare un'API più limitata e semplifica il processo di interazione con l' OpenSearch _search
API. 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
-
Accedi alla console API Gateway all'indirizzo https://console.aws.amazon.com/apigateway/home
. Nel riquadro di navigazione a sinistra, scegli API. -
Individuare REST API (non privato) e scegliere Crea.
-
Nella pagina seguente, individua la sezione Crea nuova API e assicurati che sia selezionata Nuova API.
-
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 | Valore |
---|---|
Tipo di integrazione | Funzione Lambda |
Utilizzo dellintegrazione proxy Lambda | Sì |
Regione Lambda | us-west-1 |
Funzione Lambda | opensearch-lambda |
Utilizzo del timeout di default | Sì |
Configurazione della richiesta del metodo
Scegliere Richiesta metodo e configurare le impostazioni seguenti:
Impostazione | Valore |
---|---|
Autorizzazione | NONE |
Convalidatore di richieste |
Convalida dei parametri e delle intestazioni delle stringhe di query |
Chiave API richiesta | false |
In Parametri della stringa di query URL, scegli Aggiungi stringa di query e configura il seguente parametro:
Impostazione | Valore |
---|---|
Nome | q |
Richiesto |
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
. -
Seleziona Deploy (Implementa).
-
Configurare le seguenti impostazioni nell'editor della fase, quindi scegliere Salva modifiche:
Impostazione | 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 una REST API in Amazon API Gateway.
Fase 4: (facoltativa) Modifica della policy di accesso al dominio
Il dominio del OpenSearch servizio deve consentire alla funzione Lambda di effettuare GET
richieste all'movies
indice. 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" } ] }
Importante
Se hai abilitato il controllo granulare degli accessi per il dominio, devi anche mappare il ruolo a un utente nelle OpenSearch dashboard, altrimenti vedrai errori di autorizzazione.
Per ulteriori informazioni sulle policy di accesso a , consulta Configurazione delle policy di accesso.
Mappatura del ruolo Lambda (se si utilizza il controllo granulare degli accessi)
Il controllo granulare degli accessi introduce un passaggio aggiuntivo prima che sia possibile testare l'applicazione. Anche se si utilizza l'autenticazione di base HTTP per tutti gli altri scopi, è necessario mappare il ruolo Lambda all'utente, altrimenti si riceveranno errori di autorizzazione.
-
Vai all'URL delle OpenSearch dashboard per il dominio.
-
Dal menu principale, scegli Sicurezza, Ruoli e seleziona il link al
all_access
ruolo a cui devi mappare il ruolo Lambda. -
Scegliere Utenti mappati, Gestisci mappatura.
-
In Backend roles (Ruoli di backend), aggiungi il nome della risorsa Amazon (ARN) del ruolo Lambda. L'ARN dovrebbe assumere la forma di.
arn:aws:iam::
123456789123
:role/service-role/opensearch-lambda-role-1abcdefg
-
Selezionare Mappa e confermare che l'utente o il ruolo venga visualizzato in Utenti mappati.
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. -
Aggiorna la
apigatewayendpoint
variabile in modo che punti all'endpoint API Gateway e aggiungi una barra rovesciata alla fine del percorso specificato. Puoi trovare rapidamente l'endpoint in API Gateway scegliendo Stages (Fasi) e selezionando il nome dell'API. Laapigatewayendpoint
variabile deve assumere la forma di /.https://
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. Aggiungila nuovamente, scegli Aggiungi trigger e crea l'endpoint HTTP che richiama la tua funzione. Il trigger deve avere la seguente configurazione:
Trigger API Fase della distribuzione Sicurezza API Gateway opensearch-api opensearch-api-test Aperta
Passaggi successivi
Questo capitolo è solo un punto di partenza per dimostrare un concetto. Potresti valutare se apportare le seguenti modifiche:
-
Aggiungi i tuoi dati al dominio del servizio. OpenSearch
-
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.