Tutorial: Creazione di un'applicazione di ricerca con il servizio OpenSearch di Amazon - Amazon OpenSearch Service

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.

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 è 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

  1. All'interno di API Gateway, scegliere Crea API.

  2. Individuare API REST (non privato) e scegliere Crea.

  3. Configura i campi seguenti:

    • Nome API: opensearch-api

    • Descrizione :API pubblica per la ricerca di un dominio Amazon OpenSearch Service

    • Tipo di endpoint: regionale

  4. Seleziona Create API (Crea API).

  5. Scegliere Operazioni quindi Crea metodo.

  6. Selezionare GET nel menu a discesa e fare clic sul segno di spunta per confermare.

  7. Configurare le impostazioni seguenti, quindi scegliere Salva:

Impostazione Value (Valore)
Tipo di integrazione Funzione Lambda
Utilizzo dellintegrazione proxy Lambda
Regione Lambda us-west-1
Funzione Lambda opensearch-lambda (verrà configurato più avanti in Lambda)
Utilizzo del timeout di default
Nota

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

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.

  1. Scegliere Operazioni e Implementa API.

  2. Per Fase di implementazione, scegliere Nuova fase e nominare la fase opensearch-api-test.

  3. Selezionare Deploy (Distribuisci).

  4. Configurare le seguenti impostazioni nell'editor della fase, quindi scegliere Salva modifiche:

Impostazione Value (Valore)
Abilitazione della limitazione
Tariffa

1000

Burst 500

Queste impostazioni configurano un'API che dispone di un solo metodo: una richiesta GET alla root dell'endpoint (https://some-id.execute-api.us-west-1.amazonaws.com/search-es-api-test). La richiesta richiede un singolo parametro (q), 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 function.lambda_handler. Per ulteriori informazioni, consultare Gestore della funzione Lambda in Python.

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" } ] }
Nota

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

  1. Scaricare sample-site.zip, decomprimerlo e aprire scripts/search.js nell'editor di testo preferito.

  2. Aggiornare la variabile apigatewayendpoint in modo che punti all'endpoint API Gateway. Il formato dell'endpoint è https://some-id.execute-api.us-west-1.amazonaws.com/opensearch-api-test. Puoi trovare rapidamente l'endpoint in API Gateway scegliendo Stages (Fasi) e selezionando il nome dell'API.

  3. Aprire index.html e provare a eseguire la ricerca di thor, house e qualche altro termine.

    
                        Una ricerca di esempio per thor.

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:

  1. Abilita CORS sulla risorsa GET. In Advanced (Avanzati), imposta Access-Control-Allow-Credentials a 'true'.

  2. Ridistribuisci la tua API in API Gateway (Actions (Operazioni),Deploy API (Distribuzione dell'API)).

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