Tutorial: creazione di un'applicazione di ricerca con Amazon OpenSearch Service - OpenSearch Servizio Amazon

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.


            Diagramma di flusso dell'applicazione di ricerca.
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 _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", "_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'_bulkoperazione, è 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
  1. Apri un prompt dei comandi e crea una directory di progetto my-opensearch-function. Ad esempio, su macOS:

    mkdir my-opensearch-function
  2. Passa alla directory del progetto my-sourcecode-function.

    cd my-opensearch-function
  3. 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
  4. 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
  5. 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 .
  6. 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

  1. Accedi alla console Lambda all'indirizzo https://console.aws.amazon.com/lambda/home. Nel riquadro di navigazione a sinistra, scegli Funzioni.

  2. Seleziona Crea funzione.

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

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

  5. 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 nomeopensearch-lambda.py, rinomina il gestore in. opensearch-lambda.lambda_handler Per ulteriori informazioni, consulta Gestore della funzione Lambda in Python.

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 _searchAPI. 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. Accedi alla console API Gateway all'indirizzo https://console.aws.amazon.com/apigateway/home. Nel riquadro di navigazione a sinistra, scegli API.

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

  3. Nella pagina seguente, individua la sezione Crea nuova API e assicurati che sia selezionata Nuova API.

  4. Configura i campi seguenti:

    • Nome API: opensearch-api

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

    • Tipo di endpoint: regionale

  5. Seleziona Create API (Crea API).

  6. Scegliere Operazioni quindi Crea metodo.

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

  8. Configurare le impostazioni seguenti, quindi scegliere Salva:

Impostazione Valore
Tipo di integrazione Funzione Lambda
Utilizzo dellintegrazione proxy Lambda
Regione Lambda us-west-1
Funzione Lambda opensearch-lambda
Utilizzo del timeout di default

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

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. Seleziona Deploy (Implementa).

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

Impostazione 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 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'moviesindice. 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.

  1. Vai all'URL delle OpenSearch dashboard per il dominio.

  2. Dal menu principale, scegli Sicurezza, Ruoli e seleziona il link al all_access ruolo a cui devi mappare il ruolo Lambda.

  3. Scegliere Utenti mappati, Gestisci mappatura.

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

  5. 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
  1. Scaricare sample-site.zip, decomprimerlo e aprire scripts/search.js nell'editor di testo preferito.

  2. 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. La apigatewayendpoint variabile deve assumere la forma di /. https://some-id.execute-api.us-west-1.amazonaws.com/opensearch-api-test

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