Come costruire un’architettura serverless su AWS

Grazie alla moltitudine di sistemi serverless disponibili su AWS, è possibile creare un’applicazione senza doverne gestire l’infrastruttura.

Oggi andremo ad approfondire come è possibile creare una Dynamic Web Application utilizzando i seguenti servizi serverless:

  • API GATEWAY
  • LAMBDA
  • DYNAMODB
  • AMPLIFY

Creiamo il nostro database su DynamoDB

Oltre a scegliere DynamoDB per la sua natura serverless, è utile sapere anche che rientra nei Free Tier di AWS per volumi di archiviazione inferiori ai 25 GB e 200 milioni di richieste al mese.

Amazon Dynamo

Iniziamo quindi entrando nella dashboard di Dynamo e creiamo una nuova tabella

Create resources

Andiamo ad inserire nome e chiave primaria che ci permetteranno in seguito di individuare in maniera univoca gli elementi presenti in tabella.

Table Details

Apriamo le impostazioni personalizzate e selezioniamo DynamoDB standard come classe per la tabella, mentre per i settaggi di Read/Write andiamo a impostare una capacità On Demand. Questo ci permetterà di rimanere nei Free Tier.

Lasciamo il resto delle impostazioni come sono selezionate e creiamo la nostra tabella.

Creazione della Lambda e Codice

Così come Dynamo anche Lambda oltre a essere Serverless rientra nella categoria Free Tier a tempo illimitato, basta non superare 1 milione di invocazioni al mese.

Creazione della Lambda e Codice

Partiamo creando una nuova funzione dalla dashboard Lambda, in essa dovremmo richiamarci Dynamo per aver accesso al nostro DB

Funzione lambda

Come possiamo vedere nel nostro codice, la funzione ci permette di effettuare un inserimento in tabella sfruttando il metodo “POST”, ricordandoci di definire la nostra variabile principale come l’Id di riferimento del nostro inserimento, scegliamo di utilizzare un uuid.v4 automaticamente generato da Amazon, rendendo così unico ogni id senza doverli gestire manualmente. La funzione verifica che l’Id e il primo dato non siano vuoti prima di proseguire all’inserimento in tabella dei dati. Una volta inseriti ci restituisce a video l’Id e il primo record.

				
					const AWS = require("aws-sdk");
const dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json"
  };
  try {
    let requestJSON = JSON.parse(event.body);
    switch (event.httpMethod) {
      case "POST":
      if(Object.keys(requestJSON).length>0){
        var PartitionKey = AWS.util.uuid.v4();
        var Data1 = requestJSON.Data1;
        await dynamo.put({
          TableName: "TableName",
          Item: {
            ID: PartitionKey,
            Data1: requestJSON.Data1,
            Data2: requestJSON.Data2,
            Data3: requestJSON.Data3,
          }
          })
          .promise();
          body = `Added TableName ${Data1 + ' ID: ' + PartitionKey}`;
        }else{
          body = "Missing info";
        }
        break;
      default:
        throw new Error(`Unsupported route: "${event.httpMethod}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }
  return {
    statusCode,
    body,
    headers
  };
};
				
			

Cosa importantissima sono i permessi, poiché di default la nostra lambda non ha il permesso di effettuare modifiche su Dynamo, dobbiamo andare ad attaccarle una policy che le permetta di poter effettuare le azioni da noi richieste

Other permission policies

API Gateway

A differenza di Dynamo e Lambda, la prova gratuita di API Gateway dura soltanto 12 mesi e fino a 1 milione di chiamate al mese.

API gateway

Andiamo alla Dashboard delle API Gateway, creiamone una nuova selezionando REST API dandole un nome.

Nuova API

Nel pannello principale, iniziamo creando una nuova risorsa, una volta scelto il suo nome passiamo a creare un nuovo metodo di tipo POST.

Post

Impostiamo il lambda proxy integration e inseriamo il nome della nostra funzione a cui vogliamo connetterci

Lambda proxy integration

Una volta salvato l’API ci chiederà il permesso di poter invocare la nostra Lambda

Trigger

Adesso dobbiamo effettuare il Deploy dell’API, per farlo dobbiamo scegliere una nuova fase, immettendone il nome, scegliendo Deploy distribuiremo il nostro gateway

gateway

Come potete vedere adesso abbiamo il nostro link con cui connetterci alla funzione Lambda, questo vuol dire che utilizzando un programma come Postman possiamo caricare i nostri dati nel database passando un body contenente un JSON con le informazioni che vogliamo caricare.

postman

In risposta ci attendiamo un esito positivo, con il dato caricato e l’ID generato, che ritroviamo chiaramente nella nostra tabella.

Risposta positiva

Amplify

Per deployare un’applicazione su AWS Amplify, è necessario avere a disposizione un repository che contenga il branch valido da utilizzare come sorgente di build, test e deploy. Come repository in questa guida, utilizzeremo GitHub e il branch “master”.

Sulla console di AWS, cerchiamo il servizio di Amplify. Ci verrà proposto di creare una nuova applicazione o di ospitare una esistente.

Amplifiy

Nel nostro repository abbiamo un progetto valido e che viene compilato in locale, quindi procediamo selezionando “Hosting di Amplify”.

Selezioniamo la repository GitHub

Hosting di amplify

Nella prima fase, ci viene chiesto di fornire l’autorizzazione ad Amplify per connettersi a Github.

Dopo aver fornito l’autorizzazione, selezioniamo il repository e il branch

Repository

In questa seconda fase, ci viene chiesto di specificare il nome dell’app e i comandi di build.

Essendo che Amplify si occuperà di buildare, testare e deployare il progetto in una istanza EC2, dobbiamo fornire dei comandi di build validi in base al framework utilizzato nel progetto.

Per questo esempio abbiamo utilizzato Next.js e npm

istanza ec2

Nel comando del preBuild, ci accertiamo che i packages e le deps vengano installate dal lock-file, dopodiché eseguiamo la build. L’artifact sarà la nostra stessa build presente nella cartella “.next”.
Per future build, la cartella “node_modules” verrà generata dalla cache.

Successivamente ci verrà chiesto di creare un nuovo ruolo IAM o di utilizzarne uno già esistente.

Ruolo IAM

L’ultima fase ci chiede di revisionare la configurazione e di procedere con la creazione del progetto.

La schermata che apparirà sarà la dashboard della nostra applicazione. Di default, ad ogni commit nella repository, partirà un rilascio da parte di Amplify della nuova versione.

Per visualizzare i dettagli, clicchiamo su “main”

main

Il deploy è in corso, possiamo visualizzare i logs e lo stato nelle apposite sezioni “Effettua il provisioning, Crea, test, Implementa”

Deploy in corso

Deploy completato, possiamo procedere a testare la nostra app tramite il link in “Dominio” per visualizzare la nostra app.

Visualizzare l'app tramite il link in "dominio"

Vuoi maggiori informazioni?

Vuoi approfondire l’argomento e ottenere maggiori informazioni o supporto da parte dei nostri developer?

Compila i campi qui sotto, ti ricontatteremo quanto prima.