Blog de Amazon Web Services (AWS)

Aprovechando AWS CloudFormation para crear una infraestructura inmutable en Nubank

Bruno Halley Schaefer, software engineer, Nubank
Hugo Carvalho, senior solutions architect, AWS
Marcelo Nunes, senior technical account manager, AWS Enterprise Support Team

Nubank, una empresa brasileña y uno de los bancos digitales independientes más grandes del mundo, está transformando de manera innovadora el panorama financiero de América Latina al proporcionar servicios transparentes, simples y eficientes. La compañía lucha contra la complejidad para empoderar a las personas, devolverles el control de sus finanzas y redefinir sus relaciones con el dinero.

Nubank nació en la nube y AWS les ha apoyado en su camino desde el primer día.

El equipo de ingeniería de Nubank adoptó desde el principio ideas de programación funcional e inmutabilidad. Aplican los conceptos de inmutabilidad a sus microservicios desarrollados con Clojure y su gestión de datos y persistencia con Datomic, finalmente manejan su infraestructura con la ayuda de AWS CloudFormation.

 

Visión general

Antes de que la computación en nube se convirtiera en una realidad ampliamente disponible, la construcción de una infraestructura de servidores consistía con la administracion de servidores físicos costosos. La sustitución de esos servidores físicos era tan costosa y consumía tanto tiempo que era más práctico aplicar cualquier cambio necesario a los servidores de producción. Esta es la naturaleza de una infraestructura mutable, y todas esas modificaciones en el lugar eventualmente llevan a problemas críticos como la inconsistencia, la falta de fiabilidad y el aumento de la complejidad.

Uno de los mayores desafíos en la construcción de infraestructuras hoy en día es la previsibilidad. Sin embargo, gracias a la virtualización y al cloud computing, ahora es posible disponer de nuevos flujos de trabajo de implementación que pueden ayudar a las empresas a afrontar este reto. Uno de esos nuevos flujos de trabajo se basa en la idea central de una infraestructura inmutable, en la que no se permite ninguna modificación en un servidor, a menos que éste sea reemplazado completamente por una nueva instancia que contenga todos los cambios necesarios.

 

Walkthrough

AWS CloudFormation proporciona un lenguaje común para que usted describa y aprovisione todos los recursos de infraestructura en su entorno de nube. Le permite utilizar un simple archivo de texto para modelar y aprovisionar, de forma automatizada y segura, todos los recursos necesarios para sus aplicaciones en todas las regiones y cuentas.

 

Infraestructura como código

Antes de detallar el enfoque de Nubank sobre la infraestructura inmutable, es esencial describir un aspecto fundamental de cómo Nubank maneja la infraestructura: Todo tiene una representación de código en forma de archivos de definición.

A continuación, se muestra un ejemplo simplificado de una definición. Esta definición contiene la representación de código para un transactor de Datomic que se ejecuta en Amazon EC2 Auto Scaling group.

:name :ronaldo-datomic
:squad :platform
:environments {:staging #{:s0 :s1 :s2}}
:workload {:type :generic-legacy, :multiplier 1}
:storage {:type :dynamodb
:resource-name "ronaldo-datomic"}
:memory {:jvm-xmx "2500M"
:jvm-xms "2500M"
:object-cache-max "1g"
:memory-index-max "512m"}
:write-concurrency 5}

Estas definiciones son la fuente de la verdad de Nubank, y su infraestructura siempre debe reflejar esta fuente de verdad.

 

Infraestructura inmutable en Nubank

Para conseguir una infraestructura inmutable, Nubank crea y destruye constantemente recursos de la nube. Siguiendo siempre una implementación azul-verde, primero crean nuevos recursos que contienen todas las modificaciones que desean desplegar y luego eliminan los antiguos recursos después de verificar que todo funciona de acuerdo a lo planeado.

El siguiente diagrama muestra una estándar implementación azul-verde seguido por Nubank:

AWS CloudFormation ayuda a Nubank a lo largo de todo este proceso y es el núcleo de su infraestructura inmutable y de el proceso azul-verde.

Este servicio provisiona recursos de forma segura y repetible, permitiéndo construir y reconstruir infraestructura y aplicaciones sin tener que realizar acciones manuales o escribir scripts personalizados. AWS CloudFormation se encarga de determinar las operaciones correctas al provisionar el entorno con un CloudFormation stack y retrocede los cambios automáticamente si se detectan errores.

Para aprovechar al máximo la potencia de AWS CloudFormation, Nubank utiliza Nimbus, una de las herramientas de construcción personalizada de Nubank. Nimbus, escrita en Clojure, se encarga de abstraer y automatizar las interacciones de Nubank con AWS y traduce los archivos de definición de Nubank a AWS CloudFormation stacks.

El siguiente diagrama muestra cómo Nimbus interactúa con AWS CloudFormation para crear recursos de infraestructura:

Después de que Nubank sube un modelo a AWS CloudFormation, la herramienta (AWS CloudFormation) se encarga de crear sus recursos respetando sus interdependencias y haciendo cumplir una operación de todo o nada: Todos los recursos se crean con éxito, o no se crea ninguno de ellos en absoluto.

Antes de eliminar AWS CloudFormation stack (excluyendo así los recursos de nube asociados), el equipo de ingeniería de Nubank monitoriza de cerca la salud general de los nuevos recursos a medida que aumentan gradualmente su carga. Para monitorizar sus sistemas, Nubank se basa en gran medida en los cuadros de mando de Grafana y alertas de OpsGenie: Todos construidos sobre la métrica de Prometheus.

Estas alertas también forman parte de la infraestructura de Nubank como código y por lo tanto también se representan usando los archivos de definición de Nubank. El siguiente ejemplo es la definición de una alerta que tiene como objetivo capturar picos repentinos de Kafka en el consumidor de latencia:

{:name :kafka-average-consume-latency-time-ms-too-high
:squad :runtime
:environments {:prod    #nu/prototypes-for [:prod :sharded+global+monitoring]
:staging #nu/prototypes-for [:staging :sharded+global+monitoring]
:test    #nu/prototypes-for [:test :nu+mobile]}
:expr ["avg(kafka_network_total_time_ms_fetch_consumer_95thpercentile) by (environment, prototype, stack_id) > " :threshold]
:threshold 600
:default-filter-labels [:squad]
:for-minutes 10
:alertmanager-labels {:severity "warning"}
:annotations {:stack       "{{ $labels.environment }}-{{ $labels.prototype }}-{{ $labels.stack_id }}"
:instance  "average for all instances"
:value       "{{ $value }}"}}

 

Conclusión

Nubank utiliza ampliamente AWS CloudFormation y actualmente tienen más de 3000+ stacks, que se utilizan para gestionar miles de recursos de nubes en múltiples regiones de AWS. Nubank construye AWS CloudFormation stacks para manejar escenarios simples como el aprovisionamiento de máquinas individuales de Amazon EC2, pero también construyen AWS CloudFormation stacks para manejar infraestructura compleja e interdependiente, utilizada para soportar los clusters de Kafka y Kubernetes.

El siguiente diagrama muestra un modelo de AWS CloudFormation para uno de los clusters de Kubernetes de Nubank:

El equipo de ingeniería de Nubank está trabajando para que Nimbus forme parte de un proceso totalmente automatizado, eliminando así la necesidad de interacción humana a través de una interfaz de línea de comandos (CLI). Este nivel de automatización permite aprovisionar nuevos recursos de la nube tan pronto como se modifica un archivo de definición de Nubank y se exporta a Amazon S3. Sin embargo, también se retrocederá automáticamente si se detecta un comportamiento extraño y potencialmente peligroso después del despliegue.

Aprovechando AWS Cloudformation, Nubank puede crear unidades de despliegue de recursos de infraestructura compleja, mientras mantiene bajo control la complejidad de la gestión global.


Sobre los Autores

Bruno Halley Schaefer es ingeniero de software en Nubank. Como miembro del equipo de la plataforma, ayuda a diseñar herramientas de automatización para apoyar a Nubank en un escenario de hipercrecimiento.

 

 

 

Hugo Carvalho es un arquitecto de soluciones senior de AWS que se especializa en ayudar a startups de diferentes niveles de madurez a construir plataformas sostenibles y altamente escalables en la nube. Con más de siete años de experiencia en tecnología y gestión de equipos tecnológicos, Hugo ha ayudado a muchas empresas a definir, implementar y desarrollar soluciones tecnológicas para diferentes segmentos de mercado.

 

 

 

Marcelo Nunes es un gerente técnico de cuentas en AWS, que apoya a Nubank desde 2017. Con más de 20 años de experiencia en tecnología y como miembro del equipo de soporte de AWS Enterprise desde 2015, ha ayudado a muchas empresas en su camino hacia AWS.