Carichi di lavoro .NET su AWS Lambda

MODULO 1

Modulo 1: introduzione ad AWS Lambda

 MODULO DI APPRENDIMENTO

Panoramica

In questo tutorial imparerai come usare .NET con AWS Lambda. Non è richiesta una conoscenza precedente di AWS Lambda, ma è necessario avere familiarità con AWS e .NET. In questo corso imparerai a creare, distribuire, eseguire, testare ed eseguire il debug di funzioni Lambda .NET utilizzando la linea di comando, Visual Studio, Visual Studio Code e Rider.

In questo modulo introduttivo scoprirai cos'è l'elaborazione serverless, i suoi vantaggi e come si collega ad AWS Lambda. Seguono due esempi che dimostrano quanto sia facile iniziare a lavorare con le funzioni AWS Lambda .NET.

 Tempo richiesto per il completamento

45 minuti

Elaborazione serverless

Prima di parlare di elaborazione serverless, analizziamo per un momento l'elaborazione tradizionale.

Molte aziende, sia piccole che grandi, utilizzano server locali o server basati su data center per eseguire le proprie applicazioni. Quando queste aziende hanno bisogno di più server, devono acquistarli, installarli fisicamente, configurarli, proteggerli e mantenerli. In alcuni casi, un data center può occuparsi di installarli fisicamente per conto dell'azienda, ma il resto lo deve fare sempre quest'ultima.

Una volta fatto tutto ciò, l'azienda può distribuire le proprie applicazioni su quei server. Per molte aziende, tale operazione può richiedere settimane o mesi. In passato, questi ritardi hanno creato difficoltà per il dimensionamento delle applicazioni.

Il cloud computing ha reso tutto questo più semplice. Un'azienda può avviare un'istanza di un server (o più istanze) in pochi minuti. L'azienda può creare le proprie immagini macchina con la macchina virtuale e il sistema operativo configurati nel modo desiderato. In questo modo si riduce la quantità di configurazione necessaria una volta avviato il server, ma è comunque necessario mantenerlo aggiornato con patch, eseguire aggiornamenti di sicurezza e software, ecc.

In molti casi, questi server sono spesso in funzione 24 ore su 24, 7 giorni su 7, anche se non vengono utilizzati per tutto questo tempo. I server sono spesso predisposti per gestire il carico di lavoro di picco che l'applicazione si aspetta di ricevere. Ma al di fuori di questo picco, i server sono almeno parzialmente inattivi. È possibile utilizzare policy di dimensionamento appropriate per ridurre questo problema, ma può essere difficile risolverlo.

Inoltre, il lavoro di provisioning e manutenzione dei server e il tempo in cui i server rimangono inattivi comportano costi che non vanno a beneficio diretto dell'azienda.
Un'alternativa a questa situazione è l'elaborazione serverless. Non ci sono server, non c'è nessuna manutenzione e il dimensionamento viene gestito automaticamente. Scrivi il tuo codice, distribuiscilo e lascia che AWS gestisca l'infrastruttura per te.

AWS offre due opzioni per l'elaborazione serverless: AWS Fargate per applicazioni basate su container e AWS Lambda per applicazioni basate su eventi.

AWS Lambda

AWS Lambda è un servizio di elaborazione serverless che esegue il codice in risposta agli eventi ricevuti dal servizio. Gli eventi possono essere generati da altri servizi AWS, come SNS, SQS, S3, DynamoDB, Gateway API, ecc.

L'uso di un gateway API o di URL di funzioni Lambda consente di attivare l'esecuzione di una funzione Lambda in risposta a una richiesta HTTP. Le funzioni Lambda possono anche essere richiamate direttamente, sebbene anche questo sia considerato un evento.

Non è necessario effettuare il provisioning di alcuna infrastruttura per utilizzare AWS Lambda. AWS si occupa anche del dimensionamento automatico per soddisfare le esigenze della tua applicazione, che si tratti di poche esecuzioni al giorno o di decine di migliaia al secondo. L'infrastruttura Lambda, gestita da AWS, è altamente disponibile e tollerante ai guasti.

Con le funzioni Lambda paghi solo per le risorse di calcolo utilizzate. Quando il codice non è in esecuzione non viene addebitato alcun costo.

Scrivi le tue applicazioni .NET utilizzando gli IDE che già conosci, poi con l'aiuto degli strumenti AWS o di un'infrastructure as code (IaC) a tua scelta, distribuisci l'applicazione su AWS Lambda.

Quando una funzione Lambda viene richiamata da un evento, viene creato un ambiente di esecuzione, viene eseguito il codice di inizializzazione (costruttori, ecc.) e successivamente il codice per gestire l'evento.

Una volta completata l'esecuzione, l'ambiente di esecuzione rimane disponibile per il riutilizzo per un periodo di tempo non determinato.

Se arriva un altro evento, viene utilizzato lo stesso ambiente di esecuzione e il codice di inizializzazione non viene eseguito nuovamente.

Se non è disponibile alcun ambiente di esecuzione, ne viene creato uno nuovo e il codice di inizializzazione viene eseguito nuovamente.

Le funzioni AWS Lambda attualmente forniscono runtime gestiti per .NET Core 3.1 e .NET 6. Se desideri scrivere applicazioni in altre versioni di .NET, puoi utilizzare i runtime personalizzati Lambda o una versione dell'applicazione basata su container.

AWS fornisce modelli di progetto C# e F# per le funzioni Lambda. Questi possono essere utilizzati tramite la linea di comando, Visual Studio, Visual Studio Code e Rider.

È possibile eseguire la funzione Lambda .NET su processori x86_64 e arm64. La scelta dell'architettura del processore non ha alcun impatto sul modo in cui scrivi le applicazioni. La distribuzione sul processore di tua scelta è una semplice questione di modifica di un singolo parametro di configurazione.

Caratteristiche principali di AWS Lambda

Non è necessario imparare un nuovo linguaggio. Usa le tue conoscenze di C# e F# per scrivere le funzioni Lambda.

Puoi utilizzare le funzioni Lambda con altri servizi AWS, come SNS, SQS, S3, Step Functions e DynamoDB per creare applicazioni basate su eventi. Oppure esegui attività personalizzate in risposta agli eventi di questi servizi.

Se devi orchestrare più funzioni Lambda in esecuzione, puoi usare AWS Step Functions. Con Step Functions crei una macchina a stati che gestisce l'esecuzione delle tue funzioni Lambda.

Non è necessario allocare o gestire alcuna infrastruttura. AWS si occupa di tutto questo per te. Tutto ciò che devi decidere è l'architettura del processore e la quantità di memoria da allocare alla funzione. In base alla scelta della memoria, AWS sceglierà la velocità della CPU, la larghezza di banda di rete e l'I/O del disco appropriati.

Le tue funzioni Lambda sono altamente disponibili, tolleranti ai guasti e vengono eseguite in più zone di disponibilità in ogni Regione.

Le funzioni AWS Lambda si avviano entro pochi millisecondi dall'arrivo di un evento e si dimensionano rapidamente e automaticamente in base al volume degli eventi in arrivo.

Paghi solo per quello che usi e questo viene fatturato al millisecondo di utilizzo.

Lambda offre un piano generoso e sempre gratuito, che consente di eseguire un milione di richieste gratuite al mese e 400.000 GB al secondo di tempo di elaborazione al mese

In caso di traffico intenso, Lambda si dimensiona per soddisfare tali esigenze e, quando il traffico si riduce, non pagherai per le risorse che non sono più necessarie.

Lambda rientra nei Savings Plans per l'elaborazione, che offrono prezzi più bassi in cambio dell'impegno a utilizzare una certa quantità di tempo di elaborazione per un periodo da uno a tre anni.

Nella prossima sezione vedrai quanto è facile iniziare a usare AWS Lambda. Con pochi minuti di lavoro, avrai due funzioni AWS Lambda .NET in esecuzione nel cloud

Due esempi che dimostrano quanto sia facile iniziare a lavorare con le funzioni AWS Lambda .NET

Tempo stimato: 30 minuti

Tieni presente che puoi seguire gli esempi presentati qui, ma non è obbligatorio.

Se non hai mai lavorato con la tecnologia serverless, all'inizio può sembrare scoraggiante. Anche sapere come iniziare può essere difficile da capire.

Alla fine di questo breve modulo, avrai due funzioni Lambda .NET attive e funzionanti su AWS.

Una viene richiamata dalla linea di comando, l'altra tramite un endpoint HTTPS pubblico che configurerai facilmente.

Utilizzerai la linea di comando per creare, compilare e distribuire entrambi gli esempi.

Prerequisiti

1. Un account AWS.

Se non disponi di un account AWS, consulta questa pagina sulla creazione e l'attivazione di un account. Quando crei un nuovo account, viene attivato automaticamente un piano gratuito. Il piano gratuito offre l'utilizzo gratuito di determinati servizi AWS fino a un limite massimo. Scopri di più sul piano gratuito qui.

2. Un'interfaccia della linea di comando AWS installata e configurata.

Se non disponi dell'interfaccia della linea di comando AWS, scaricala e installala. Successivamente, configura l'interfaccia della linea di comando AWS con le tue credenziali e la Regione predefinita. La scelta della Regione predefinita dipenderà dalla tua posizione geografica e dai servizi AWS che desideri utilizzare. La disponibilità del servizio varia in base alla Regione.

L'utente AWS deve avere la policy AdministratorAccess allegata; consulta la sezione Una nota sulle autorizzazioni, nel modulo 3 per maggiori dettagli.

3. L'SDK .NET 6

Se non hai installato l'SDK .NET 6, scaricalo e installalo.

Ottieni gli strumenti e i modelli

Un modulo successivo spiegherà meglio gli strumenti e i modelli disponibili, ma per ora puoi iniziare eseguendo i due comandi seguenti:

dotnet tool install -g Amazon.Lambda.Tools
dotnet new -i Amazon.Lambda.Templates

Demo 1: "Hello World!" delle funzioni Lambda

Questa è la funzione Lambda più semplice che puoi scrivere, che accetta un input e restituisce una risposta e che sarà pronta e funzionante in pochi minuti.

Passaggio 1: creare un progetto .NET

Dalla linea di comando/finestra del terminale, esegui il comando seguente per creare una nuova funzione Lambda.

dotnet new lambda.EmptyFunction -n HelloLambda

Passaggio 2: distribuire la funzione Lambda

Passa alla directory HelloLambda/src/HelloLambda:

cd HelloLambda/src/HelloLambda

Se sei interessato, apri il progetto in questa directory. Verrà visualizzato un file denominato Function.cs. È qui che si trova il codice che esegue la tua funzione. Non modificare nulla nel file per ora.

Dalla linea di comando, esegui il comando seguente per distribuire la funzione:

dotnet lambda deploy-function --function-name HelloLambda

Vedrai un output simile al seguente.

Il kit di strumenti AWS per Visual Studio non supporta l'utilizzo del registro pubblico ECR né l'abilitazione di funzionalità come la scansione automatica e la crittografia dei repository per i nuovi repository nel registro privato. Se queste funzionalità sono necessarie, crea repository utilizzando la Console di gestione AWS o strumenti della linea di comando come AWS CLI e Strumenti AWS per PowerShell.

A questo punto, accadrà una delle due cose.

  1. Se non ci sono ruoli nel tuo account AWS, ti verrà chiesto di inserire il nome del nuovo ruolo IAM ("Enter name of the new IAM Role"); ti invitiamo a farlo. Usa il nome HelloLambdaRole.
  2. Se ci sono ruoli nel tuo account AWS, ti verrà mostrato un elenco, ma in fondo troverai l'indicazione Create new IAM Role (Crea nuovo ruolo IAM), digita il numero associato. Quindi ti verrà chiesto di inserire il nome del nuovo ruolo IAM ("Enter name of the new IAM Role"); ti invitiamo a farlo. Usa il nome HelloLambdaRole.

Successivamente, verrà visualizzato un elenco di autorizzazioni che possono essere associate al ruolo che stai creando. Scegli AWSLambdaBasicExecutionRole. È la numero 6 sulla lista.

Attendi qualche secondo mentre vengono creati il ruolo, le autorizzazioni e la funzione Lambda.

Passaggio 3: richiamare la funzione Lambda

Dalla linea di comando esegui:

dotnet lambda invoke-function --function-name HelloLambda --payload "Hello World!" 

Nell'output vedrai:

Hai completato l'operazione con successo. Hai appena distribuito una funzione Lambda nel cloud!

Passaggio 4: eseguire la pulizia

Per le funzioni Lambda non vengono addebitati costi quando non sono in esecuzione, mentre per gli altri servizi AWS vengono addebitati costi anche quando sono inattivi. È sempre buona norma rimuovere le risorse che non si utilizzano.

Esegui il comando seguente per eliminare la funzione Lambda:

dotnet lambda delete-function --function-name HelloLambda 

Nota: questa operazione non elimina il ruolo creato, ma solo la funzione.

Demo 2: un'API .NET in esecuzione in una funzione Lambda

In questa demo creerai un'applicazione API .NET che gestisce le richieste HTTPS. Puoi utilizzare il modello API minimo più recente o il modello API completo precedente con controller: i passaggi saranno gli stessi. Se hai familiarità con le istruzioni di primo livello .NET 6 e gli endpoint API, prendi in considerazione l'utilizzo del modello minimo: serverless.AspNetCoreMinimalAPI. Se non hai familiarità con le istruzioni di primo livello, utilizza il modello precedente: serverless.AspNetCoreWebAPI.

Passaggio 1: creare un progetto .NET

Se desideri utilizzare il modello API minimo, esegui il comando seguente:

dotnet new serverless.AspNetCoreMinimalAPI -n HelloLambdaAPI

Se hai più familiarità con il modello API completo con controller, esegui il comando seguente:

dotnet new serverless.AspNetCoreWebAPI -n HelloLambdaAPI

Passaggio 2: creare un bucket S3

Questo è un passo da fare una sola volta. Il comando nel passaggio 3 richiede un bucket S3 per archiviare i file relativi alla distribuzione.

Devi creare un nome del bucket univoco in tutti gli account AWS (non solo il tuo) e in tutte le Regioni.

Se stai usando us-east-1, esegui il seguente comando:

aws s3api create-bucket --bucket your-unique-bucket-name1234 

Se vuoi usare una Regione diversa, esegui:

aws s3api create-bucket --bucket your-unique-bucket-name1234 --create-bucket-configuration LocationConstraint=REGION

Se il nome del bucket selezionato è già in uso, riceverai il seguente errore:

An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

Passaggio 3: distribuire la funzione Lambda

Passa alla directory HelloLambdaAPI/src/HelloLambdaAPI.

Dalla linea di comando, esegui il comando seguente per distribuire la funzione:

dotnet lambda deploy-serverless --stack-name HelloLambdaAPI --s3-bucket your-unique-bucket-name1234

Ora aspetta...

Verranno visualizzati alcuni output relativi al processo di compilazione e distribuzione e alla fine ci sarà un link:

Output Name                    Value
------------------------------ --------------------------------------------------
ApiURL                         https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/

Aprilo in un browser. A seconda del modello di progetto scelto, verrà visualizzato uno dei messaggi seguenti:

Passaggio 4: eseguire la pulizia

Per rimuovere la funzione Lambda e le risorse associate, esegui il comando seguente:

dotnet lambda delete-serverless HelloLambdaAPI

Conclusioni

Ecco fatto. In pochi minuti hai distribuito due funzioni Lambda. Ecco quanto è facile iniziare a lavorare con le funzioni Lambda .NET!

Questa pagina è stata utile?

STRUMENTI PER LO SVILUPPO .NET