¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
dev
Eloisa Ibáñez 27/06/2016 Cargando comentarios…
Después del resumen del AWS Summit Madrid 2016 y de avanzar lo que se contó en las charlas Innovación en el mundo Enterprise y Agilidad en Cloud, en el post de hoy hablaremos de Go! Build!, otra de las sesiones paralelas donde se profundizó en cómo se ve en Amazon el perfil de desarrollo y DevOps, cómo se crea una aplicación a gran escala y cómo se puede desarrollar una aplicación móvil con AWS.
Aunque existe una gran controversia sobre el concepto Devops, en la conferencia quedó bastante claro lo que significa este término para Amazon: “un conjunto de metodologías que permite a los equipos trabajar de forma más cercana entre ellos, aportando mayor agilidad al proyecto y notables incrementos de productividad, que pretenden dar agilidad y responder a las necesidades del flujo de desarrollo, optimizando los procesos de desarrollo, tests, despliegue, resolución de bugs, paso a producción, monitorización…”.
Generalmente estas metodologías se implantan gracias a una cultura Devops, donde una persona (en ocasiones varias) dentro del grupo de trabajo se encarga de implementar dichas mejoras en forma de automatizaciones, nuevas herramientas de despliegue, de control de versiones, monitorización, etc.
Para entender la importancia que tuvieron para Amazon estas prácticas, hay que entender otro punto fundamental de su éxito: la refactorización de la arquitectura de su sitio web.
En 2001 el market de Amazon se basaba en una arquitectura monolítica. A medida que la empresa creció, esta arquitectura sobre la que todos sus desarrolladores tenían que realizar modificaciones se volvió inmanejable. El equipo de trabajo rondaba las cien personas y la organización a la hora de mergear los cambios de todas ellas era una locura.
De esta forma, lo que en principio definieron como el merge friday pasó a convertirse en el merge week o en las merge wars. Esto contrajo la imposibilidad de avanzar en los desarrollos, la paralización de los despliegues, los cuellos de botella, los conflictos de código…
La solución a esta problemática era clara: plantear una arquitectura basada en microservicios. De esta forma, se dividió el código de la web en muchas primitivas independientes comunicadas vía API. El equipo de cien personas se dividió en muchos equipos de aproximadamente ocho personas, cada uno de ellos responsable de un microservicio.
Uno de los problemas que tenía Amazon es que había gran cantidad de equipos de desarrollo, pero sólo un equipo de despliegue. Aquí es donde entra en acción la cultura Devops. Para poder gestionar tal cantidad de microservicios era necesaria una herramienta “self service” para automatizar el proceso de despliegue cada vez que uno de los equipos incluyera cambios. Tenía que ser agnóstica de plataforma, con gestión de versiones, que incluyera un testeo previo (tests unitarios) y posterior (tests funcionales) al despliegue y, a ser posible, que pudiera gestionar automáticamente el rollback de la aplicación en caso de error. Así fue como surgió hace 13 años la herramienta Apollo, cuyo hijo (AWS CodeDeploy) dota de una gran salud y está disponible para los usuarios de AWS.
Tras automatizar el proceso de despliegue, cada uno de los microservicios dispuso de su propio pipeline de despliegue. De esta forma, el principio divide y vencerás tuvo más sentido que nunca.
Las cifras eran claras: de gestionar un equipo enorme, con versiones del producto lentas y poco fiables, pasaron a disponer y desplegar múltiples entornos productivos con releases mucho más frecuentes, testeadas y, por lo tanto, más fiables, llegando a alcanzar los 50 millones de despliegues en producción al año (aproximadamente un despliegue cada segundo y medio), aunque hay que tener en cuenta que son despliegues de funcionalidades muy pequeñas.
Creo que, tras esta conferencia, quedó claro que la agilidad y los microservicios han sido unos aliados fundamentales para Amazon. En mi opinión, tanto el principio de divide y vencerás como la agilidad, aplicados a los proyectos actuales, son fundamentales para que una empresa sobreviva. Sin ellos el time to market se eterniza y en una economía global eso es inadmisible.
La segunda de las conferencias trató sobre el crecimiento natural de una aplicación, desde sus comienzos, pasando por el nivel de prueba de concepto o piloto, hasta que consigue servir a millones de usuarios. Estas charlas resumieron la propuesta de AWS para gestionar este crecimiento, no sólo con la herramienta de auto escalado de AWS, sino también planteando una arquitectura que en efecto sea compatible con dicho escalado.
Una de las funcionalidades más importantes de AWS es la de auto escalado, tanto si se requieren más recursos, como si lo que se quiere es reducir el uso de los mismos. Este servicio permite al administrador de sistemas elegir un threshold por encima (o por debajo) del cual escalar un grupo de instancias. Esta funcionalidad es muy útil, pero también puede resultar peligrosa si, por ejemplo, no se controla el número de instancias máximas del grupo de escalado.
Antes de escalar una aplicación hay que tener en cuenta el número de usuarios y si la arquitectura de la misma está preparada (o necesita) dicho escalado. Es decir, en ocasiones, una simple modificación de la arquitectura del servicio puede librarnos de configurar la funcionalidad de auto escalado.
Normalmente, para un uso no intensivo de una aplicación (prueba de concepto, piloto…), se suele partir de una arquitectura básica como la de la imagen, basada en Amazon Route 53 para la resolución de DNS, una IP elástica y una única instancia de EC2 con el código y servicios que necesite la aplicación instalados en la misma instancia.
Antes de migrar esta arquitectura, se puede valorar el cambio de tamaño de la instancia. Amazon Web Services tiene en este punto una gran variedad de opciones para nuestras instancias, optimizadas para un uso más intensivo de CPU, almacenamiento, memoria…
Esta evolución de un tipo de instancia a otra sería el primer paso, pues todavía es de suponer que no hay necesidad de un mayor uso de recursos. Una máxima en Amazon es “consume lo que necesites”, ni más ni menos (pues pagarás por lo que consumas).
El siguiente paso suele ser extraer la base de datos de la instancia de la aplicación a una instancia separada. Para este paso podemos elegir si queremos montar nosotros mismos la base de datos dentro de la instancia (self managed) o bien elegir una de las múltiples opciones que ofrece Amazon a tal efecto:
También puede ser útil en este momento el servicio de Amazon Database Migration, que ayuda al usuario a migrar la base de datos sin pérdida de servicio de la misma a Amazon Web Services. También permite migrar de un tipo de base de datos a otra, (Oracle a MySQL p.e.) o incluso migrarla a Amazon Redshift desde Aurora, PostgreSQL, MySQL, MariaDB, Oracle o SQL Server.
Antes de seguir creciendo, hay que replantear la arquitectura de forma que sea tolerante a fallos. Generalmente todos los servicios suelen tener momentos de indisponibilidad, pero una arquitectura en alta disponibilidad con varias instancias en varias zonas de disponibilidad diferentes suele reducir estos periodos hasta prácticamente desaparecer. Además, al plantear una arquitectura redundante, la carga se suele balancear desde un balanceador externo al servidor de la aplicación, paso que facilita la posterior configuración del auto escalado.
En caso de que aún así la base de datos siga siendo el cuello de botella, habría que plantearse escalar horizontalmente la base de datos, creando un cluster de base de datos con un master, varios esclavos e incluso varias réplicas de sólo lectura en caso de que nuestro servicio necesite muchas lecturas a base de datos.
Si los tiempos obtenidos siguieran siendo bajos, se puede plantear ofrecer el contenido del portal a través de la CDN de AWS (Cloudfront), usar los servicios de Elasticache para reducir los accesos a la base de datos o bien guardar los datos de sesión en una base de datos externa NoSQL.
Llegados a este punto, la arquitectura de nuestro servicio estará lo bastante madura y la demanda habrá ido creciendo con la arquitectura de forma que tenga sentido recurrir a la funcionalidad de auto escalado de AWS. Es importante recordar que esta funcionalidad puede añadir o borrar máquinas del tipo que le hayamos indicado y por lo tanto toda la información de sesiones, datos de usuario, etc… debería guardarse fuera del grupo de servidores que se quiere que escale automáticamente. De ahí la importancia de los pasos previamente comentados.
La funcionalidad de auto escalado permite modificar los recursos de un cluster de máquinas definiendo el tamaño del pool de máquinas (tanto el mínimo como el máximo) y las zonas de disponibilidad en las que se quieren distribuir las máquinas.
Amazon dispone de gran variedad de servicios que pueden ayudarnos a la gestión de este tipo de despliegues:
Los que asistimos a esta conferencia salimos de ella con sabios consejos sobre cuándo usar y cuándo no la funcionalidad de auto escalado, dependiendo de la demanda de nuestra aplicación y la madurez de nuestra arquitectura. Sin duda, lecciones muy útiles para nuestro día a día.
La última de las conferencias trató sobre las distintas problemáticas que el desarrollo de aplicaciones móviles conlleva, y los servicios que ofrece Amazon como respuesta a las mismas.
Algunos de estos problemas son:
En esta conferencia nos mostraron los distintos servicios con los que AWS ha respondido a todas estas necesidades. El pilar fundamental, la consola única que integra el acceso a todos estos servicios concebidos para facilitar el desarrollo de aplicaciones móviles, es AWS Mobile Hub.
Uno de los primeros retos al que se enfrenta un desarrollador de aplicaciones móviles es la integración y configuración de los distintos servicios que permiten añadir funcionalidad a la aplicación. Mobile Hub permite gestionar de forma eficiente y cómoda (en una única consola) la problemática surgida en cada etapa del desarrollo (configuración, construcción de la aplicación, test y monitorización).
Como se puede observar en la imagen anterior, desde la consola de AWS Mobile Hub hay que elegir las distintas funcionalidades con las que queremos dotar a nuestra aplicación, y a continuación elegir “build”. De esta forma, Mobile Hub descarga un paquete de código (para iOs o Android) con las librerías necesarias, de forma que el desarrollador ya tiene todo preparado para empezar a desarrollar la aplicación sobre ese esqueleto.
Muchas de las funcionalidades que permite añadir Mobile Hub son llamadas a otros servicios de Amazon (no todos concebidos específicamente para el desarrollo de aplicaciones móviles). Por ejemplo:
Estas son sólo algunas de las funcionalidades que ofrece Amazon, pero los creadores de aplicaciones móviles también se pueden beneficiar de otros servicios de Amazon como son el Auto Scaling para la gestión de picos de demanda y alta disponibilidad de la aplicación, todas sus opciones de almacenamiento o gestión de base de datos, etc.
Una vez desarrollada la aplicación, existe el tremendo problema del aseguramiento de la calidad de la aplicación. En el mercado hay actualmente miles de dispositivos móviles para cada uno de los sistemas operativos disponibles. Para colmo, los terminales no suelen ser en absoluto baratos.
A la hora de probar la aplicación, el creador de la misma debe plantearse qué dispositivos va a comprar para las pruebas. Para evitar esta elección y el consiguiente desembolso de dinero, AWS ha sacado al mercado AWS Device Farm que permite probar, de forma automatizada (mediante el uso de conocidos frameworks de testeo de aplicaciones como Appium, Calabash, etc), la aplicación en los distintos dispositivos. Permite interactuar con los dispositivos, realizar capturas de pantalla en momentos determinados del test, la realización de pruebas manuales... Para mayor comodidad del desarrollador, se pueden realizar estas pruebas desde la propia consola de Mobile Hub. Por otro lado, AWS Device Farm dispone de plugins para Jenkins, lo que facilita la integración continua en el proceso de mejora y resolución de bugs.
En definitiva, gracias a AWS Mobile Hub los desarrolladores de aplicaciones móviles pueden centrarse en el diseño y desarrollo de las funcionalidades de la aplicación, olvidándose de algunos de sus problemas principales, como son la gestión de librerías, el heavy lifting y las pruebas multidispositivo.
Personalmente no me gusta tanto la tendencia de AWS de acaparar cada vez más nichos dentro del proceso de creación de un producto. Por otro lado, los servicios que diseñan no suelen fracasar. Como compañía tienen una gran facilidad para empatizar con sus usuarios y ofrecerles productos muy útiles y adaptados a sus necesidades. Supongo que gracias a esto han llegado a ser el gigante digital que son en la actualidad. Sin duda, su historia y recorrido nos sirve para aprender y mejorar.
Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.
Estamos comprometidos.
Tecnología, personas e impacto positivo.
Cuéntanos qué te parece.