DEV Community

Piero Bozzolo
Piero Bozzolo

Posted on • Originally published at Medium

Accelerare il ciclo di sviluppo serverless con SAM Accelerate

Accelerare il ciclo di sviluppo serverless con SAM Accelerate

Una delle più importati obbiezioni che mi vengono fatte quando parlo di serverless è che il ciclo di sviluppo e rilascio in test delle app può risultare piuttosto lento.

Spesso si parte con le prime prove nel serverless con un progetto di piccole dimensioni che é semplice e veloce da rilasciare, magari anche dalla propria macchina.

Man mano che il progetto cresce sorge la necessità di fare build e implementare pipeline secondo i principi di CI/CD. Questo è un ottimo modo per rilasciare il codice e l’applicativo, ma può risultare scomodo se devo fare test continui sul codice o se devo validare le modifiche fatte all’infrastruttura. Questo perchè devo attendere che la pipeline compia i passi di test, build, package e deploy dell’applicativo serverless e della sua infrastruttura. Anche senza passare da una pipeline questi passi possono essere eseguiti localmente dalla nostra macchina se stiamo rilasciando l’ambiente di sviluppo. Purtroppo più il progetto cresce più lenta diventa la fase di deploy.

Servirebbe una feature nei framework serverlesss che snellisca questo processo nella fase di sviluppo.

Da qualche tempo questa feature esiste nel framework AWS SAM sotto forma di beta feature e da oggi è disponibile a tutti.

Facciamo un breve passo indietro e cerchiamo di capire cos’è e come funziona SAM. Se già conosci SAM puoi andare direttamente alla sezione successiva.

Serverless Application Model

Un’applicazione serverless è costituita generalmente da codice e configurazioni.
Come gestisco il progetto e come posso descrivere il mio applicativo in modo che possa essere rilasciato su più ambienti? Ho bisogno di uno strumento che pacchettizza il mio codice e tutto il suo contorno e che lo rilasci nel cloud.

In AWS uno degli strumenti a disposizione è SAM o Serverless Application Model. SAM è fortemente imparentato con AWS CloudFormation che ne condivide la sintassi ed introduce la possibilità di configurare risorse serverless (es. Lambda Function, Bucket S3 o tabelle DynamoDB) in modo più semplice.

Facciamo un esempio: vorrei che al caricamento di un file su un bucket S3 venga invocata una funzione lambda.

La cartella del nostro codice sarà popolata con due file:

template.yaml #definizione dell'applicativo
onupload_function/app.js #codice applicativo
Enter fullscreen mode Exit fullscreen mode

Il contenuto del file template.yaml è il seguente:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:

ArticlesS3Bucket:
  Type: AWS::S3::Bucket

OnUploadFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: app.lambdaHandler
    Runtime: nodejs14.x
    CodeUri: onupload_function/
    Events:
      OnFileCreated:
        Type: S3
        Properties:
          Bucket: !Ref ArticlesS3Bucket
          Events: s3:ObjectCreated:*
Enter fullscreen mode Exit fullscreen mode

il contenuto di onupload_function/app.js è una funzione che risponde all’evento di caricamento di un file sul bucket S3. Nell’esempio loggeremo semplicemente il contenuto dell’evento:

exports.lambdaHandler = async (event, context) =>{
  console.log(JSON.stringify(event));
};
Enter fullscreen mode Exit fullscreen mode

Per rilasciare il nostro applicativo basterà da console impartire il comando:

$ sam build
$ sam deploy
Enter fullscreen mode Exit fullscreen mode

Come potrete vedere sono necessari diversi secondi prima di aver il codice e l’infrastruttura rilasciata. Nella fase di deploy sceglierete anche il nome dello stack CloudFormation a cui apparterrà l’applicativo. Segnamolo da parte perchè ci servirà dopo.
Questo è un passaggio obbligatorio anche in presenza della nuova feature.

Come velocizzare il processo di deploy

Come abbiamo visto il processo di rilascio non è complicatissimo, ma può rallentare quando aggiungo molte risorse perchè, ad esempio, vengono pacchettizzate ogni volta tutte le funzioni lambda e ne viene creata una nuova versione. Spesso possono trascorrere anche alcuni minuti prima di poter provare il nuovo codice sul cloud.

Per velocizzare il processo possiamo utilizzare la feature sync che a differenza di deploy è in grado di rilasciare solo le modifiche che noi abbiamo fatto al codice o all’infrastruttura. Per poter utilizzare sync dobbiamo aver portato a termine un deploy con successo almeno una volta.

Sync ha anche in dotazione un comodissimo file watcher che è in grado di monitorare il nostro template e applicare le modifiche quando salviamo il file.

Per utilizzare sync e il suo file watcher dobbiamo dare questo comando:

sam sync --stack-name sam-app --watch
Enter fullscreen mode Exit fullscreen mode

lo stack name sarà il nome che abbiamo dato allo stack nella fase di deploy.

Il nostro applicativo sarà aggiornato in pochi secondi e risorse come Lambda function, definizioni di API in API Gateway, Step Function e altri componenti infrastrutturali saranno pronti per essere testati realmente nell’infrastruttura AWS.

Se ti interessa il mondo serverless non perderti le live di Claranet su Twich
https://www.twitch.tv/claranet_it
i video su
https://www.youtube.com/channel/UCSC2n9Q4fRacTr0jGOdcO0g

Top comments (0)