

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
<a name="search-example"></a>

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 OpenSearch APIs chiamarlo direttamente e fare in modo che il server invii richieste al OpenSearch servizio. 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 a OpenSearch APIs è sconsigliabile. 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 APIs e AWS Lambda firmare le richieste da API Gateway to OpenSearch Service.

![\[Diagramma di flusso dell'applicazione di ricerca.\]](http://docs.aws.amazon.com/it_it/opensearch-service/latest/developerguide/images/search-application-diagram.png)


**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
<a name="search-example-prereq"></a>

Un prerequisito per questo tutorial è un dominio di OpenSearch servizio. Se non ne hai già uno, segui i passaggi in [Creare un dominio di OpenSearch servizio](gsgcreate-domain.md) per crearne uno.

## Fase 1: Indicizzazione dei dati di esempio
<a name="search-example-index"></a>

Scaricare [sample-movies.zip](samples/sample-movies.zip), decomprimerlo e utilizzare l'operazione dell'API [\$1bulk](https://opensearch.org/docs/latest/api-reference/document-apis/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'`_bulk`operazione, è necessario copiare e incollare l'intero contenuto del `sample-movies` file. Per ulteriori istruzioni, vedere[Opzione 2: Caricamento di più documenti](gsgupload-data.md#gsgmultiple-document).

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
<a name="search-example-lambda"></a>

Prima di creare l'API in API Gateway, crea la funzione Lambda a cui passa le richieste.

### Creazione della funzione Lambda
<a name="sample-lamdba-python"></a>

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

1. Passa alla directory del progetto `my-sourcecode-function`.

   ```
   cd my-opensearch-function
   ```

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

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

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

1. 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](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html) nella *Guida per gli sviluppatori di AWS Lambda * e [Creazione il pacchetto di implementazione Lambda](integrations-s3-lambda.md#integrations-s3-lambda-deployment-package) in questa guida.

Per creare la tua funzione utilizzando la console Lambda

1. [Accedi alla console Lambda a casahttps://console.aws.amazon.com/lambda/.](https://console.aws.amazon.com/lambda/home ) Nel riquadro di navigazione a sinistra, scegli **Funzioni**.

1. Seleziona **Crea funzione**.

1. Configura i campi seguenti:
   + Nome della funzione: opensearch-function
   + Runtime: Python 3.9
   + Architettura: x86\$164

   Mantieni tutte le altre opzioni predefinite e scegli **Crea** funzione. 

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

1. 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. `opensearch-lambda.lambda_handler` Per ulteriori informazioni, consulta [Gestore della funzione Lambda in Python](https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html).

## Fase 3: Creare l'API in API Gateway
<a name="search-example-api"></a>

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
<a name="create-api"></a>

Come creare l'API utilizzando la console API Gateway

1. Accedi alla console API Gateway da [https://console.aws.amazon.com/apigateway/casa](https://console.aws.amazon.com/apigateway/home ). Nel riquadro di navigazione a sinistra, scegli **APIs**.

1. Individuare **REST API** (non privato) e scegliere **Crea**.

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

1. Configura i campi seguenti:
   + Nome API: **opensearch-api**
   + Descrizione: **API pubblica per la ricerca di un dominio Amazon OpenSearch Service**
   + Tipo di endpoint: **regionale**

1. Seleziona **Create API** (Crea API). 

1. Scegliere **Operazioni** quindi **Crea metodo**.

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

1. 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
<a name="method-request"></a>

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
<a name="deploy-api"></a>

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

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

1. Seleziona **Implementa**.

1. 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://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](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-create-api.html) e [Implementazione di una REST API in Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-deploy-api.html).

## Fase 4: (facoltativa) Modifica della policy di accesso al dominio
<a name="search-example-perms"></a>

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

------
#### [ JSON ]

****  

```
{
  "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, vai alla console AWS Identity and Access Management (IAM), scegli **Ruoli** e cerca «lambda».

------
#### [ JSON ]

****  

```
{
  "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](fgac.md#fgac-mapping) nelle OpenSearch dashboard, altrimenti vedrai errori di autorizzazione.

### Configurare le autorizzazioni del ruolo di esecuzione Lambda
<a name="search-example-lambda-iam"></a>

Oltre a configurare la policy di accesso al dominio, devi anche assicurarti che il ruolo di esecuzione Lambda disponga delle autorizzazioni IAM necessarie per accedere OpenSearch al tuo dominio di servizio. La funzione Lambda richiede autorizzazioni specifiche a seconda che si stia utilizzando un dominio gestito o una raccolta OpenSearch Service Serverless.

**Per i domini di servizio gestiti OpenSearch :**

Allega la seguente policy IAM al tuo ruolo di esecuzione Lambda per consentirgli di effettuare richieste al tuo dominio di OpenSearch servizio:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "es:ESHttpGet",
        "es:ESHttpPost"
      ],
      "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/*"
    }
  ]
}
```

------

**Per le raccolte OpenSearch Service Serverless:**

Se utilizzi OpenSearch Service Serverless, collega la seguente policy IAM al tuo ruolo di esecuzione Lambda:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "aoss:*",
      "Resource": "arn:aws:aoss:us-west-1:123456789012:collection/collection-id"
    }
  ]
}
```

------

Per allegare queste policy al tuo ruolo di esecuzione Lambda:

1. Accedi alla console IAM all'indirizzo [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Scegli **Ruoli** e cerca il tuo ruolo di esecuzione Lambda (chiamato `opensearch-lambda-role-xxxxxxxx` in genere).

1. Scegli **Aggiungi autorizzazioni**, quindi **Crea politica in linea**.

1. Scegli la scheda **JSON** e incolla la politica appropriata dall'alto, sostituendo i valori segnaposto con la tua risorsa effettiva. ARNs

1. **Scegli **Review policy**, fornisci un nome simile e scegli `OpenSearchAccess` Crea policy.**

**Nota**  
Senza queste autorizzazioni IAM, la funzione Lambda riceverà l'errore «Accesso negato» quando tenta di interrogare OpenSearch il dominio del servizio, anche se la policy di accesso al dominio consente le richieste.

Per ulteriori informazioni sulle policy di accesso a , consulta [Configurazione delle policy di accesso](createupdatedomains.md#createdomain-configure-access-policies).

## Mappatura del ruolo Lambda (se si utilizza il controllo granulare degli accessi)
<a name="search-example-perms-fgac"></a>

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.

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

1. Scegliere **Utenti mappati**, **Gestisci mappatura**. 

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

1. Selezionare **Mappa** e confermare che l'utente o il ruolo venga visualizzato in **Utenti mappati**.

## Fase 5: Test dell'applicazione Web
<a name="search-example-webpage"></a>

**Per testare l'applicazione Web**

1. Scaricare [sample-site.zip](samples/sample-site.zip), decomprimerlo e aprire `scripts/search.js` nell'editor di testo preferito.

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

1. Aprire `index.html` e provare a eseguire la ricerca di *thor*, *house* e qualche altro termine.  
![\[Una ricerca di esempio per thor.\]](http://docs.aws.amazon.com/it_it/opensearch-service/latest/developerguide/images/search-ui.png)

### Risoluzione degli errori CORS
<a name="search-example-cors"></a>

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](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html) sulla risorsa GET. In **Advanced** (Avanzati), imposta **Access-Control-Allow-Credentials** a `'true'`.

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

1. 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:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/opensearch-service/latest/developerguide/search-example.html)

## Fasi successive
<a name="search-example-next"></a>

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.