Guida introduttiva a .NET con le funzioni AWS Lambda
AWS Lambda Functions è un modello di elaborazione serverless che consente di eseguire codice senza server. Di solito sono scritti in linguaggi come JavaScript e Python, ma AWS ora supporta molti runtime diversi, tra cui. NET per C#.
Perché usare. NET per Lambda?
Ora ci sono molte lingue diverse disponibili per Lambda, quindi hai molte opzioni. In genere, JavaScript e Python vengono utilizzati per semplici funzioni di automazione che si occupano di essere operativi rapidamente. Ma non sono i più performanti per l’elaborazione pesante e i linguaggi di scripting tipizzati dinamicamente sono un serio inconveniente per applicazioni complesse.
Se preferisci il linguaggio C#, usarlo per Lambda non presenta troppi svantaggi, soprattutto se il passaggio a Python o JavaScript è troppo noioso. Anche gli strumenti forniti da AWS sono buoni e hai accesso all’intero SDK AWS, il che significa che puoi cercare facilmente servizi come Lambda e DynamoDB.
Inoltre, AWS supporta l’intero runtime. NET, il che significa che puoi usare linguaggi diversi da C# che compilano anche in binari. RETE. C# è il più popolare, ma puoi anche scrivere funzioni lambda in F# o VB.NET .
Come funziona?
Linguaggi come Java e C# tendono ad essere molto più belli, ma ci sono degli svantaggi nell’usarli. Entrambi sono compilati in bytecode che deve essere compilato all’avvio, quindi hanno più tempo di avvio, specialmente all’avvio a freddo. Un “avvio a freddo” è quando AWS non ha eseguito una funzionalità negli ultimi minuti, quindi non verrà memorizzata nella cache e dovrà essere compilata di nuovo appena in tempo per eseguirla. Questo processo può far sì che le tue funzioni richiedano un secondo o più per rispondere, il che non va bene per le applicazioni web.
Tuttavia, questo problema è ampiamente attenuato se utilizzi Lambda molto spesso. È inoltre possibile ridurre completamente i tempi di avviamento a freddo con il parallelismo dedicato . Tempo di risposta tipico per. NET è molto grande e le prestazioni sono alla pari con linguaggi completamente compilati come Go e Rust.
Se stai attualmente utilizzando Java per le funzioni Lambda, C# potrebbe essere un valido sostituto poiché è un runtime moderno. NET 6 utilizza meno memoria e nella maggior parte dei casi si avvia più velocemente della JVM.
Configurazione delle funzioni lambda di C#
Per prima cosa, avrai bisogno di uno installato. RETE. AWS supporta. NET Core 3.1 e. NET 6, quindi uno di questi due runtime funzionerà, ma soprattutto, avrai bisogno dotnet
della CLI installata per poter installare i modelli Lambda. Puoi ottenere. NET dal Portale di documentazione Microsoft .
Dovrai installare i modelli Lambda e gli strumenti Lambda globali.
dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.Tools
Questo imposta molte opzioni; puoi elencarli tutti con:
dotnet new --list
Questo strumento è abbastanza utile in quanto viene fornito con molti modelli in pacchetto preconfigurati per diversi casi d’uso. In genere, avrai bisogno di una funzione per progetto per mantenere le dimensioni di build ridotte, ma puoi avere più funzioni in una singola DLL se utilizzi modelli serverless AWS che vengono distribuiti utilizzando i modelli CloudFormation. Sono molto più difficili da gestire, quindi usali solo se ti avvantaggiano.
Tuttavia con i file di soluzione. NET, puoi avere più progetti paralleli che fanno riferimento ad assembly condivisi, quindi questo non è un grosso problema.
Per ora, utilizzeremo un semplice modello “Empty Function” che crea un progetto utilizzando. NET 6. Puoi crearlo dalla riga di comando o dalla schermata del nuovo progetto del tuo editor.
dotnet new lambda.EmptyFunction --name SimpleLambdaFunction --profile default --region us-east-1
Questo genera una funzione molto semplice: prende una stringa come input e anche passa ILambdaContext
. Questa Main()
è la funzione del punto di ingresso per la tua Lambda e verrà chiamata dal runtime ogni volta che viene chiamata la funzione Lambda. Questa particolare funzione restituisce string
, ma puoi anche farlo async
e tornare Task<string?>
.
Nella parte superiore vedrai un attributo assembly che configura il serializzatore JSON. Internamente, Lambda deserializza il contenuto di input per te e quindi chiama la tua funzione. Successivamente, se restituisce qualcosa, verrà scritto nel flusso di risposta. Le librerie Lambda gestiscono questo pattern per te e il codice che racchiude la tua funzione è nel file HandlerWrapper
.
Fondamentalmente, gestirà tutti i tipi di firme di metodo e, se la tua funzione riceve input, deserializza quegli input per te. Se la tua funzione restituisce un output, serializzerà quell’output per te. Non hai davvero bisogno di fare nulla di tutto ciò poiché puoi scrivere funzioni che operano su Stream
classi grezze, ma è una bella classe wrapper per semplificare le cose.
Ciò significa che sei libero di definire i tuoi modelli per gli input e gli output passati da e verso la funzione, che è uno dei bei vantaggi dell’elaborazione JSON con C#.
In questa funzione, deserializza InputModel
la classe, attende in modo asincrono per un secondo, quindi restituisce OutputModel
la classe. Questa classe viene serializzata nel flusso di output in modo che Lambda possa elaborarla.
Esecuzione di funzioni lambda
L’esecuzione di una funzione dopo averla creata è piuttosto semplice perché l’interfaccia della riga di comando Lambda. NET fornisce un metodo per distribuirlo. Corri deploy-function
con
dotnet lambda deploy-function SimpleNETFunction
Dovrai selezionare un ruolo IAM o crearne uno nuovo e potresti dover aggiungere autorizzazioni a questo nuovo ruolo. Ora dovresti vedere la funzione nella console:
Lambda fornisce un tester integrato a cui puoi passare JSON.
Questo verrà eseguito e ti mostrerà tutti i dettagli sull’esecuzione. In questo caso, con una funzione minima molto piccola, il tempo di avvio a freddo era inferiore a 500 ms, il che è abbastanza decente. NET e per Lambda in generale. Non appena fa caldo, la durata pagata si riduce a pochi millisecondi.
In questo caso, la funzione non ha utilizzato molta memoria e la riduzione della funzione a 128 MB non ha causato alcun problema.
Lascia un commento