Desarrollo para la nube en la nube: BigData Development con Docker en AWS

Publicado: 2022-03-11

¿Por qué puede necesitarlo?

Soy desarrollador y trabajo a diario en entornos de desarrollo integrado (IDE), como Intellij IDEA o Eclipse. Estos IDE son aplicaciones de escritorio. Desde la llegada de Documentos de Google, he visto a más y más personas trasladar su trabajo de las versiones de escritorio de Word o Excel a la nube utilizando un equivalente en línea de un procesador de textos o una aplicación de hoja de cálculo.

Hay razones obvias para usar una nube para mantener su trabajo. Hoy en día, en comparación con las aplicaciones empresariales de escritorio tradicionales, algunas aplicaciones web no tienen una desventaja significativa en cuanto a funcionalidades. El contenido está disponible dondequiera que haya un navegador web, y en estos días, eso está en casi todas partes. La colaboración y el uso compartido son más fáciles y es menos probable que se pierdan archivos.

Desafortunadamente, estas ventajas de la nube no son tan comunes en el mundo del desarrollo de software como lo son para las aplicaciones comerciales. Hay algunos intentos de proporcionar un IDE en línea, pero no están ni cerca de los IDE tradicionales.

Eso es una paradoja; Si bien todavía estamos atados a nuestro escritorio para la codificación diaria, el software ahora se genera en varios servidores. Los desarrolladores necesitan trabajar con cosas que ya no pueden guardar en su computadora. De hecho, las computadoras portátiles ya no aumentan su poder de procesamiento; tener más de 16 GB de RAM en una computadora portátil es raro y costoso, y los dispositivos más nuevos, como las tabletas, por ejemplo, tienen aún menos.

Sin embargo, incluso si aún no es posible reemplazar las aplicaciones de escritorio clásicas para el desarrollo de software, es posible mover todo su escritorio de desarrollo a la nube . El día que me di cuenta ya no era necesario tener todo mi software en mi laptop, y al notar la disponibilidad de versión web de terminales y VNC, moví todo a la nube. Finalmente, desarrollé un kit de compilación para crear ese entorno de forma automatizada.

Desarrollador en la nube

¿De qué se trata la nube para un desarrollador? ¡Desarrollando en él, por supuesto!
Pío

En este artículo, presento un conjunto de scripts para crear un entorno de desarrollo basado en la nube para Scala y aplicaciones de big data, que se ejecuta con Docker en Amazon AWS y que consta de un escritorio accesible desde la web con IntelliJ IDE, Spark, Hadoop y Zeppelin como servicios. , y también herramientas de línea de comandos como SSH, SBT y Ammonite basados ​​en web. El kit está disponible gratuitamente en GitHub, y aquí describo el procedimiento para usarlo para construir su instancia. Puede crear su entorno y personalizarlo según sus necesidades particulares. No debería llevarle más de 10 minutos tenerlo en funcionamiento.

¿Qué hay en el "BigDataDevKit"?

Mi objetivo principal al desarrollar el kit era que mi entorno de desarrollo debería ser algo que pudiera simplemente activar, con todos los servicios y servidores con los que trabajo, y luego destruirlos cuando ya no se necesiten. Esto es especialmente importante cuando trabaja en diferentes proyectos, algunos de los cuales involucran una gran cantidad de servidores y servicios, como cuando trabaja en proyectos de big data.

Mi entorno ideal basado en la nube debería:

  • Incluye todas las herramientas de desarrollo habituales, lo más importante, un IDE gráfico.
  • Tener los servidores y servicios que necesito al alcance de mi mano.
  • Ser fácil y rápido de crear desde cero y ampliable para agregar más servicios.
  • Ser completamente accesible usando solo un navegador web.
  • Opcionalmente, permitir el acceso con clientes especializados (cliente VNC y cliente SSH).

Aprovechando la infraestructura y el software de la nube modernos, el poder de los navegadores modernos, una disponibilidad generalizada de banda ancha y el invaluable Docker, creé un entorno de desarrollo para Scala y el desarrollo de big data que, para mejor, reemplazó mi computadora portátil de desarrollo.

Actualmente, puedo trabajar en cualquier momento, ya sea desde un MacBook Pro, una Surface Tablet o incluso un iPad (con teclado), aunque hay que reconocer que la última opción no es la ideal. Todos estos dispositivos son meros clientes; el escritorio y todos los servidores están en la nube.

Docker y Amazon AWS!

Mi entorno actual está construido utilizando los siguientes servicios en línea:

  • Amazon Web Services para los servidores.
  • GitHub para almacenar el código.
  • Dropbox para guardar archivos.

También uso un par de servicios gratuitos, como DuckDns para direcciones IP dinámicas y Let's encrypt para obtener un certificado SSL gratuito.

En este entorno, actualmente tengo:

  • Un escritorio gráfico con idea Intellij, accesible a través de un navegador web.
  • Herramientas de línea de comandos accesibles desde la web como SBT y Ammonite.
  • Hadoop para almacenar archivos y ejecutar trabajos de MapReduce.
  • Spark Job Server para trabajos programados.
  • Zeppelin para un portátil basado en la web.

Lo que es más importante, el acceso a la web está totalmente encriptado con HTTPS, tanto para VNC basado en la web como para SSH, y existen múltiples medidas de seguridad para evitar la pérdida de datos, una preocupación que, por supuesto, es importante cuando no es "propietario" del contenido en su disco duro físico. Tenga en cuenta que obtener una copia de todo su trabajo en su computadora es automático y muy rápido. Si pierde todo porque alguien robó su contraseña, tiene una copia en su computadora de todos modos, siempre y cuando haya configurado todo correctamente.

Uso de un entorno de desarrollo basado en web con AWS y Docker

Ahora, comencemos a describir cómo funciona el entorno. Cuando empiezo a trabajar por la mañana, lo primero es iniciar sesión en la consola de Amazon Web Services donde veo todas mis instancias. Por lo general, tengo muchas instancias de desarrollo configuradas para diferentes proyectos y mantengo las que no uso apagadas para ahorrar facturación. Después de todo, solo puedo trabajar en un proyecto a la vez. (Bueno, a veces trabajo en dos).

Pantalla 1

Entonces, selecciono la instancia que quiero, la inicio, espero un poco o voy a tomar una taza de café. No es tan diferente a encender su computadora. Por lo general, toma un montón de segundos tener la instancia en funcionamiento. Una vez que veo el ícono verde, abro un navegador y voy a una URL conocida: https://msciab.duckdns.org/vnc.html . Tenga en cuenta que esta es mi URL; cuando crea un kit, creará su URL única.

Dado que AWS asigna una nueva IP a cada máquina cuando inicia, configuré un servicio de DNS dinámico, por lo que siempre puede usar la misma URL para acceder a su servidor, incluso si lo detiene y lo reinicia. Incluso puede marcarlo como favorito en su navegador. Además, uso HTTPS, con claves válidas para obtener una protección total de mi trabajo contra los rastreadores, en caso de que necesite administrar contraseñas y otros datos confidenciales.

Pantalla 2

Una vez cargado, el sistema le dará la bienvenida con un cliente web Web VNC, NoVNC. Simplemente inicie sesión y aparecerá un escritorio. Uso un escritorio mínimo, 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 confío en otras aplicaciones, hoy en día en su mayoría en otras pestañas del navegador.

En la máquina virtual tengo lo que necesito para desarrollar aplicaciones de big data. En primer lugar, hay un IDE. En la compilación, utilizo la edición comunitaria de IntelliJ Idea. Además, existe la herramienta de compilación SBT y un Scala REPL, Ammonite.

Pantalla 3

Sin embargo, las características clave de este entorno son los servicios implementados como contenedores en la misma máquina virtual. En particular, tengo:

  • Zeppelin, el cuaderno web para usar código Scala sobre la marcha y realizar análisis de datos ( http://zeppelin:8080 )
  • Spark Job Server, para ejecutar e implementar trabajos Spark con una interfaz Rest ( http://sparkjobserver:8080 ).
  • Una instancia de Hadoop para almacenar y recuperar datos de HDFS ( http://hadoop:50070 ).

Tenga en cuenta que estas direcciones URL son fijas, pero se puede acceder a ellas en el entorno virtual. Puede ver sus interfaces web en la siguiente captura de pantalla.

Pantalla 4

Cada servicio se ejecuta en un contenedor Docker independiente. Sin volverse demasiado técnico, puede pensar en esto como tres servidores separados dentro de su máquina virtual. La belleza de usar Docker es que puede agregar servicios e incluso agregar dos o tres máquinas virtuales. Con los contenedores de Amazon, puede escalar su entorno fácilmente.

Por último, pero no menos importante, tienes un terminal web disponible. Simplemente acceda a su URL con HTTPS y será recibido con un terminal en una página web.

Pantalla 5

En la captura de pantalla anterior, puede ver que enumero los contenedores, que son los tres servidores más el escritorio. Este shell de línea de comando le brinda acceso a la máquina virtual que contiene los contenedores, lo que le permite administrarlos. Es como si sus servidores estuvieran "en Matrix" (virtualizados dentro de contenedores), pero este shell le brinda un escape fuera de "Matrix" para administrar servidores y escritorio. Desde aquí, puede reiniciar los contenedores, acceder a sus sistemas de archivos y realizar otras manipulaciones permitidas por Docker. No hablaré en detalle de Docker aquí, pero hay una gran cantidad de documentación en el sitio web de Docker.

Cómo configurar su instancia

¿Te gusta esto hasta ahora, y quieres tu instancia? Es fácil y barato. Puede obtenerlo simplemente por el costo de la máquina virtual en Amazon Web Services, más el almacenamiento. El kit en la configuración actual requiere 4 GB de RAM para ejecutar todos los servicios. Si tiene cuidado de usar la máquina virtual solo cuando la necesita y trabaja, digamos, 160 horas al mes, una máquina virtual a las tarifas actuales costará 160 x $ 0.052, u $ 8 por mes. Hay que sumar el costo del almacenamiento. Uso alrededor de 30 GB, pero todo en conjunto se puede mantener por menos de $ 10.

Sin embargo, esto no incluye el costo de una cuenta de Dropbox (Pro) (eventual), en caso de que desee hacer una copia de seguridad de más de 2 GB de código. Esto cuesta otros $ 15 por mes, pero proporciona una seguridad importante para sus datos. Además, necesitará un repositorio privado, ya sea un GitHub pago u otro servicio, como Bitbucket, que ofrece repositorios privados gratuitos.

Quiero recalcar que si lo usas solo cuando lo necesitas, es más económico que un servidor dedicado. Sí, todo lo mencionado aquí se puede configurar en un servidor físico, pero como trabajo con big data necesito muchos otros servicios de AWS, por lo que creo que es lógico tener todo en el mismo lugar.

Veamos cómo hacer toda la configuración.

requisitos previos

Antes de comenzar a construir una máquina virtual, debe registrarse en los siguientes cuatro servicios:

  • Servicios web de Amazon.
  • DNS de pato.
  • buzón.
  • Vamos a cifrar.

El único para el que necesita su tarjeta de crédito es Amazon Web Services. DuckDns es totalmente gratuito, mientras que DropBox te ofrece 2 GB de almacenamiento gratuito, que puede ser suficiente para muchas tareas. Let's Encrypt también es gratuito y se usa internamente cuando crea la imagen para firmar su certificado. Además de estos, también recomiendo un servicio de alojamiento de repositorio, como GitHub o Bitbucket, si desea almacenar su código; sin embargo, no es necesario para la configuración.

Para comenzar, vaya al repositorio de GitHub BigDataDevKit.

Pantalla 6

Desplácese por la página y copie el script que se muestra en la imagen en el editor de texto de su elección:

Pantalla 7

Este script es necesario para arrancar la imagen. Tienes que cambiarlo y proporcionar algunos valores a los parámetros. Con cuidado, cambie el texto entre las comillas. Tenga en cuenta que no puede usar caracteres como la comilla en sí, la barra invertida o el signo de dólar en la contraseña, a menos que los cite. Este problema es relevante solo para la contraseña. Si quiere ir a lo seguro, evite las comillas, el signo de dólar o las barras invertidas.

El parámetro PASSWORD es una contraseña que elige para acceder a la máquina virtual a través de una interfaz web. El parámetro EMAIL es su correo electrónico y se utilizará cuando registre un certificado SSL. Se le pedirá que proporcione su correo electrónico, y es el único requisito para obtener un certificado SSL gratuito de Let's Encrypt.

Para obtener los valores de TOKEN y HOST , vaya al sitio de DuckDNS e inicie sesión. Deberá elegir un nombre de host no utilizado.

Pantalla 8

Mire la imagen para ver dónde debe copiar el token y dónde debe agregar su nombre de host. Debe hacer clic en el botón "agregar dominio" para reservar el nombre de host.

Configurando tu instancia

Suponiendo que tiene todos los parámetros y ha editado el script, está listo para iniciar su instancia. Inicie sesión en la interfaz de administración de Amazon Web Services, vaya al panel de Instancias EC2 y haga clic en "Iniciar instancia".

Pantalla 9

En la primera pantalla, elegirás una imagen. El script se basa en Amazon Linux y no hay otras opciones disponibles. Seleccione Amazon Linux, la primera opción en la lista de inicio rápido.

Pantalla 10

En la segunda pantalla, elija el tipo de instancia. Dado el tamaño del software que se ejecuta, existen varios servicios y necesita al menos 4 GB de memoria, por lo que le recomiendo que seleccione la instancia t2.medium . Puede recortarlo, usando el t2.small si cierra algunos servicios, o incluso el micro si solo quiere el escritorio.

Pantalla 11

En la tercera pantalla, haga clic en "Detalles avanzados" y pegue el script que configuró en el paso anterior. También te recomiendo que habilites la protección contra terminación, para que con una terminación accidental no pierdas todo tu trabajo.

Pantalla 12

El siguiente paso es configurar el almacenamiento. El valor predeterminado para una instancia es de 8 GB, que no es suficiente para contener todas las imágenes que crearemos. Recomiendo aumentarlo a 20 GB. Además, aunque no es necesario, sugiero otro dispositivo de bloque de al menos 10 GB. La secuencia de comandos montará el segundo dispositivo de bloque como una carpeta de datos. Puede hacer una instantánea de su contenido, finalizar la instancia y luego volver a crearla utilizando la instantánea y recuperar todo el trabajo. Además, un dispositivo de bloqueo personalizado no se pierde cuando finaliza la instancia, por lo que tiene doble protección contra la pérdida accidental de sus datos. Para aumentar aún más su seguridad, puede hacer una copia de seguridad de sus datos automáticamente con Dropbox.

Pantalla 13

El quinto paso es nombrar la instancia. Elige el tuyo. El sexto paso ofrece una forma de configurar el firewall. De manera predeterminada, solo está disponible SSH, pero también necesitamos HTTPS, así que no olvide agregar también una regla que abra HTTPS. Podría abrir HTTPS al mundo, pero es mejor si es solo a su IP para evitar que otros accedan a su escritorio y shell, aunque todavía esté protegido con una contraseña.

Una vez que haya terminado con esta última configuración, puede lanzar la instancia. Notará que la inicialización puede demorar algunos minutos la primera vez desde que se ejecuta el script de inicialización y también realizará algunas tareas largas, como generar un certificado HTTPS con Let's Encrypt.

Pantalla 14

Cuando finalmente vea que la consola de administración se está "ejecutando" con una confirmación y ya no se está "inicializando", estará listo para comenzar.

Suponiendo que todos los parámetros sean correctos, puede navegar a https://YOURHOST.duckdns.org .

Reemplace YOURHOST con el nombre de host que eligió, pero no olvide que es un sitio HTTPS, no HTTP, por lo que su conexión con el servidor está encriptada, por lo que debe 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 de inicialización generará un certificado autofirmado. Aún podrá conectarse con una conexión encriptada, pero el navegador le advertirá que es un sitio desconocido y que las conexiones no son seguras. No debería pasar, pero nunca se sabe.

Pantalla 15

Suponiendo que todo esté funcionando, accede a la terminal web, Butterfly. Puede iniciar sesión con la app de usuario y la contraseña que puso en el script de configuración.

Una vez que haya iniciado sesión, tiene una máquina virtual con arranque, que también incluye Docker y otras ventajas, como Nginx Frontend, Git y Butterfly Web Terminal. Ahora, puede completar la configuración creando las imágenes de Docker para su entorno de desarrollo.

A continuación, escriba los siguientes comandos:

 git clone https://github.com/sciabarra/BigDataDevKit cd BigDataDevKit sh build.sh

El último comando también le pedirá que escriba una contraseña para acceder al Escritorio. Una vez hecho esto, comenzará a construir las imágenes. Tenga en cuenta que la compilación tardará unos 10 minutos, pero puede ver lo que sucede porque todo se muestra en la pantalla.

Una vez que se completa la compilación, también puede instalar Dropbox con el siguiente comando:

 /app/.dropbox-dist/dropboxd

El sistema mostrará un enlace en el que debe hacer clic para habilitar Dropbox. Debes iniciar sesión en Dropbox y listo. Lo que pongas en la carpeta de Dropbox se sincroniza automáticamente entre todas tus instancias de Dropbox.

Una vez hecho esto, puede reiniciar la máquina virtual y acceder a su entorno en la URL https://YOURHOST.dyndns.org/vnc.html .

Puede detener su máquina y reiniciarla cuando reanude el trabajo. La URL de acceso permanece igual. De esta forma, pagarás solo por el tiempo que lo estés usando, más el extra mensual por el almacenamiento usado.

Preservar sus datos

La siguiente discusión requiere cierto conocimiento de cómo funcionan Docker y Amazon. Si no desea comprender los detalles, tenga en cuenta la siguiente regla simple: en la máquina virtual, hay una carpeta /app/Dropbox disponible, lo que coloque en /app/Dropbox se conserva, y todo lo demás es desechable y puede irse Para mejorar aún más la seguridad, también almacene su preciado código en un sistema de control de versiones.

Ahora, si quieres entender esto, sigue leyendo. Si siguió mis instrucciones en la creación de la máquina virtual, la máquina virtual está protegida contra la terminación, por lo que no puede destruirla accidentalmente. Si decide cancelarlo expresamente, se destruirá el volumen principal. Se perderán todas las imágenes de Docker, incluidos todos los cambios realizados.

Sin embargo, dado que la carpeta /app/Dropbox está montada como un volumen de Docker para contenedores, no forma parte de las imágenes de Docker. En la máquina virtual, la carpeta /app se monta en el Volumen de Amazon que creó, que tampoco se destruye incluso cuando finaliza expresamente la máquina virtual. Para quitar el volumen, tienes que quitarlo expresamente.

No confunda los volúmenes de Docker, que son una entidad lógica de Docker, con los volúmenes de Amazon, que es una entidad algo física. Lo que sucede es que el volumen /app/Dropbox Docker se coloca dentro del volumen /app Amazon.

El Volumen de Amazon no se destruye automáticamente cuando finaliza la máquina virtual, por lo que todo lo que se coloque en él se conservará hasta que también destruya expresamente el volumen. Además, todo lo que coloque en el volumen de Docker se almacena fuera del contenedor, por lo que no se destruye cuando se destruye el contenedor. Si habilitó Dropbox, como se recomienda, todo su contenido se copia en los servidores de Dropbox y en su disco duro si sincroniza Dropbox con su(s) computadora(s). Además, se recomienda que el código fuente se almacene en un sistema de control de versiones.

Entonces, si coloca sus cosas en el sistema de control de versiones en la carpeta de Dropbox, para perder sus datos debe suceder todo lo siguiente:

  • Termina expresamente su máquina virtual.
  • Usted elimina expresamente el volumen de datos de la máquina virtual.
  • Eliminas expresamente los datos de Dropbox, incluido el historial.
  • Eliminas expresamente los datos del sistema de control de versiones.

Espero que sus datos estén lo suficientemente seguros.

Mantengo una máquina virtual para cada proyecto, y cuando termino, mantengo apagadas las máquinas virtuales no utilizadas. Por supuesto, tengo todo mi código en GitHub y una copia de seguridad en Dropbox. Además, cuando dejo de trabajar en un proyecto, tomo una instantánea del bloque de Amazon Web Services antes de eliminar la máquina virtual por completo. De esta manera, cada vez que se reanuda un proyecto, por ejemplo, para mantenimiento, todo lo que debo hacer es iniciar una nueva máquina virtual usando la instantánea. Todos mis datos vuelven a estar en su lugar y puedo seguir trabajando.

Optimización del acceso

Primero, si tiene acceso directo a Internet, no mediado por un proxy, puede usar clientes SSH y VNC nativos. El acceso SSH directo es importante si necesita copiar archivos dentro y fuera de la máquina virtual. Sin embargo, para compartir archivos, debe considerar Dropbox como una alternativa más simple.

El acceso web de VNC es invaluable, pero a veces puede ser más lento que un cliente nativo. Tiene acceso al servidor VNC en la máquina virtual mediante el puerto 5900. Debe abrirlo expresamente porque está cerrado por defecto. Le recomiendo que solo lo abra en su dirección IP, porque Internet está lleno de "robots" que escanean Internet en busca de servicios a los que conectarse, y VNC es un objetivo frecuente de esos robots.

Conclusión

Este artículo explica cómo puede aprovechar la tecnología de nube moderna para implementar un entorno de desarrollo efectivo. Si bien una máquina en la nube no puede ser un reemplazo completo para su computadora de trabajo o una computadora portátil, es lo suficientemente buena para realizar trabajos de desarrollo cuando es importante tener acceso al IDE. En mi experiencia, con las conexiones a Internet actuales, es lo suficientemente rápido para trabajar.

Al estar en la nube, el acceso y la manipulación del servidor es más rápido que tenerlos localmente. Puede aumentar (o disminuir) la memoria rápidamente, iniciar otro entorno, crear una imagen, etc. Tiene un centro de datos al alcance de su mano y, cuando trabaja con proyectos de big data, necesita servicios sólidos y mucho espacio. Eso es lo que proporciona la nube.