Desarrollo Para La Nube En La Nube: Desarrollo BigData Con Docker En AWS
Más y más personas están moviendo su trabajo desde aplicaciones de escritorio a la nube, usando un equivalente de una aplicación web online. Sin embargo, esto no ha sido verdadero, desafortunadamente, para el desarrollo software IDE. Aunque ha habido intentos de proporcionar una IDE online, no se han acercado al IDE tradicional.
En este artículo, Michele Sciabarra, Ingeniero Software Freelance en Toptal, nos guía en cómo construir un ambiente de desarrollo basado en la nube para aplicaciones Scala y big data, con la ayuda de Docker en AWS de Amazon.
Más y más personas están moviendo su trabajo desde aplicaciones de escritorio a la nube, usando un equivalente de una aplicación web online. Sin embargo, esto no ha sido verdadero, desafortunadamente, para el desarrollo software IDE. Aunque ha habido intentos de proporcionar una IDE online, no se han acercado al IDE tradicional.
En este artículo, Michele Sciabarra, Ingeniero Software Freelance en Toptal, nos guía en cómo construir un ambiente de desarrollo basado en la nube para aplicaciones Scala y big data, con la ayuda de Docker en AWS de Amazon.
Michele is a system architect with over 20 years of experience. He is a polyglote developer but his specialty is Scala and DevOps.
Previously At
¿Por qué lo podrías necesitar?
Soy desarrollador y trabajo todos los días en Ambiente de Desarrollo Integrado (IDE: Integrated Development Enviroment), como lo es Intellij IDEA o Eclipse. Estos IDE son aplicaciones de escritorio. Desde la llegada de Google Documents, he visto más y más personas mover su trabajo de versiones de escritorio de Word o Excel a la nube, usando un equivalente online de una aplicación de procesador de palabras u hoja de cálculo.
Hay razones obvias para usar una nube para guardar tu trabajo. Hoy en día, comparado con las aplicaciones tradicionales de negocios de escritorio, algunas aplicaciones web no tienen una desventaja en cuanto a funcionalidades. El contenido está disponible donde sea que haya un buscador web, y estos días, eso se da casi en todas partes. Colaborar y compartir es fácil, y la pérdida de archivos es menos probable.
Desafortunadamente, estas ventajas de la nube no son tan comunes en el mundo del desarrollo software, como lo son para las aplicaciones de negocios. Hay algunos intentos de proveer una IDE online, pero no se acercan a las IDE tradicionales.
Eso es paradójico; mientras seguimos atados a nuestro escritorio para la programación diaria, el software ahora se ha generado en múltiples servidores. Los desarrolladores necesitan trabajar con cosas que ya no puedan mantener en sus computadoras. Por supuesto, las laptops ya no aumentan su poder de procesamiento; tener más de 16gb de RAM en una laptop es raro y costoso, sin mencionar que aparatos más nuevos, por ejemplo, tablets, tienen aún menos memoria.
Sin embargo, aún si todavía no es posible reemplazar las aplicaciones clásicas de escritorio para desarrollo software, es posible mover todo tu escritorio de desarrollo a la nube. El día que lo descubrí, ya no fue necesario tener todo mi software en mi laptop, y al notar la disponibilidad de una versión web de terminales y VNC, moví todo a la nube. Eventualmente, desarrollé un kit de construcción para crear ese ambiente de forma automática.
En este artículo presento un set de secuencias de comandos para construir un ambiente de desarrollo basado en la nube para Scala y aplicaciones big data, ejecuciones con Docker en Amazon AWS y comprimir escritorio accesible a la web con IntelliJ IDE, Spark, Hadoop y Zeppelin como servicios, al igual que herramientas de comando de línea como las basadas en web SSH, SBT y Ammonite. El kit está disponible gratuitamente en GitHub, también describo el procedimiento para usarlo para la construcción de tu instancia. Puedes construir tu ambiente y personalizarlo para tus necesidades particulares. No debería tomarte más de 10 minutos tenerlo listo para trabajar.
¿Qué hay en el “BigDataDevKit”?
Mi meta principal al desarrollar el kit era que mi ambiente de desarrollo debía ser algo que simplemente pudiera activar con todos los servicios y servidores con los que trabajo, para luego destruirlos cuando ya no se necesiten. Esto es importante, en especial cuando estás trabajando con diferentes proyectos.
Mi ambiente ideal basado en la nube debería:
- Incluir todas las herramientas típicas de desarrollo, sobre todo una IDE gráfica.
- Tener todos los servidores y servicios que necesito a mano.
- Ser fácil y rápido de crear desde cero y expandir para así añadir más servicios.
- Ser completamente accesible usando solo un buscador web.
- Opcionalmente, permitir acceso con clientes especializados (cliente VNC y cliente SSH).
Al hacer uso de la infraestructura y software de la nube moderna, el poder de los buscadores modernos, una variedad de disponibilidad de banda ancha y un Docker invaluable, creé un ambiente de desarrollo para Scala y desarrollo big data eso reemplazo mi laptop de desarrollo, para bien.
Actualmente, puedo trabajar en cualquier momento, ya sea desde una MacBook Pro, una Tablet Surface o hasta un iPad (con teclado), aunque admito que la última opción no es ideal. Todos estos aparatos son básicamente clientes; el escritorio y todos los servicios están en la nube.
Mi ambiente actual está construido usando los siguientes servicios en línea:
- Servicios Web Amazon para los servidores.
- GitHub para almacenar el código.
- Dropbox para guardar archivos.
También utilizo un par de servicios gratis, como DuckDns para direcciones IP y Let’s encrypt para obtener un certificado gratis SSL.
Actualmente, en este ambiente tengo:
- Un escritorio gráfico con idea Intellij, accesible a través de un buscador web.
- Herramientas de línea de comando accesible a través de la web, como SBT y Ammonite.
- Hadoop para guardar archivos y ejecutar trabajos MapReduce.
- Servidor Spark Job para trabajos programados.
- Zeppelin para un cuaderno basado en la web.
Pero lo más importante de todo es que el acceso web está codificado con HTTPS para ambos VNC y SSH basados en la web, y hay varios salvavidas para evitar perder data, una preocupación que es, por supuesto, importante cuando no “posees” el contenido en tu disco duro físico. Ten en cuenta que obtener una copia de todo tu trabajo en tu computadora es automático y muy rápido. Si pierdes todo porque alguien robo tu contraseña, tienes una copia en tu computadora de todas formas, siempre y cuando hayas configurado todo correctamente.
Usar un Ambiente de Desarrollo Basado en la Web con AWS y Docker
Ahora, comencemos a describir cómo funciona el ambiente. Cuando comienzo a trabajar en la mañana, lo primero que hago es ingresar a la consola de Servicios Web de Amazon, donde veo todas mis instancias. Usualmente, tengo muchas instancias de desarrollo configuradas para distintos proyectos y mantengo apagados los que no se han usado para ahorrar en las facturas. Después de todo, solo puedo trabajar en un proyecto a la vez. (Bueno, a veces trabajo en dos).
Así que, selecciono la instancia que quiero, la inicio, espero un rato o voy a tomar una taza de café. No tiene mucha diferencia con encender tu computadora. Normalmente toma unos segundos para que la instancia comience a funcionar. Una vez que veo el icono verde, abro el buscador y me dirijo a una URL ya conocida: https://msciab.duckdns.org/vnc.html
. Ten en cuenta, ésta es mi URL; cuando creas un kit, crearás tu URL única.
Ya que AWS asigna una nueva IP a cada máquina cuando empiezas, configuré un servicio dinámico DNS, así que siempre puedes usar la misma URL para ingresar a tu servidor, aun cuando lo detienes y lo reinicias. También puedes marcarlo en tu buscador. Aún más, uso HTTPS con claves válidas para proteger al máximo mi trabajo de curiosos, en caso de que necesite manejar contraseñas y otra data delicada.
Una vez subido, el sistema te dará la bienvenida con un NoVNC, cliente web VNC. Simplemente ingresa y aparece un escritorio. Yo uso muy poco el escritorio, intencionalmente, solo un menú con aplicaciones y mi único lujo es un escritorio virtual (ya que abro muchas ventanas cuando desarrollo). Para el correo, todavía dependo de otras aplicaciones, hoy en día mayormente otras pestañas en el buscador.
En la máquina virtual tengo lo que necesito para desarrollar aplicaciones de big data. Primero y principal, hay una IDE. En el momento de la construcción, uso la edición IntelliJ Idea community. También, está la herramienta de construcción SBT y una Amonnite de Scala RELP.
Las características clave de este ambiente, sin embargo, son servicios implementados como contenedores en la misma máquina virtual. En particular, tengo:
* Zeppelin, el cuaderno web para usar código de Scala en el momento y para hacer análisis de data (http://zeppelin:8080
)
* El Servidor Spark Job, para ejecutar e implementar spark jobs con una interfaz Rest (http://sparkjobserver:8080
).
* Una instancia Hadoop para almacenar y retirar data desde el HDFS (http://hadoop:50070
).
Nota que estas URL están arregladas, pero son accesibles dentro del ambiente virtual. Puedes ver sus interfaces web en la siguiente captura de pantalla.
Cada servicio corre en un contenedor Docker por separado. Sin hablar de manera muy técnica, piensa en esto como si fuesen tres servidores distintos dentro de tu máquina virtual. El encanto de usar Docker es que puedes agregar servicios y hasta agregar dos o tres máquinas virtuales. Al usar los contenedores Amazon, puedes ajustar tu ambiente fácilmente.
Por último, pero no menos importante, tienes un terminal web disponible. Simplemente ingresa tu URL con HTTPS y te darán la bienvenida con un terminal a una página web.
En la captura de pantalla de arriba puedes ver una lista de los contenedores, que son los tres servidores más el escritorio. Esta línea de comando Shell te da acceso a la máquina virtual donde se encuentran los contenedores, lo cual te permite manejarlos. Es como si tus servidores estuvieran “en el Matrix” (de manera virtual dentro de los contenedores), pero este Shell te da un escape fuera del “Matrix” para manejar a los servidores y el escritorio. Desde aquí puedes reiniciar los contenedores, ingresar a sus sistemas de archivos y hacer otras manipulaciones que permite Docker. No voy a discutir en detalle Docker en este momento, pero hay una gran cantidad de documentos en la página web de Docker.
Como instalar tu instancia
¿Te gusta esto hasta ahora y quieres tu instancia? Es fácil y barato. Puedes tenerlo por el costo de la máquina virtual en Servicios Web de Amazon, más el almacenamiento. El kit en la configuración actual requiere 4gb de RAM para poder ejercitar todos los servicios. Si eres cuidadoso y utilizas la máquina virtual solo cuando lo necesitas, y trabajas, digamos, 160 horas al mes, una máquina virtual a los precios actuales te costará 160 x 0.052 dólares, u 8 dólares al mes. Debes agregar el costo del almacenamiento. Yo uso alrededor de 30gb, pero todo junto se puede mantener por menos de 10 dólares.
Sin embargo, esto no incluye el costo de una cuenta (Pro) Dropbox (eventual), si quisieras respaldar más de 2gb de código. Esto cuesta 15 dólares más al mes pero proporciona una seguridad importante para tu data. También vas a necesitar un repositorio privado, ya sea un GitHub pago u otro servicio, como Bitbucket, el cual ofrece repositorios privados gratis.
Quiero resaltar que si lo usas solo cuando lo necesitas, es más económico que un servidor dedicado. Sí, todo lo mencionado aquí puede ser instalado en un servidor físico, pero ya que trabajo con big data, necesito muchos servicios AWS así que pienso que es lógico tener todo en el mismo lugar.
Veamos cómo hacer toda la instalación.
Pre-requisitos
Antes de empezar a construir una máquina virtual, debes registrarte con los siguientes cuatro servicios:
El único de estos donde es necesario utilizar tu tarjeta de crédito es en Servicios Web de Amazon. DuckDns es totalmente gratis, mientras que DropBox te da 2gb de almacenamiento gratis, lo cual puede ser suficiente para muchas tareas. Let’s Encrypt también es gratis y se usa internamente cuando construyes la imagen para firmar tu certificado. Aparte de esto, recomiendo un servicio de alojamiento en repositorio también, como GitHub o Bitbucket, sin embargo, si quieres almacenar tu código, no es necesario para la instalación.
Para comenzar, navega hacia el repositorio GitHub BigDataDevKit.
Desplaza la página y copia la secuencia de comandos que se muestra en la imagen de tu editor de texto de preferencia:
Esta secuencia de comandos es necesaria para impulsar la imagen. Tienes que cambiarla y proporcionar algunos valores a los parámetros. Cambia el texto cuidadosamente dentro de las citas. Ten en cuenta que no puedes usar caracteres como la propia cita, la barra inversa o el símbolo de dólar en la contraseña, a menos que las pongas en cita. Este problema es relevante sólo para la contraseña. Si quieres estar seguro, evita las citas, símbolos de dólar o barras invertidas.
El parámetro PASSWORD
es una contraseña que escoges para ingresar a la máquina virtual vía una interfaz web. El parámetro EMAIL
es tu correo electrónico y será usado cuando registres un certificado SSL. Se te pedirá que proporciones tu correo electrónico, lo cual es el único requerimiento para obtener un Certificado SSL desde Let’s Encrypt.
Para obtener los valores para TOKEN
y HOST
, ve al sitio DuckDNS e inicia sesión. Tendrás que escoger hostname nuevo.
Observa la imagen para ver donde debes copiar el token y donde debes agregar tu hostname. Debes hacer clic en el botón “agregar dominio” para reservar el hostname.
Configurar tu instancia
Asumiendo que tengas todos los parámetros y hayas editado la secuencia de comandos, estás listo para lanzar tu instancia. Ingresa a la interfaz de gestión de Servicios Web de Amazon, dirígete al panel de Instancias EC2 y haz clic en “Instancia de Lanzamiento”.
En la primera pantalla, vas a escoger una imagen. La secuencia de comandos está construida alrededor de Linux de Amazon y no hay otras opciones disponibles. Selecciona Linux de Amazon, es la primera opción en la lista QuickStart.
En la segunda pantalla, escoge el tipo instancia. Dado el tamaño del software en ejecución, hay servicios múltiples y necesitas al menos 4gb de memoria, así que recomiendo que selecciones la instancia t2.medium. Podrías minimizarlo usando t2.small si apagas algunos servicios o hasta el micro si solo quieres el escritorio.
En la tercera pantalla, haz clic en “Detalles Avanzados” y pega la secuencia de comandos que configuraste en el paso anterior. También recomiendo que establezca protección en contra de un término, para que así, si ocurre una terminación accidental no pierdas todo tu trabajo.
El próximo paso es configurar el almacenamiento. El estándar para una instancia es 8 gb, lo cual no es suficiente para contener todas las imágenes que vamos a construir. Recomiendo aumentarlo a 20gb. De igual modo, aunque no se necesita, sugiero otro dispositivo bloque de al menos 10gb. La secuencia de comandos montará el segundo dispositivo bloque como un archivo de data. Puedes tomar una imagen de sus contenidos, terminar la instancia, luego recrearlo usando la imagen de sus contenidos y recuperar todo el trabajo. Más aún, un dispositivo bloque hecho a la medida no se pierde cuando das por terminada la instancia, así que ten doble protección sobre una pérdida de data accidental. Para aumentar aún más tu seguridad puedes respaldar tu data automáticamente con Dropbox.
El quinto paso es darle nombre a la instancia. Escoge el que quieras. El sexto paso ofrece una manera de configurar la barra de control de acceso. Por defecto, solo SSH está disponible pero también necesita HTTPS. Podrías abrir HTTPS al mundo, pero es mejor si es solo a tu IP para prevenir que otros ingresen a tu escritorio y shell, aunque sigue estando protegida con una contraseña.
Una vez hayas terminado con esta última configuración, puedes lanzar la instancia. Vas a notar que la inicialización puede tomar unos minutos la primera vez ya que la secuencia de comandos de inicio se está ejecutando, también hará algunas pruebas un poco largas, como por ejemplo generar un certificado HTTPS con Let’s Encrypt.
Eventualmente, cuando veas la consola de gestión en “ejecución” con una confirmación, y que ya no está “inicializando”, estarás listo para comenzar.
Asumiendo que todos los parámetros son correctos, puedes navegar hacia https://YOURHOST.duckdns.org
.
Reemplazas YOURHOST
con el hostname que escogiste, pero no olvides que es un sitio HTTPS, no HTTP, así que tu conexión al servidor está codificada, así que debes escribir https//
en la URL. El sitio también presentará un certificado válido para Let’s Encrypt. Si hay problemas para obtener el certificado, la secuencia de comandos en la inicialización generará un certificado de auto-firma. Igual podrás conectarte con una conexión codificada, pero el buscador te advertirá que es un sitio desconocido y las conexiones inseguras. No debería suceder, pero nunca se sabe.
Asumiendo que todo funciona, luego puedes ingresar a la terminal web Butterfly. Puedes iniciar sesión usando el nombre de usuario app
y la contraseña que usaste en la secuencia de comandos en la instalación.
Una vez que hayas iniciado sesión, tienes una máquina virtual impulsada que también incluye Docker y otros regalos, como Nginx Frontend, Git, y la Terminal Web Butterfly. Ahora puedes completar la instalación al construir las imágenes Docker para tu ambiente de desarrollo.
Luego, ingresa los siguientes comandos:
git clone https://github.com/sciabarra/BigDataDevKit
cd BigDataDevKit
sh build.sh
El último comando te pedirá que ingreses una contraseña para ingresar al Escritorio. Una vez hecho esto, comenzará a construir las imágenes. Nota que la construcción tomará unos 10 minutos, pero puedes ver lo que sucede porque todo se muestra en la pantalla.
Una vez la construcción sea completada, también podrás instalar Dropbox con el siguiente comando:
/app/.dropbox-dist/dropboxd
El sistema te mostrará un link que debes cliquear para activar Dropbox. Debes ingresar a Dropbox y luego estás listo. Lo que sea que pongas en la carpeta de Dropbox se sincroniza automáticamente con todas tus instancias de Dropbox.
Una vez listo, puedes reiniciar la máquina virtual e ingresar a tu ambiente en la URL https://YOURHOST.dyndns.org/vnc.html
.
Puedes detener tu máquina y reiniciarla cuando continúes tu trabajo. La URL de acceso se mantiene igual. De esta manera, solo pagarás por el tiempo en que la uses, además de un extra mensual por almacenamiento usado.
Preservar tu data
La siguiente discusión requiere algo de conocimiento sobre cómo funciona Docker y Amazon. Si no quieres entender los detalles, ten en cuenta la siguiente regla: En la máquina virtual hay una carpeta disponible /app/Dropbox
, lo que sea que pongas en /app/Dropbox
está preservada, y todo lo demás es desechable y puede desaparecer. Para aumentar la seguridad, almacena tu preciado código en una versión de control de sistema.
Ahora, si quieres entender esto, sigue leyendo. Si seguiste mis indicaciones en la creación de la máquina virtual, ésta se encuentra protegida en contra de la terminación así que no la puedes destruir accidentalmente. Si decides terminarla a propósito, el volumen principal será destruido. Todas las imágenes Docker se perderán, incluyendo todos los cambios que hiciste.
Sin embargo, ya que la carpeta /app/Dropbox
está montada como un Volumen Docker para contenedores, no es parte de las imágenes de Docker. En la máquina virtual, la carpeta /app
está montada en el Volumen Amazon que creaste, el cual tampoco ha sido destruido aun cuando das término específicamente a la máquina virtual. Para remover el volumen, debes removerlo específicamente.
No confundas los volúmenes Docker, los cuales son una entidad lógica de Docker, con Volúmenes Amazon, los cuales son una entidad un tanto física. Lo que sucede es que el volumen Docker /app/Dropbox
se encuentra dentro del volumen Amazon /app
.
El volumen Amazon no se destruye automáticamente cuando terminas la máquina virtual, así que lo que sea ubicado dentro será preservado, hasta que destruyas el volumen expresamente. Más aún, lo que sea que pongas en el volumen Docker es almacenado fuera del contenedor, así que no es destruido cuando se destruye el contenedor. Si habilitaste Dropbox, como lo recomendé, todo tu contenido se copia a los servidores de Dropbox y a tu disco duro, si sincronizas Dropbox con tu computadora(s). También se recomienda que el código fuente sea almacenado en un sistema de control de versiones.
Así que, si colocas tus cosas en un sistema de control de versiones bajo la carpeta Dropbox, para perder tu data debe pasar todo esto:
- Eliminas específicamente tu máquina virtual.
- Eliminas específicamente el volumen de data de tu máquina virtual.
- Eliminas específicamente la data de Dropbox, incluyendo la historia.
- Eliminas específicamente del sistema de control de versiones.
Espero que tu data esté lo suficientemente protegida.
Yo mantengo una máquina virtual para cada proyecto, y cuando termino, mantengo apagadas las máquinas virtuales sin usar. Por supuesto, tengo todos mis códigos en GitHub y resguardados en Dropbox. También, cuando dejo de trabajar en un proyecto, tomo una foto del bloque de Servicios Web de Amazon antes de eliminar por completo la máquina virtual. De esta manera, cuando se regresa a un proyecto, por ejemplo, para mantenimiento, todo lo que tengo que hacer es comenzar una nueva máquina virtual usando la foto del bloque. Toda mi data regresa a su sitio y puedo continuar mi trabajo.
Optimizar el acceso
Primero, si tienes acceso a internet sin mediación de un proxy, puedes usar SSH nativo y clientes VNC. El acceso SSH directo es importante si necesitas copiar archivos dentro y fuera de la máquina virtual. Sin embargo, para compartir archivos, deberías considerar Dropbox como una alternativa más simple.
El acceso web VNC es invaluable, pero a veces, puede ser más lento que un cliente nativo. Tienes acceso al servidor VNC en la máquina virtual usando el puerto 5900. Debes abrirlo específicamente porque se cierra por defecto. Recomiendo que solo lo abras para tu dirección IP, porque el internet está lleno de “robots” que escanean el internet buscando servicios a donde adherirse, y VNC es un blanco frecuente para estos robots.
Conclusión
Este artículo explica cómo puedes utilizar al máximo la tecnología moderna de la nube para implementar un ambiente efectivo de desarrollo. Mientras que una máquina en la nube no puede ser un reemplazo completo para tu computadora de trabajo o laptop, es lo suficientemente buena para hacer trabajo de desarrollo cuando sea importante tener acceso al IDE. En mi experiencia, con las conexiones actuales de internet, es lo suficientemente rápido para trabajar.
Al estar en la nube, el acceso al servidor y la manipulación es más rápida que cuando se tienen localmente. Puedes aumentar (o disminuir) la memoria, iniciar otro ambiente, crear una imagen y así sucesivamente. Tienes un decantador al alcance de tus manos y cuando trabajas con proyectos de big data, bueno, necesitas servicios robustos y mucho espacio. Eso es lo que provee la nube.
Michele Sciabarra
San Benedetto del Tronto, Province of Ascoli Piceno, Italy
Member since January 8, 2016
About the author
Michele is a system architect with over 20 years of experience. He is a polyglote developer but his specialty is Scala and DevOps.
PREVIOUSLY AT