Accelerare il ciclo di sviluppo serverless con SAM Accelerate
Published: 2024-05-14 15:04:01


## 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.

![](https://cdn-images-1.medium.com/max/2000/1*he1pkHiNvbyQzpxXr_aucg.jpeg)

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

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:*

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));
    };

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

    $ sam build
    $ sam deploy

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

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](https://www.twitch.tv/claranet_it)
i video su 
[https://www.youtube.com/channel/UCSC2n9Q4fRacTr0jGOdcO0g](https://www.youtube.com/channel/UCSC2n9Q4fRacTr0jGOdcO0g)