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.
Iniziamo quindi entrando nella dashboard di Dynamo e creiamo una nuova tabella
Andiamo ad inserire nome e chiave primaria che ci permetteranno in seguito di individuare in maniera univoca gli elementi presenti in tabella.
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.
Partiamo creando una nuova funzione dalla dashboard Lambda, in essa dovremmo richiamarci Dynamo per aver accesso al nostro DB
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
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.
Andiamo alla Dashboard delle API Gateway, creiamone una nuova selezionando REST API dandole un nome.
Nel pannello principale, iniziamo creando una nuova risorsa, una volta scelto il suo nome passiamo a creare un nuovo metodo di tipo POST.
Impostiamo il lambda proxy integration e inseriamo il nome della nostra funzione a cui vogliamo connetterci
Una volta salvato l’API ci chiederà il permesso di poter invocare la nostra Lambda
Adesso dobbiamo effettuare il Deploy dell’API, per farlo dobbiamo scegliere una nuova fase, immettendone il nome, scegliendo Deploy distribuiremo il nostro 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.
In risposta ci attendiamo un esito positivo, con il dato caricato e l’ID generato, che ritroviamo chiaramente nella nostra tabella.
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.
Nel nostro repository abbiamo un progetto valido e che viene compilato in locale, quindi procediamo selezionando “Hosting di Amplify”.
Selezioniamo la repository GitHub
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
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
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.
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”
Il deploy è in corso, possiamo visualizzare i logs e lo stato nelle apposite sezioni “Effettua il provisioning, Crea, test, Implementa”
Deploy completato, possiamo procedere a testare la nostra app tramite il link in “Dominio” per visualizzare la nostra app.
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.