AWS Lambda Γ¨ un servizio serverless che esegue del codice in risposta a eventi, senza dover gestire lβinfrastruttura sottostante (per questo Γ¨ detto servizio serverless). Gli sviluppatori possono caricare codice scritto in diversi linguaggi come Python, C#, JavaScript e Go, e Lambda si occupa del provisioning e della scalabilitΓ . Queste funzioni sono il collante tra i vari servizi AWS in quanto possono essere triggerate in maniera automatica da eventi (esempio un nuovo evento in una SQS o SNS, una modifica ad un dato in DynamoDB se ho abilitato gli streams e cosΓ¬ via). Questo servizio Γ¨ sempre gratis fino a 1M di richieste al mese.
CLI
AWS
Una volta installata la CLI di aws sono disponibili delle funzioni per gestire le lambda, in particolare questa per elencare le lambda che ho dichiarato
aws lambda list-functions
E il seguente per lanciare tali lambda
aws lambda invoke --function-name [FUNCTION-NAME] --cli.binary-format raw-in-base64-out --payload '{...}'
.NET
.NET offre una sua CLI dedicata per sviluppare con le funzioni lambda.
Per prima cosa Γ¨ necessario installare Amazon.Lambda.Tools
dotnet tool install -g Amazon.Lambda.Tools
e poi lanciando il comando dotnet lambda
si ottiene la lista delle operazioni che posso effettuare.
Per esempio se voglio invocare una lambda posso scrivere
dotnet lambda invoke-funcion [NomeFunzione] --payload '{}'
Questa CLI Γ¨ piΓΉ user-friendly e comoda rispetto a quella nativa di AWS, per cui Γ¨ consigliata. Inoltre Γ¨ possibile installare i template per nuovi progetti .NET per iniziare a scrivere delle lambda con .NET
dotnet new -i Amazon.Lambda.Templates
Triggers and Destinations
Una volta creata la lambda su AWS Console Γ¨ possibile aggiungere tutti i trigger che devono lanciare tale funzione che le eventuali destinazioni. I trigger sono fondamentali e si usano sempre, al contrario delle destinazioni. Un trigger puΓ² essere qualsiasi cosa, da Alexa a fornitori esterni a risorse AWS come SQS, SNS e DynamoDb. In base ai trigger che vogliamo la lambda deve avere i permessi per farlo, per esempio se vogliamo ascoltare uno stream da DynamoDb dobbiamo aggiungere nelle policy della lambda i permessi per leggere tale stream, in particolare il json:
{
"Sid": "APIAccessForDynamoDBStreams",
"Effect": "Allow",
"Action": [
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:DescribeStream",
"dynamodb:ListStreams"
],
"Resource": "arn:aws:dynamodb:eu-west-2:413211719643:table/customers/stream/*"
}
.NET
Posso creare sia funzioni classiche da triggerare che unβAPI vera e propria. In questo ultimo caso lβAPI verrΓ caricata in un bucket S3 e verrΓ detta serverless
(nei template si chiama Lambda.Empty.Serverless
).
Per fare il deploy din una lambda posso usare il comando dotnet lambda deploy-function [NOME]
mentre per eliminarla dotnet lambda delete-function [NOME]
In questo ultimo caso verrΓ fornito un URL da chiamare con metodo GET o POST che effettuerΓ delle cose.
Invece di deploy-function
posso usare deploy-serverless
che Γ¨ un comando che distribuisce unβintera applicazione serverless che puΓ² includere una o piΓΉ funzioni AWS Lambda, endpoint API Gateway, risorse DynamoDB, S3 e cosΓ¬ via.
Abbiamo quindi costruito sfruttando le lambda una REST API gestire effettivamente il server in cui questa ultima gira.
Debugging
Per debug di una Lambda in locale con AWS Lambda Test Tool, prima assicurati che il tuo progetto abbia il pacchetto Amazon.Lambda.TestTool-6.0
installato.
Installalo con
dotnet tool install -g Amazon.Lambda.TestTool-9.0
Avvia il test tool con il comando:
dotnet lambda-test-tool-6.0
Questo avvierΓ un server locale, di default su http://localhost:5050
, dove potrai testare la funzione Lambda inserendo input JSON direttamente nellβinterfaccia web e visualizzando i risultati e i log.
Puoi aggiungere breakpoint nel codice Lambda e collegarti con Rider tramite Debug > Attach to Process, scegliendo il processo del test tool.
Un trucco per evitare lβattach di process Γ¨ creare un nuovo Edit Configuration
β .NET Executable
con:
exe path
il path dove Γ¨ stato installato illambda test tools
, tipicamente in[utente]/.dotnet/tools/dotnet-lambda-test-tool-6,0.exe
Working Directory
: il path dove sta il codice sorgente che voglio debuggareRuntime
: .NET/.NET Core
In questo modo quando lancio tale configurazione viene lanciato automaticamente il browser da cui triggerare la richiesta.