fbpx

Sviluppare localmente con DynamoDB

Nell’oramai lontano 2013, AWS aggiunse al proprio servizio DynamoDB un tool che offre la possibilità di eseguire lo stesso servizio database localmente sulla propria macchina. Questo permette di scrivere e testare codice che usa le DynamoDB API anche se si è offline, senza incorrere in nessun costo per l’utilizzo del servizio web o per procedure di CI/CD.

Questo tool è chiamato DynamoDB-Local ed è un database client-side che riproduce perfettamente DynamoDB e tutte le sue API. Grazie a questo tool, durante gli sviluppi o le procedure di test ci basterà effettuare le chiamate al nostro servizio offline al posto del dell’online di AWS.

Per fruire di DynamoDB-Local, AWS ci mette a disposizione 3 modalità:

  1. JAR
  2. Dipendenza Apache Maven
  3. Docker image

Per utilizzare direttamente l’eseguibile Java, dobbiamo prima di tutto scaricare il pacchetto JAR, estrarlo ed infine eseguire DynamoDBLocal.jar, navigando tramite la propria shell nella cartella dove è stato estratto. I link per il download e la guida all’esecuzione è disponibile nella relativa documentazione ufficiale AWS.

Per Apache Maven possiamo sempre seguire gli step nella documentazione ufficiale AWS.

L’ultima modalità, tramite Docker Image, è sicuramente una delle più flessibili per l’integrazione nei nostri sistemi, specialmente in caso di infrastrutture di Continuous Integration o ambienti locali di sviluppo come Docker-Compose. Questa è infatti la modalità di distribuzione utilizzata da noi in Madisoft per permettere dei test veloci ed autonomi.
Uno dei migliori modi per testarne le funzionalità è, dunque, tramite Docker-Compose. Possiamo prendere il seguente esempio per spiegarne velocemente opzioni ed modalità di interconnessione:

Il seguente codice rappresenta un semplice costruttore Compose con un container DynamoDB-Local ed un secondo contenente la CLI shell AWS. Il primo container rappresenta quindi la nostra istanza DynamoDB ed il secondo un’applicazione che richiama le API de nostro database, in questo caso stiamo facendo una chiamata describe-limits. Nel primo container dynamodb-local esponiamo la porta di default, ovvero la 8000. Nel secondo container impostiamo come variabili d’ambiente le credenziali AWS ed il comando awscli che verrà lanciato all’esecuzione. Impostare le credenziali AWS (Access e Secret keys) è obbligatorio ma non serve che siano valide. Inoltre dobbiamo, obbligatoriamente, specificare l’opzione --endpoint-url con l’hostname/IP e la porta del relativo container Dynamo.

Di default il container DynamoDB-Local salva i dati in memoria e perderemmo tabelle e contenuti nel caso venisse stoppato. Per questo in alcuni casi può essere utile aggiungere l’opzione --sharedDb per ovviare a questo problema. Per aggiungere l’opzione bisogna sovrascrivere il comando con cui viene avviato il servizio nel container, quindi il nostro componente dovrà essere:

Per consultare tutte le opzioni, visitare la relativa documentazione ufficiale.

Potremmo semplificare la consultazione della nostra istanza locale di DynamoDB tramite una semplice interfaccia grafica che può essere fatta girare in un altro container, chiamata dynamodb-admin.

I hope to see you again, cheerio!

Madisoft
Madisoft
Articoli: 20

2 commenti

  1. Ottimo spunto Andrea Salvatori.
    Spero di fare cosa gradita segnalando un alternativa che utilizzo per sviluppare in locale quando sono coinvolti servizi aws.
    Si tratta di localstack, un framework di test/mocking per lo sviluppo in locale di applicazioni cloud based.
    Personalmente l’ho utilizzato per sqs, dynamodb, s3, lambda, api gateway, ma la lista dei servizi supportati è molto piu estesa.

    • Ciao Sergio, grazie per il commento e scusa il ritardo di questa risposta.
      Ho recentemente letto qualcosa a proposito di LocalStack. Nel caso il progetto sia completamente costruito su AWS, strumenti come questo o SAM sono la scelta migliore.
      Approfondirò sicuramente LocalStack in quanto, attualmente, mi sembra uno strumento stabile e completo.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.