Sviluppo per il cloud nel cloud: sviluppo di BigData con Docker in AWS
Pubblicato: 2022-03-11Perché potresti averne bisogno?
Sono uno sviluppatore e lavoro quotidianamente in ambienti di sviluppo integrati (IDE), come Intellij IDEA o Eclipse. Questi IDE sono applicazioni desktop. Dall'avvento di Google Documents, ho visto sempre più persone spostare il proprio lavoro dalle versioni desktop di Word o Excel al cloud utilizzando un equivalente online di un elaboratore di testi o un'applicazione per fogli di calcolo.
Ci sono ovvi motivi per utilizzare un cloud per mantenere il tuo lavoro. Oggi, rispetto alle tradizionali applicazioni desktop aziendali, alcune applicazioni web non presentano uno svantaggio significativo nelle funzionalità. Il contenuto è disponibile ovunque ci sia un browser web e, al giorno d'oggi, è quasi ovunque. La collaborazione e la condivisione sono più facili e la perdita di file è meno probabile.
Sfortunatamente, questi vantaggi del cloud non sono così comuni nel mondo dello sviluppo software come per le applicazioni aziendali. Ci sono alcuni tentativi di fornire un IDE online, ma non sono affatto vicini agli IDE tradizionali.
Questo è un paradosso; mentre siamo ancora legati al nostro desktop per la codifica quotidiana, il software viene ora generato su più server. Gli sviluppatori devono lavorare con cose che non possono più tenere sul proprio computer. In effetti, i laptop non stanno più aumentando la loro potenza di elaborazione; avere più di 16 GB di RAM su un laptop è raro e costoso e i dispositivi più recenti, ad esempio i tablet, ne hanno ancora meno.
Tuttavia, anche se non è ancora possibile sostituire le classiche applicazioni desktop per lo sviluppo software, è possibile spostare l'intero desktop di sviluppo nel cloud . Il giorno in cui ho capito che non era più necessario avere tutti i miei software sul mio laptop, e notando la disponibilità della versione web dei terminali e VNC, ho spostato tutto sul cloud. Alla fine, ho sviluppato un kit di costruzione per creare quell'ambiente in modo automatizzato.
In questo articolo presento una serie di script per creare un ambiente di sviluppo basato su cloud per Scala e applicazioni Big Data, in esecuzione con Docker in Amazon AWS, e comprendente un desktop accessibile al Web con IntelliJ IDE, Spark, Hadoop e Zeppelin come servizi e anche strumenti da riga di comando come SSH, SBT e Ammonite basati sul Web. Il kit è disponibile gratuitamente su GitHub e descrivo qui la procedura per utilizzarlo per creare la tua istanza. Puoi costruire il tuo ambiente e personalizzarlo in base alle tue esigenze particolari. Non dovrebbero volerci più di 10 minuti per averlo installato e funzionante.
Cosa c'è nel "BigDataDevKit"?
Il mio obiettivo principale nello sviluppo del kit era che il mio ambiente di sviluppo fosse qualcosa che potevo semplicemente attivare, con tutti i servizi e i server con cui lavoro, e poi distruggerli quando non sono più necessari. Ciò è particolarmente importante quando si lavora su progetti diversi, alcuni dei quali coinvolgono un gran numero di server e servizi, come quando si lavora su progetti di big data.
Il mio ambiente ideale basato su cloud dovrebbe:
- Includere tutti i soliti strumenti di sviluppo, soprattutto un IDE grafico.
- Avere a portata di mano i server e i servizi di cui ho bisogno.
- Sii facile e veloce da creare da zero ed espandibile per aggiungere più servizi.
- Essere completamente accessibile utilizzando solo un browser web.
- Facoltativamente, consentire l'accesso con client specializzati (client VNC e client SSH).
Sfruttando la moderna infrastruttura e il software cloud, la potenza dei browser moderni, una disponibilità diffusa della banda larga e l'inestimabile Docker, ho creato un ambiente di sviluppo per Scala e lo sviluppo di big data che, in meglio, ha sostituito il mio laptop di sviluppo.
Attualmente posso lavorare in qualsiasi momento, sia da un MacBook Pro, un Surface Tablet o anche da un iPad (con tastiera), anche se è vero che l'ultima opzione non è l'ideale. Tutti questi dispositivi sono solo client; il desktop e tutti i server sono nel cloud.
Il mio ambiente attuale è creato utilizzando i seguenti servizi online:
- Amazon Web Services per i server.
- GitHub per la memorizzazione del codice.
- Dropbox per salvare i file.
Uso anche un paio di servizi gratuiti, come DuckDns per indirizzi IP dinamici e Let's encrypt per ottenere un certificato SSL gratuito.
In questo ambiente attualmente ho:
- Un desktop grafico con l'idea Intellij, accessibile tramite un browser web.
- Strumenti da riga di comando accessibili dal Web come SBT e Ammonite.
- Hadoop per archiviare file ed eseguire lavori MapReduce.
- Spark Job Server per lavori pianificati.
- Zeppelin per un notebook basato sul Web.
Ancora più importante, l'accesso al Web è completamente crittografato con HTTPS, sia per VNC che per SSH basati sul Web, e ci sono molteplici salvaguardie per evitare la perdita di dati, una preoccupazione che è, ovviamente, importante quando non si "possiede" il contenuto su il tuo disco rigido fisico. Nota che ottenere una copia di tutto il tuo lavoro sul tuo computer è automatico e molto veloce. Se perdi tutto perché qualcuno ha rubato la tua password, ne hai comunque una copia sul tuo computer, purché tu abbia configurato tutto correttamente.
Utilizzo di un ambiente di sviluppo basato sul Web con AWS e Docker
Ora, iniziamo a descrivere come funziona l'ambiente. Quando inizio a lavorare al mattino, la prima cosa è accedere alla console Amazon Web Services dove vedo tutte le mie istanze. Di solito, ho molte istanze di sviluppo configurate per progetti diversi e tengo disattivate quelle non utilizzate per risparmiare sulla fatturazione. Dopotutto, posso lavorare solo su un progetto alla volta. (Beh, a volte lavoro su due.)
Quindi, seleziono l'istanza che voglio, la avvio, aspetto un po' o vado a prendere una tazza di caffè. Non è così diverso dall'accendere il computer. Di solito sono necessari alcuni secondi per avere l'istanza attiva e funzionante. Quando vedo l'icona verde, apro un browser e vado a un URL noto: https://msciab.duckdns.org/vnc.html . Nota, questo è il mio URL; quando crei un kit, creerai il tuo URL univoco.
Poiché AWS assegna un nuovo IP a ogni macchina all'avvio, ho configurato un servizio DNS dinamico, quindi puoi sempre utilizzare lo stesso URL per accedere al tuo server, anche se lo interrompi e lo riavvii. Puoi persino aggiungerlo ai segnalibri nel tuo browser. Inoltre, utilizzo HTTPS, con chiavi valide per avere una protezione totale del mio lavoro dagli sniffer, nel caso dovessi gestire password e altri dati sensibili.
Una volta caricato, il sistema ti accoglierà con un client Web VNC Web, NoVNC. Effettua il login e apparirà un desktop. Uso un desktop minimale, intenzionalmente, solo un menu con le applicazioni, e il mio unico lusso è un desktop virtuale (dato che apro molte finestre quando sviluppo). Per la posta, mi affido ancora ad altre applicazioni, al giorno d'oggi per lo più altre schede del browser.
Nella macchina virtuale ho quello che mi serve per sviluppare applicazioni per big data. Innanzitutto, c'è un IDE. Nella build, utilizzo l'edizione della community di IntelliJ Idea. Inoltre, c'è lo strumento di compilazione SBT e un REPL Scala, Ammonite.
Le caratteristiche principali di questo ambiente, tuttavia, sono i servizi distribuiti come contenitori nella stessa macchina virtuale. In particolare ho:
- Zeppelin, il notebook web per utilizzare il codice Scala al volo e fare analisi dei dati (
http://zeppelin:8080) - Spark Job Server, per eseguire e distribuire lavori spark con un'interfaccia Rest (
http://sparkjobserver:8080). - Un'istanza di Hadoop per l'archiviazione e il recupero di dati da HDFS (
http://hadoop:50070).
Nota, questi URL sono fissi ma sono accessibili all'interno dell'ambiente virtuale. Puoi vedere le loro interfacce web nello screenshot seguente.
Ogni servizio viene eseguito in un contenitore Docker separato. Senza diventare troppo tecnico, puoi pensare a questo come a tre server separati all'interno della tua macchina virtuale. Il bello dell'utilizzo di Docker è che puoi aggiungere servizi e persino aggiungere due o tre macchine virtuali. Utilizzando i container Amazon, puoi scalare facilmente il tuo ambiente.
Ultimo, ma non meno importante, hai a disposizione un terminale web. Accedi semplicemente al tuo URL con HTTPS e sarai accolto con un terminale in una pagina web.
Nello screenshot sopra puoi vedere che elenco i container, che sono i tre server più il desktop. Questa shell della riga di comando ti dà accesso alla macchina virtuale che contiene i contenitori, permettendoti di gestirli. È come se i tuoi server fossero "in Matrix" (virtualizzati all'interno di container), ma questa shell ti offre una via di fuga al di fuori della "Matrix" per gestire server e desktop. Da qui, puoi riavviare i container, accedere ai loro filesystem ed eseguire altre manipolazioni consentite da Docker. Non discuterò in dettaglio Docker qui, ma c'è una grande quantità di documentazione sul sito Web Docker.
Come configurare la tua istanza
Ti è piaciuto finora e vuoi la tua istanza? È facile ed economico. Puoi ottenerlo semplicemente al costo della macchina virtuale su Amazon Web Services, più lo spazio di archiviazione. Il kit nella configurazione attuale richiede 4 GB di RAM per far funzionare tutti i servizi. Se stai attento a usare la macchina virtuale solo quando ne hai bisogno e lavori, diciamo, 160 ore al mese, una macchina virtuale alle tariffe attuali costerà 160 x $ 0,052 o $ 8 al mese. Devi aggiungere il costo di archiviazione. Uso circa 30 GB, ma tutto sommato può essere mantenuto sotto i $ 10.
Tuttavia, questo bot include il costo di un (eventuale) account Dropbox (Pro), se desideri eseguire il backup di più di 2 GB di codice. Questo costa altri $ 15 al mese, ma fornisce un'importante sicurezza per i tuoi dati. Inoltre, avrai bisogno di un repository privato, un GitHub a pagamento o un altro servizio, come Bitbucket, che offre repository privati gratuiti.
Voglio sottolineare che se lo usi solo quando ne hai bisogno, è più economico di un server dedicato. Sì, tutto quanto menzionato qui può essere configurato su un server fisico, ma poiché lavoro con i big data ho bisogno di molti altri servizi AWS, quindi penso che sia logico avere tutto nello stesso posto.
Vediamo come fare l'intera configurazione.
Prerequisiti
Prima di iniziare a costruire una macchina virtuale, è necessario registrarsi con i seguenti quattro servizi:
- Servizi Web Amazon.
- DuckDNS.
- Dropbox.
- Crittografiamo.
L'unico per cui hai bisogno della tua carta di credito è Amazon Web Services. DuckDns è completamente gratuito, mentre DropBox ti offre 2 GB di spazio di archiviazione gratuito, che può essere sufficiente per molte attività. Let's Encrypt è anche gratuito e viene utilizzato internamente quando crei l'immagine per firmare il tuo certificato. Oltre a questi, consiglio anche un servizio di hosting di repository, come GitHub o Bitbucket, se vuoi archiviare il tuo codice, tuttavia, non è necessario per l'installazione.
Per iniziare, vai al repository GitHub BigDataDevKit.

Scorri la pagina e copia lo script mostrato nell'immagine nel tuo editor di testo preferito:
Questo script è necessario per avviare l'immagine. Devi cambiarlo e fornire alcuni valori ai parametri. Con attenzione, cambia il testo tra virgolette. Nota che non puoi utilizzare caratteri come la virgoletta stessa, la barra rovesciata o il simbolo del dollaro nella password, a meno che non li citi. Questo problema è rilevante solo per la password. Se vuoi andare sul sicuro, evita le virgolette, il simbolo del dollaro o le barre rovesciate.
Il parametro PASSWORD è una password che scegli per accedere alla macchina virtuale tramite un'interfaccia web. Il parametro EMAIL è la tua email e verrà utilizzato quando registri un certificato SSL. Ti verrà richiesto di fornire la tua e-mail ed è l'unico requisito per ottenere un certificato SSL gratuito da Let's Encrypt.
Per ottenere i valori per TOKEN e HOST , vai al sito DuckDNS e accedi. Dovrai scegliere un nome host non utilizzato.
Guarda l'immagine per vedere dove devi copiare il token e dove devi aggiungere il tuo nome host. È necessario fare clic sul pulsante "aggiungi dominio" per prenotare il nome host.
Configurazione della tua istanza
Supponendo che tu abbia tutti i parametri e abbia modificato lo script, sei pronto per avviare la tua istanza. Accedi all'interfaccia di gestione di Amazon Web Services, vai al pannello Istanze EC2 e fai clic su "Avvia istanza".
Nella prima schermata, sceglierai un'immagine. Lo script è basato su Amazon Linux e non sono disponibili altre opzioni. Seleziona Amazon Linux, la prima opzione nell'elenco QuickStart.
Nella seconda schermata, scegli il tipo di istanza. Data la dimensione del software in esecuzione, ci sono più servizi e sono necessari almeno 4 GB di memoria, quindi ti consiglio di selezionare l'istanza t2.medium . Potresti ridurlo, usando t2.small se chiudi alcuni servizi, o anche il micro se vuoi solo il desktop.
Nella terza schermata, fai clic su "Dettagli avanzati" e incolla lo script che hai configurato nel passaggio precedente. Ti consiglio inoltre di abilitare la protezione contro la cessazione, in modo che in caso di cessazione accidentale non perderai tutto il tuo lavoro.
Il passaggio successivo consiste nel configurare l'archiviazione. Il valore predefinito per un'istanza è 8 GB, che non è sufficiente per contenere tutte le immagini che creeremo. Consiglio di aumentarlo a 20 GB. Inoltre, sebbene non sia necessario, suggerisco un altro dispositivo a blocchi di almeno 10 GB. Lo script monterà il secondo dispositivo a blocchi come cartella dati. Puoi creare uno snapshot del suo contenuto, terminare l'istanza, quindi ricrearlo utilizzando lo snapshot e ripristinando tutto il lavoro. Inoltre, un dispositivo a blocchi personalizzato non viene perso quando chiudi l'istanza, quindi hai una doppia protezione contro la perdita accidentale dei tuoi dati. Per aumentare ulteriormente la tua sicurezza, puoi eseguire il backup automatico dei tuoi dati con Dropbox.
Il quinto passaggio consiste nel nominare l'istanza. Scegli il tuo. Il sesto passaggio offre un modo per configurare il firewall. Per impostazione predefinita è disponibile solo SSH ma abbiamo anche bisogno di HTTPS, quindi non dimenticare di aggiungere anche una regola di apertura HTTPS. Potresti aprire HTTPS al mondo, ma è meglio se è solo sul tuo IP per impedire ad altri di accedere al tuo desktop e shell, anche se è ancora protetto da una password.
Una volta terminata quest'ultima configurazione, puoi avviare l'istanza. Noterai che l'inizializzazione può richiedere alcuni minuti la prima volta poiché lo script di inizializzazione è in esecuzione e eseguirà anche alcune attività lunghe come la generazione di un certificato HTTPS con Let's Encrypt.
Quando alla fine vedi la console di gestione "in esecuzione" con una conferma e non è più in "inizializzazione", sei pronto per partire.
Supponendo che tutti i parametri siano corretti, puoi accedere a https://YOURHOST.duckdns.org .
Sostituisci YOURHOST con il nome host che hai scelto, ma non dimenticare che è un sito HTTPS, non HTTP, quindi la tua connessione al server è crittografata, quindi devi scrivere https// nell'URL. Il sito presenterà anche un certificato valido per Let's Encrypt. Se si verificano problemi nell'ottenere il certificato, lo script di inizializzazione genererà un certificato autofirmato. Sarai comunque in grado di connetterti con una connessione crittografata, ma il browser ti avviserà che si tratta di un sito sconosciuto e le connessioni non sono sicure. Non dovrebbe succedere, ma non si sa mai.
Supponendo che tutto funzioni, accedi al terminale web, Butterfly. Puoi accedere utilizzando l' app utente e la password inserita nello script di installazione.
Una volta effettuato l'accesso, hai una macchina virtuale avviata, che include anche Docker e altri gadget, come Nginx Frontend, Git e Butterfly Web Terminal. Ora puoi completare la configurazione creando le immagini Docker per il tuo ambiente di sviluppo.
Quindi, digita i seguenti comandi:
git clone https://github.com/sciabarra/BigDataDevKit cd BigDataDevKit sh build.shL'ultimo comando ti chiederà anche di digitare una password per l'accesso al Desktop. Una volta fatto, inizierà a costruire le immagini. Nota che la build richiederà circa 10 minuti, ma puoi vedere cosa sta succedendo perché tutto è mostrato sullo schermo.
Una volta completata la build, puoi anche installare Dropbox con il seguente comando:
/app/.dropbox-dist/dropboxdIl sistema mostrerà un collegamento su cui devi fare clic per abilitare Dropbox. Devi accedere a Dropbox e il gioco è fatto. Qualunque cosa tu metta nella cartella Dropbox viene automaticamente sincronizzata tra tutte le tue istanze Dropbox.
Una volta terminato, puoi riavviare la macchina virtuale e accedere al tuo ambiente all'URL https://YOURHOST.dyndns.org/vnc.html .
Puoi fermare la macchina e riavviarla quando riprendi il lavoro. L'URL di accesso rimane lo stesso. In questo modo pagherai solo per il tempo in cui lo utilizzerai, più un extra mensile per lo spazio di archiviazione utilizzato.
Conservazione dei tuoi dati
La discussione seguente richiede una certa conoscenza del funzionamento di Docker e Amazon. Se non vuoi capire i dettagli, tieni presente la semplice regola: nella macchina virtuale è disponibile una cartella /app/Dropbox , tutto ciò che inserisci in /app/Dropbox viene conservato e tutto il resto è usa e getta e può andare via. Per migliorare ulteriormente la sicurezza, archivia anche il tuo prezioso codice in un sistema di controllo della versione.
Ora, se vuoi capirlo, continua a leggere. Se hai seguito le mie indicazioni nella creazione della macchina virtuale, la macchina virtuale è protetta dalla terminazione, quindi non puoi distruggerla accidentalmente. Se decidi espressamente di interromperlo, il volume principale verrà distrutto. Tutte le immagini Docker andranno perse, comprese tutte le modifiche apportate.
Tuttavia, poiché la cartella /app/Dropbox è montata come volume Docker per i contenitori, non fa parte delle immagini Docker. Nella macchina virtuale, la cartella /app è montata nel volume Amazon che hai creato, che non viene nemmeno distrutto anche quando chiudi espressamente la macchina virtuale. Per rimuovere il volume, devi rimuoverlo espressamente.
Non confondere i volumi Docker, che sono un'entità logica Docker, con Amazon Volumes, che è un'entità in qualche modo fisica. Quello che succede è che il volume /app/Dropbox Docker viene posizionato all'interno del volume /app Amazon.
Il volume Amazon non viene automaticamente distrutto al termine della macchina virtuale, quindi tutto ciò che viene inserito in esso verrà conservato, fino a quando non distruggi espressamente anche il volume. Inoltre, tutto ciò che hai inserito nel volume Docker viene archiviato all'esterno del container, quindi non viene distrutto quando il container viene distrutto. Se hai abilitato Dropbox, come consigliato, tutti i tuoi contenuti vengono copiati sui server Dropbox e sul tuo disco rigido se sincronizzi Dropbox con i tuoi computer. Inoltre, si consiglia di archiviare il codice sorgente in un sistema di controllo della versione.
Quindi, se metti le tue cose nel sistema di controllo della versione nella cartella Dropbox, per perdere i tuoi dati tutto questo deve accadere:
- Chiudi espressamente la tua macchina virtuale.
- Rimuovi espressamente il volume di dati dalla macchina virtuale.
- Rimuovi espressamente i dati da Dropbox, inclusa la cronologia.
- L'utente rimuove espressamente i dati dal sistema di controllo della versione.
Spero che i tuoi dati siano abbastanza al sicuro.
Conservo una macchina virtuale per ogni progetto e, al termine, tengo spente le macchine virtuali inutilizzate. Ovviamente, ho tutto il mio codice su GitHub e ho eseguito il backup in Dropbox. Inoltre, quando smetto di lavorare su un progetto, faccio uno snapshot del blocco Amazon Web Services prima di rimuovere completamente la macchina virtuale. In questo modo, ogni volta che un progetto riprende, ad esempio per la manutenzione, tutto ciò che devo fare è avviare una nuova macchina virtuale utilizzando lo snapshot. Tutti i miei dati tornano a posto e posso riprendere a lavorare.
Ottimizzazione dell'accesso
Innanzitutto, se disponi di un accesso a Internet diretto, non mediato da un proxy, puoi utilizzare client SSH e VNC nativi. L'accesso SSH diretto è importante se devi copiare file dentro e fuori dalla macchina virtuale. Tuttavia, per la condivisione di file, dovresti considerare Dropbox come un'alternativa più semplice.
L'accesso al Web VNC è inestimabile, ma a volte può essere più lento di un client nativo. Hai accesso al server VNC sulla macchina virtuale utilizzando la porta 5900. Devi aprirlo espressamente perché è chiuso per impostazione predefinita. Ti consiglio di aprirlo solo sul tuo indirizzo IP, perché Internet è pieno di "robot" che scansionano Internet alla ricerca di servizi a cui collegarsi e VNC è un obiettivo frequente di quei robot.
Conclusione
Questo articolo spiega come sfruttare la moderna tecnologia cloud per implementare un ambiente di sviluppo efficace. Sebbene una macchina nel cloud non possa sostituire completamente il tuo computer o laptop funzionante, è abbastanza buona per svolgere lavori di sviluppo quando è importante avere accesso all'IDE. Nella mia esperienza, con le attuali connessioni Internet, è abbastanza veloce per funzionare.
Essendo nel cloud, l'accesso e la manipolazione del server è più veloce che averli localmente. Puoi aumentare (o diminuire) rapidamente la memoria, attivare un altro ambiente, creare un'immagine e così via. Hai un data center a portata di mano e quando lavori con progetti di big data, beh, hai bisogno di servizi solidi e molto spazio. Questo è ciò che offre il cloud.
