Progetti in AWS

Crea un'applicazione Web moderna

Distribuisci un'applicazione Web, collegala a un database e analizza le attività degli utenti

Modulo 5: Acquisire i comportamenti degli utenti

In questo modulo, acquisirai i comportamenti degli utenti utilizzando AWS Lambda e altri servizi serverless.

Panoramica

Ora che il tuo sito Mythical Mysfits è operativo, creiamo un modo per comprendere meglio come gli utenti interagiscono con il sito web e con i suoi mysfit. Sarebbe molto facile analizzare le azioni degli utenti sul sito web che conducono a modifiche nei dati nel nostro back-end, per esempio quando i mysfit vengono adottati o ricevono like.

Ma comprendere quali sono le azioni degli utenti sul sito web prima che decidano di mettere un like o di adottare un mysfit potrebbe contribuire a migliorare la progettazione dell'esperienza utente in futuro, portando alla creazione di mysfit che vengono adottati ancora più velocemente. Per acquisire queste informazioni dettagliate, faremo in modo che, ogni volta che il profilo di un mysfit viene selezionato da un utente, il front-end del sito web invii una piccola richiesta a una nuova API di microservizi che creeremo. Tali record saranno elaborati in tempo reale da una funzione di codice serverless, dopodiché verranno aggregati e archiviati per qualsiasi analisi futura che vorrai condurre.

I principi di progettazione delle applicazioni moderne prediligono i servizi focalizzati, disaccoppiati e modulari. Pertanto, anziché aggiungere metodi e capacità all'interno del servizio Mysfits esistente con cui hai lavorato finora, creeremo un nuovo servizio disaccoppiato per ricevere gli eventi di clic degli utenti dal sito web Mysfits. L'intero stack è stato rappresentato utilizzando il modello CloudFormation fornito.

Diagramma dell'architettura

acquisisci i comportamenti degli utenti

Perché scegliere AWS Lambda per questa implementazione?

Lambda è ideale per le applicazioni basate sui dati che devono rispondere in tempo reale ai cambiamenti dei dati stessi, ai cambiamenti dello stato del sistema o alle azioni degli utenti. Solitamente, queste applicazioni si connettono a data store per accedere ai dati e analizzarli tramite elaborazione in batch, flussi di dati e inferenze di machine learning. Lambda è particolarmente adatto per queste applicazioni perché è integrato con data store come Kinesis Data Streams e Data Firehose, S3, CloudWatch Events, CloudWatch Logs e DynamoDB, per un totale di 17 origini di eventi allo stato attuale.   

Risorse serverless utilizzate in questo modulo

Flusso di distribuzione AWS Kinesis Firehose: Kinesis Firehose è un servizio di streaming in tempo reale gestito a elevata disponibilità che accetta i record di dati e li acquisisce automaticamente in diverse possibili destinazioni di storage all'interno di AWS, come i bucket Amazon S3 o il cluster di data warehouse Amazon Redshift. Inoltre, Kinesis Firehose consente la distribuzione automatica di tutti i record ricevuti dal flusso a una funzione serverless creata con AWS Lambda. Questo significa che il codice che hai scritto può eseguire qualsiasi ulteriore elaborazione o trasformazione dei record prima che vengano aggregati e archiviati nella destinazione impostata.

Bucket Amazon S3: in S3 verrà creato un nuovo bucket, nel quale tutti i record di eventi di clic elaborati saranno aggregati in file e archiviati come oggetti.

Funzione AWS Lambda: AWS Lambda consente agli sviluppatori di scrivere funzioni di codice che contengono soltanto ciò che la loro logica richiede e di distribuire, richiamare, ridimensionare e rendere altamente affidabile il codice creato senza la necessità di gestire alcuna infrastruttura. Nel nostro caso, una funzione di codice serverless viene definita utilizzando AWS SAM. Sarà distribuita ad AWS Lambda e scritta in Python e successivamente si occuperà di elaborare e arricchire i record di clic ricevuti dal flusso di distribuzione. Il codice che abbiamo scritto è molto semplice e si sarebbe potuto realizzare sul front-end del sito web senza alcuna successiva elaborazione. La funzione recupera gli attributi aggiuntivi sul Mysfit selezionato per rendere il record di clic più significativo (dati già recuperati dal front-end del sito web). Tuttavia, ai fini di questo workshop, il codice serve a dimostrare le possibilità architetturali offerte dall'inclusione di una funzione di codice serverless per eseguire, in tempo reale, le eventuali elaborazioni o trasformazioni necessarie prima di archiviare i record. Dopo la creazione della funzione Lambda e la configurazione del flusso di distribuzione Kinesis Firehose come origine di evento per la funzione, il flusso di distribuzione distribuirà automaticamente i record di clic sotto forma di eventi alla funzione di codice che abbiamo creato, riceverà le risposte restituite dal nostro codice e distribuirà i record aggiornati al bucket Amazon S3 configurato.

Una API REST Amazon API Gateway: AWS Kinesis Firehose fornisce un'API di servizio come tutti gli altri servizi AWS, e in questo caso utilizziamo la rispettiva operazione PutRecord per inserire i record degli eventi di clic nel flusso di distribuzione. Tuttavia, non vogliamo che il front-end del nostro sito web si debba integrare direttamente con l'API PutRecord di Kinesis Firehose. Una soluzione del genere ci imporrebbe di gestire le credenziali AWS all'interno del nostro codice di front-end per autorizzare le richieste dell'API all'API PutRecord, esponendo agli utenti l'API AWS diretta impiegata. In questo modo, i visitatori malintenzionati del sito potrebbero essere invogliati a provare ad aggiungere al flusso di distribuzione dei record che hanno un formato non valido oppure che mettono a repentaglio il nostro obiettivo di comprendere il comportamento degli utenti reali. Pertanto, in alternativa utilizzeremo Amazon API Gateway per creare un proxy di servizio AWS che si colleghi all'API PutRecord di Kinesis Firehose. Questo ci consente di realizzare un nostro endpoint RESTful pubblico che non richiede la gestione delle credenziali AWS per le richieste sul front-end. Inoltre, utilizzeremo anche un modello di mappatura delle richieste in API Gateway, che ci consentirà di definire una nostra struttura di payload per le richieste. Tale struttura sarà in grado di limitare le richieste alla nostra struttura prevista, e quindi di trasformare le richieste che hanno un formato valido nella struttura richiesta dall'API PutRecord di Kinesis Firehose.

Ruoli IAM: Kinesis Firehose richiede un ruolo di servizio, che consente di distribuire i record ricevuti sotto forma di eventi alla funzione Lambda creata, così come di distribuire i record elaborati al bucket S3 di destinazione. L'API Amazon API Gateway richiede inoltre un nuovo ruolo che permette all'API di richiamare l'API PutRecord all'interno di Kinesis Firehose per ogni richiesta API ricevuta.

Istruzioni per l'implementazione

  • A: Creare un nuovo repository CodeCommit

    Questo nuovo stack, che distribuirai utilizzando CloudFormation, conterrà non soltanto le risorse dell'ambiente infrastrutturale, ma anche il codice dell'applicazione che AWS Lambda eseguirà per elaborare gli eventi in streaming. Per creare in bundle l'infrastruttura e il codice in un'unica distribuzione, utilizzeremo un altro strumento AWS che è preinstallato nell'IDE AWS Cloud9, la CLI AWS SAM. Il codice delle funzioni AWS Lambda viene distribuito al servizio caricando il codice della funzione, sotto forma di pacchetto .zip, in un bucket Amazon S3.

    La CLI SAM rende tale processo automatico. Utilizzandola, possiamo creare un modello CloudFormation che faccia riferimento in locale al file system in cui è conservato tutto il codice della nostra funzione Lambda. Quindi, verrà creato un file .zip della CLI SAM, che dovrai caricare in un bucket Amazon S3 configurato, per poi creare un nuovo modello CloudFormation che indichi in quale percorso, in S3, è stato caricato il file .zip da distribuire ad AWS Lambda. Dopodiché potremo distribuire il modello CloudFormation generato dalla CLI SAM ad AWS e osservare la creazione dell'ambiente con la funzione Lambda che utilizza il pacchetto del codice caricato dalla CLI SAM.

    Innanzitutto, creiamo un nuovo repository CodeCommit in cui ospitare il codice del servizio di streaming:

    aws codecommit create-repository --repository-name MythicalMysfitsStreamingService-Repository

    In risposta a tale comando, copia il valore di "cloneUrlHttp". Dovrebbe avere il seguente formato: https://git-codecommit.REPLACE_ME_REGION.amazonaws.com/v1/repos/MythicalMysfitsStreamingService-Repository

    Dopodiché, clona il nuovo repository vuoto nell'IDE:

    cd ~/environment/
    git clone {insert the copied cloneValueUrl from above}
    B: Copiare la base del codice del servizio di streaming

    Ora, trasferiamo la nostra directory di lavoro in questo nuovo repository:

    cd ~/environment/MythicalMysfitsStreamingService-Repository/

    Copiamo i componenti dell'applicazione del modulo 5 nella directory del nuovo repository:

    cp -r ~/environment/aws-modern-application-workshop/module-5/app/streaming/* .

    Infine, copiamo il modello CloudFormation anche per questo modulo.

    cp ~/environment/aws-modern-application-workshop/module-5/cfn/* .
  • A: Utilizzare un comando pip per installare le dipendenze della funzione Lambda

    Ora la directory del repository è configurata con tutti gli artefatti forniti:

    Un modello CFN per creare lo stack completo.

    Uno script Python che contiene il codice della nostra funzione Lambda: streamProcessor.py

    Solitamente, i clienti AWS preferiscono archiviare i modelli CloudFormation insieme al codice dell'applicazione in un repository. In questo modo, sono in grado di apportare tutte le modifiche all'applicazione e di monitorarle in un solo posto.

    Tuttavia, se osservi il codice all'interno del file streamProcessor.py, noterai che utilizza il pacchetto di richieste di Python per inviare una richiesta API al servizio Mythical Mysfits che hai creato in precedenza. Le librerie esterne non sono incluse automaticamente nell'ambiente di runtime di AWS Lambda, poiché clienti AWS diversi possono dipendere da versioni differenti di molteplici librerie, e via dicendo.

    Dovrai creare un pacchetto con tutte le dipendenze della tua libreria e la funzione del codice Lambda prima di caricarle sul servizio Lambda. A questo scopo utilizzeremo il comando pip per la gestione dei pacchetti Python. Nel terminale Cloud9, esegui il seguente comando per installare il pacchetto delle richieste e le sue dipendenze in locale unitamente al codice della funzione:

    pip install requests -t .

    Al completamento del comando, noterai diverse cartelle di pacchetti python aggiuntive archiviate nella directory del tuo repository.

    B: Aggiornare il codice della funzione Lambda

    Successivamente, affinché il codice della funzione Lambda sia completamente pronto per la distribuzione, dobbiamo apportare una modifica al codice. È necessario sostituire una riga del file streamProcessor.py con l'ApiEndpoint per l'API del tuo servizio Mysfits: è il medesimo ApiEndpoint che hai creato nel Modulo 4 e utilizzato sul front-end del sito web.

    replace-api-endpoint

    Questo servizio gestisce l'integrazione con MysfitsTable in DynamoDB, pertanto, anche se potremmo scrivere una funzione Lambda in grado di integrarsi direttamente anche con la tabella DynamoDB, tale soluzione andrebbe in conflitto con lo scopo del primo microservizio, lasciandoci basi di codice multiple/separate che si sono integrate con la stessa tabella. Invece, integreremo la tabella attraverso il servizio esistente per disporre di un'architettura applicativa decisamente più disaccoppiata e modulare.

    C: Eseguire il push del codice in CodeCommit

    Inviamo le modifiche al nostro codice al nuovo repository, affinché siano salvate in CodeCommit:

    git add .
    git commit -m "New stream processing service."
    git push
  • A: Creare un bucket S3 per i pacchetti del codice della funzione Lambda

    Avendo modificato la riga nel file Python ed eseguito il commit del nostro codice, siamo pronti a utilizzare la CLI AWS SAM per creare un pacchetto con tutto il codice della nostra funzione, caricarlo in S3 e creare il modello CloudFormation distribuibile per creare il nostro stack di streaming.

    Innanzitutto, utilizza la CLI AWS per creare un nuovo bucket S3 in cui verranno caricati i pacchetti del codice della nostra funzione Lambda. I nomi dei bucket S3 devono essere univoci a livello globale tra tutti i clienti AWS, pertanto dovrai sostituire la parte finale di questo nome del bucket con una stringa personalizzata:

    B: Utilizzare la CLI SAM per creare un pacchetto con il codice per Lambda

    Avendo creato il nostro bucket, siamo pronti a usare la CLI SAM per creare un pacchetto con il nostro codice, caricarlo e trasformare il modello CloudFormation. Accertati di sostituire il parametro del comando con il nome del bucket che hai creato sopra (questo comando presume inoltre che il tuo terminale sia ancora nella directory di lavoro del repository):

    sam package --template-file ./real-time-streaming.yml --output-template-file ./transformed-streaming.yml --s3-bucket replace-with-your-bucket-name

    Se hai proceduto correttamente, vedrai il file transformed-streaming.yml appena creato all'interno della directory ./MythicalMysfitsStreamingService-Repository/. Se guardi tra i suoi contenuti, vedrai che il parametro CodeUri della funzione Lambda serverless è stato aggiornato con la posizione dell'oggetto in cui la CLI SAM ha caricato il codice per il quale hai creato un pacchetto.

    C. Distribuire lo stack utilizzando AWS CloudFormation

    Il comando della CLI SAM restituisce anche il comando CloudFormation che è necessario eseguire per creare il nostro nuovo stack completo. Tuttavia, poiché lo stack crea risorse IAM, dovrai aggiungere al comando un altro parametro. Esegui il seguente comando per distribuire lo stack di streaming:

    aws cloudformation deploy --template-file /home/ec2-user/environment/MythicalMysfitsStreamingService-Repository/cfn/transformed-streaming.yml --stack-name MythicalMysfitsStreamingStack --capabilities CAPABILITY_IAM

    Quando la creazione dello stack è stata completata, il microservizio di elaborazione in tempo reale completo sarà stato creato.

    In futuro, quando apporterai soltanto modifiche al codice della funzione Lambda senza modificare il restante stack di CloudFormation, potrai eseguire gli stessi comandi della CLI AWS SAM e di CloudFormation descritti sopra. In questo modo, l'ambiente infrastrutturale resterà invariato pur distribuendo del codice alla tua funzione Lambda.

  • A: Aggiornare il contenuto del sito web

    Quando lo stack dello streaming è operativo, è necessario pubblicare una nuova versione del front-end di Mythical Mysfits che comprenda il JavaScript che invii degli eventi al nostro servizio ogni volta che un utente fa clic sul profilo di un mysfit.

    Il nuovo file index.html si trova in ~/environment/aws-modern-application-workshop/module-5/web/index.html

    Questo file contiene gli stessi placeholder da aggiornare del modulo 4, e inoltre un ulteriore placeholder per il nuovo endpoint del servizio di elaborazione del flusso che hai appena creato. Per i valori delle variabili precedenti, puoi fari riferimento al file index.html precedentemente caricato nell'ambito del modulo 4.

    Esegui il seguente comando per il nuovo stack dello streaming al fine di recuperare il nuovo endpoint API Gateway per il servizio di elaborazione del flusso:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsStreamingStack
    B: Eseguire il push della nuova versione del sito in S3

    Sostituisci il valore finale di index.html per streamingApiEndpoint e sarai pronto a pubblicare l'aggiornamento finale alla tua home page Mythical Mysfits:

    aws s3 cp ~/environment/aws-modern-application-workshop/module-5/web/index.html s3://YOUR-S3-BUCKET/

    Ricarica il tuo sito web Mythical Mysfits nel browser un'ultima volta e avrai un sito in grado di registrare e pubblicare tutti i clic degli utenti su un qualsiasi profilo mysfit!

    Per visualizzare i record che sono stati elaborati, consulta il bucket S3 di destinazione che hai creato nell'ambito del tuo MythicalMysfitsStreamingStack.

    Ora che hai analizzato tutta l'architettura di una applicazione moderna, ti invitiamo a esplorare la Console AWS e tutti i vari servizi che hai creato per lanciare Mythical Mysfits!

  • Assicurati di eliminare tutte le risorse create durante il workshop per evitare che le ti vengano fatturate oltre il tempo necessario. Ti consigliamo di utilizzare la Console AWS per esplorare le risorse che hai creato e di eliminarle quando sei pronto.

    Per i due casi in cui hai effettuato il provisioning delle risorse attraverso AWS CloudFormation, puoi rimuovere le risorse semplicemente eseguendo il seguente comando nella CLI per ciascuno stack:

    aws cloudformation delete-stack --stack-name STACK-NAME-HERE

    Per eliminare tutte le risorse create, puoi visitare le seguenti Console AWS, che contengono le risorse che hai creato durante il workshop Mythical Mysfits:

Conclusioni

Con questa esperienza abbiamo voluto darti un assaggio del lavoro di uno sviluppatore e di ciò che significa progettare e realizzare le architetture delle applicazioni moderne su AWS. Gli sviluppatori su AWS sono in grado di effettuare il provisioning delle risorse in modo programmatico utilizzando la CLI di AWS, di riutilizzare le definizioni delle infrastrutture tramite AWS CloudFormation, di apportare e distribuire automaticamente modifiche al codice utilizzando la suite di strumenti per gli sviluppatori Servizi di codice AWS e di approfittare di molteplici capacità differenti di servizi di elaborazione e applicativi, che non ti richiedono di occuparti né di provisioning né di gestione di alcun server!

Un importante passo successivo è comprendere meglio il funzionamento interno del sito web Mythical Mysfits che hai creato: per approfondire, analizza i modelli CloudFormation forniti e le risorse in essi elencate.

Ci auguriamo che il workshop sulle applicazioni web moderne di AWS ti sia piaciuto! Questo tutorial è presente anche su GitHub, così potrai inviarci i tuoi eventuali suggerimenti. Inoltre, se desideri dare il tuo contributo per migliorare il codice, potrai inizializzare le richieste pull GitHub.

Per maggiori informazioni sullo sviluppo in AWS, visita il nostro Centro Sviluppatori AWS.

Complimenti!

Hai creato una moderna applicazione web su AWS.
Condividila con i tuoi amici o inviaci un feedback.

Twilight Glitter apprezza il tuo lavoro