

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'API HTTP CRUD con Lambda e DynamoDB
<a name="http-api-dynamo-db"></a>

In questo tutorial crei un'API serverless che crea, legge, aggiorna ed elimina voci da una tabella DynamoDB. DynamoDB è un servizio di database NoSQL interamente gestito che combina prestazioni elevate e prevedibili con una scalabilità continua. Questo tutorial richiede circa 30 minuti e può essere eseguito all'interno del [piano gratuito di AWS](https://aws.amazon.com/free/).

Innanzitutto, si crea una tabella [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) utilizzando la console DynamoDB. Quindi crei una funzione [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) utilizzando la AWS Lambda console. Successivamente, è possibile creare un'API HTTP utilizzando la console API Gateway. Infine, si esegue il dell'API.

Quando si richiama l'API HTTP, API Gateway instrada la richiesta alla funzione Lambda. La funzione Lambda interagisce con DynamoDB e restituisce una risposta ad API Gateway. La console API Gateway restituisce quindi una risposta all'utente.

![\[Panoramica dell'API HTTP creata in questo tutorial.\]](http://docs.aws.amazon.com/it_it/apigateway/latest/developerguide/images/ddb-crud.png)


Per completare questo esercizio, sono necessari un AWS account e un AWS Identity and Access Management utente con accesso alla console. Per ulteriori informazioni, consulta [Configurazione per l'utilizzo di Gateway API](setting-up.md).

In questo tutorial utilizzerai Console di gestione AWS. Per un AWS SAM modello che crea questa API e tutte le risorse correlate, vedi [samples/http-dynamo-tutorial.zip](samples/http-dynamo-tutorial.zip).

**Topics**
+ [Fase 1: creazione di una tabella DynamoDB](#http-api-dynamo-db-create-table)
+ [Fase 2: creazione di una funzione Lambda](#http-api-dynamo-db-create-function)
+ [Fase 3: creazione un'API HTTP](#http-api-dynamo-db-create-api)
+ [Fase 4: creazione di route](#http-api-dynamo-db-create-routes)
+ [Fase 5: creazione di un'integrazione](#http-api-dynamo-db-create-integration)
+ [Fase 6: collega la tua integrazione alle route](#http-api-dynamo-db-attach-integrations)
+ [Fase 7: test dell'API](#http-api-dynamo-db-invoke-api)
+ [Fase 8: Pulizia](#http-api-dynamo-db-cleanup)
+ [Passaggi successivi: automatizza con AWS SAM o CloudFormation](#http-api-dynamo-db-next-steps)

## Fase 1: creazione di una tabella DynamoDB
<a name="http-api-dynamo-db-create-table"></a>

Si utilizza una tabella [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) per memorizzare i dati per l'API. 

Ogni voce ha un ID univoco, che usiamo come [chiave di partizione](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) per la tabella.

**Per creare una tabella DynamoDB**

1. Apri la console DynamoDB all'indirizzo. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Seleziona **Create table (Crea tabella)**.

1. Nel campo **Table name (Nome tabella)** immetti **http-crud-tutorial-items**.

1. In **Partition key** (Chiave di partizione), inserisci **id**.

1. Scegliere **Create table (Crea tabella)**.

## Fase 2: creazione di una funzione Lambda
<a name="http-api-dynamo-db-create-function"></a>

Crei una funzione [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) per il back-end della tua API. Questa funzione Lambda crea, legge, aggiorna ed elimina voci da DynamoDB. La funzione utilizza [gli eventi da API Gateway](http-api-develop-integrations-lambda.md#http-api-develop-integrations-lambda.proxy-format) per determinare come interagire con DynamoDB. Per semplicità questo tutorial utilizza una singola funzione Lambda. Come best practice, dovresti creare funzioni separate per ogni route. Per ulteriori informazioni, consulta [Il monolite Lambda](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith).

**Come creare una funzione Lambda**

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

1. Selezionare **Create function (Crea funzione)**.

1. Nel campo **Function name (Nome funzione)**, immettere **http-crud-tutorial-function**.

1. Per **Runtime**, scegli l'ultimo runtime supportato di **Node.js** o di **Python**.

1. In **Permissions (Autorizzazioni)** scegli **Change default execution role (Cambia ruolo di esecuzione predefinito)**.

1. Seleziona **Crea un nuovo ruolo dai AWS ** modelli di policy.

1. In **Role name (Nome ruolo)**, immettere **http-crud-tutorial-role**.

1. In **Policy templates (Modelli di policy)** scegli **Simple microservice permissions**. Questa policy concede alla funzione Lambda l'autorizzazione per interagire con DynamoDB.
**Nota**  
Per semplicità, questo tutorial utilizza una policy gestita. Come best practice, dovresti creare la tua policy IAM per concedere le autorizzazioni minime richieste.

1. Selezionare **Create function (Crea funzione)**.

1. Aprire la funzione Lambda nell'editor di codice della console e sostituirne il contenuto con il codice seguente. Scegli **Deploy (Distribuisci)** per aggiornare la funzione.

------
#### [ Node.js ]

```
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import {
  DynamoDBDocumentClient,
  ScanCommand,
  PutCommand,
  GetCommand,
  DeleteCommand,
} from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});

const dynamo = DynamoDBDocumentClient.from(client);

const tableName = "http-crud-tutorial-items";

export const handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json",
  };

  try {
    switch (event.routeKey) {
      case "DELETE /items/{id}":
        await dynamo.send(
          new DeleteCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id,
            },
          })
        );
        body = `Deleted item ${event.pathParameters.id}`;
        break;
      case "GET /items/{id}":
        body = await dynamo.send(
          new GetCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id,
            },
          })
        );
        body = body.Item;
        break;
      case "GET /items":
        body = await dynamo.send(
          new ScanCommand({ TableName: tableName })
        );
        body = body.Items;
        break;
      case "PUT /items":
        let requestJSON = JSON.parse(event.body);
        await dynamo.send(
          new PutCommand({
            TableName: tableName,
            Item: {
              id: requestJSON.id,
              price: requestJSON.price,
              name: requestJSON.name,
            },
          })
        );
        body = `Put item ${requestJSON.id}`;
        break;
      default:
        throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers,
  };
};
```

------
#### [ Python ]

```
import json
import boto3
from decimal import Decimal

client = boto3.client('dynamodb')
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table('http-crud-tutorial-items')
tableName = 'http-crud-tutorial-items'


def lambda_handler(event, context):
    print(event)
    body = {}
    statusCode = 200
    headers = {
        "Content-Type": "application/json"
    }

    try:
        if event['routeKey'] == "DELETE /items/{id}":
            table.delete_item(
                Key={'id': event['pathParameters']['id']})
            body = 'Deleted item ' + event['pathParameters']['id']
        elif event['routeKey'] == "GET /items/{id}":
            body = table.get_item(
                Key={'id': event['pathParameters']['id']})
            body = body["Item"]
            responseBody = [
                {'price': float(body['price']), 'id': body['id'], 'name': body['name']}]
            body = responseBody
        elif event['routeKey'] == "GET /items":
            body = table.scan()
            body = body["Items"]
            print("ITEMS----")
            print(body)
            responseBody = []
            for items in body:
                responseItems = [
                    {'price': float(items['price']), 'id': items['id'], 'name': items['name']}]
                responseBody.append(responseItems)
            body = responseBody
        elif event['routeKey'] == "PUT /items":
            requestJSON = json.loads(event['body'])
            table.put_item(
                Item={
                    'id': requestJSON['id'],
                    'price': Decimal(str(requestJSON['price'])),
                    'name': requestJSON['name']
                })
            body = 'Put item ' + requestJSON['id']
    except KeyError:
        statusCode = 400
        body = 'Unsupported route: ' + event['routeKey']
    body = json.dumps(body)
    res = {
        "statusCode": statusCode,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": body
    }
    return res
```

------

## Fase 3: creazione un'API HTTP
<a name="http-api-dynamo-db-create-api"></a>

L'API HTTP fornisce un endpoint HTTP per la funzione Lambda. In questa fase si crea un'API vuota. Nelle fasi seguenti si configurano route e integrazioni per connettere l'API e la funzione Lambda.



**Per creare un'API HTTP**

1. Accedi alla console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Scegli **Create API (Crea API)**, quindi per **API HTTP**, scegli **Build (Crea)**.

1. Per **API name (Nome API)**, immettere **http-crud-tutorial-api**.

1. Per il tipo di **indirizzo IP**, selezionare. **IPv4**

1. Scegli **Next (Successivo)**.

1. Per **Configura route**, scegli **Avanti** per ignorare la creazione della route. È possibile creare route in un secondo momento.

1. Esamina la fase creata da API Gateway e quindi scegli **Next (Avanti)**.

1. Seleziona **Crea**.

## Fase 4: creazione di route
<a name="http-api-dynamo-db-create-routes"></a>

Le route inviano le richieste API in entrata alle risorse di back-end. Le route sono costituite da due parti: un metodo HTTP e un percorso della risorsa, ad esempi, `GET /items`. Per questa API di esempio, creiamo quattro route:
+ `GET /items/{id}`
+ `GET /items`
+ `PUT /items`
+ `DELETE /items/{id}`

**Per creare route**

1. Accedi alla console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Scegliere l'API.

1. Scegliere **Percorsi**.

1. Seleziona **Crea**.

1. Per **Method (Metodo)** seleziona **GET**.

1. Per il percorso, immetti **/items/\$1id\$1**. Il `{id}` alla fine del percorso è un parametro che API Gateway recupera dal percorso della richiesta quando essa viene effettuata da un client.

1. Seleziona **Crea**.

1. Ripeti le fasi da 4 a 7 per `GET /items`, `DELETE /items/{id}` e `PUT /items`.

![\[La tua API dispone di route per GET /items, GET /items/{id}, DELETE /items/{id} e PUT /items.\]](http://docs.aws.amazon.com/it_it/apigateway/latest/developerguide/images/ddb-create-routes.png)


## Fase 5: creazione di un'integrazione
<a name="http-api-dynamo-db-create-integration"></a>

Si crea un'integrazione per connettere una route alle risorse di back-end. Per questa API di esempio, si crea un'integrazione Lambda che si utilizza per tutte le route.

**Per creare un'integrazione**

1. Accedi alla console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Scegliere l'API.

1. Scegli **Integrations (Integrazioni)**.

1. Scegli **Manage integrations (Gestisci integrazioni)**, quindi scegli **Create (Crea)**.

1. Salta il passaggio **Collega questa integrazione a una route**. Lo completerai in una fase successiva.

1. Per **Integration type (Tipo di integrazione)**, scegli **Lambda Function (Funzione Lambda)**.

1. Per **Lambda function (Funzione Lambda)**, immetti **http-crud-tutorial-function**.

1. Seleziona **Crea**.

## Fase 6: collega la tua integrazione alle route
<a name="http-api-dynamo-db-attach-integrations"></a>

Per questa API di esempio, si utilizza la stessa integrazione Lambda per tutte le route. Dopo aver collegato l'integrazione a tutte le route dell'API, la funzione Lambda viene richiamata quando un client chiama una delle route.



**Per collegare integrazioni alle route**

1. Accedi alla console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Scegliere l'API.

1. Scegli **Integrations (Integrazioni)**.

1. Scegli una route.

1. Nel campo **Choose an existing integration (Scegli un'integrazione esistente)**, scegli **http-crud-tutorial-function**.

1. Scegli **Collega integrazione**.

1. Ripeti le fasi 4-6 per tutte le route. 

Tutti i percorsi mostrano che è associata un' AWS Lambda integrazione.

![\[La console viene visualizzata AWS Lambda su tutti i percorsi per indicare che l'integrazione è collegata.\]](http://docs.aws.amazon.com/it_it/apigateway/latest/developerguide/images/ddb-attach-integrations.png)


Ora che hai un'API HTTP con route e integrazioni, puoi testare la tua API.

## Fase 7: test dell'API
<a name="http-api-dynamo-db-invoke-api"></a>

Per assicurarti che la tua API funzioni, usa [curl](https://curl.se).

**Per ottenere l'URL per richiamare la tua API**

1. Accedi alla console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Scegliere l'API.

1. Prendere nota del valore URL di chiamata per l'API. Viene visualizzato in **Invoke URL (Richiama URL)** nella pagina **Details (Dettagli)**.  
![\[Dopo aver creato l'API, la console mostra il valore URL di chiamata per l'API.\]](http://docs.aws.amazon.com/it_it/apigateway/latest/developerguide/images/ddb-invoke-url.png)

1. Copia l'URL di chiamata per l'API. 

   L'URL completo è simile a `https://abcdef123.execute-api.us-west-2.amazonaws.com`. 

**Per creare o aggiornare una voce**
+ Utilizza il comando seguente per creare o aggiornare una voce. Il comando include un corpo della richiesta con l'ID, il prezzo e il nome della voce.

  ```
  curl -X "PUT" -H "Content-Type: application/json" -d "{\"id\": \"123\", \"price\": 12345, \"name\": \"myitem\"}" https://abcdef123.execute-api.us-west-2.amazonaws.com/items
  ```

**Per ottenere tutte le voci**
+ Utilizza il seguente comando per elencare tutte le voci.

  ```
  curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items
  ```

**Per ottenere una voce**
+ Utilizza il seguente comando per ottenere una voce in base al relativo ID.

  ```
  curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items/123
  ```

**Per eliminare una voce**

1. Utilizza il comando seguente per eliminare una voce.

   ```
   curl -X "DELETE" https://abcdef123.execute-api.us-west-2.amazonaws.com/items/123
   ```

1. Ottieni tutte le voci per verificare che la voce sia stata eliminata.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items
   ```

## Fase 8: Pulizia
<a name="http-api-dynamo-db-cleanup"></a>

Per evitare costi non necessari, eliminare le risorse create nell'ambito di questo esercizio di nozioni di base. La procedura seguente elimina l'API HTTP, la funzione Lambda e le risorse associate.

**Per eliminare una tabella DynamoDB**

1. Apri la console DynamoDB all'indirizzo. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Seleziona la tabella.

1. Seleziona **Delete Table (Elimina tabella)**.

1. Conferma la scelta e seleziona **Delete (Elimina)**.

**Per eliminare un'API HTTP**

1. Accedi alla console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway.](https://console.aws.amazon.com/apigateway)

1. Nella **APIs**pagina, seleziona un'API. Scegli **Azioni**, quindi **Elimina**.

1. Scegliere **Delete (Elimina)**.

**Per eliminare una funzione Lambda**

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

1. Nella pagina **Funzioni**, selezionare una funzione. Scegli **Azioni**, quindi **Elimina**.

1. Scegliere **Delete (Elimina)**.

**Per eliminare il gruppo di log di una funzione Lambda**

1. Nella CloudWatch console Amazon, apri la [pagina Log groups](https://console.aws.amazon.com/cloudwatch/home#logs:).

1. Nella pagina **Log Groups (Gruppi di log)**, seleziona il gruppo di log della funzione (`/aws/lambda/http-crud-tutorial-function`). Scegliere **Actions (Operazioni)**, quindi selezionare **Delete log group (Elimina gruppo di log)**.

1. Scegliere **Delete (Elimina)**.

**Per eliminare il ruolo di esecuzione di una funzione Lambda**

1. Nella AWS Identity and Access Management console, apri la [pagina Ruoli](https://console.aws.amazon.com/iam/home?#/roles).

1. Seleziona il ruolo della funzione, ad esempi, `http-crud-tutorial-role`.

1. Scegliere **Delete role (Elimina ruolo)**.

1. Scegliere **Yes, delete (Sì, elimina)**.

## Passaggi successivi: automatizza con AWS SAM o CloudFormation
<a name="http-api-dynamo-db-next-steps"></a>

È possibile automatizzare la creazione e la pulizia delle AWS risorse utilizzando o. CloudFormation AWS SAM Per un esempio di modello AWS SAM per questo tutorial, consulta [samples/http-dynamo-tutorial.zip](samples/http-dynamo-tutorial.zip).

Per esempio CloudFormation modelli, vedi modelli di [esempio CloudFormation](https://github.com/awsdocs/amazon-api-gateway-developer-guide/tree/main/cloudformation-templates).