O blog da AWS

Alavancando o AWS CloudFormation para criar uma infraestrutura imutável no Nubank

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

 

Nubank, empresa Brasileira, é um dos maiores bancos digitais independentes do mundo, está transformando de forma inovadora o cenário financeiro da América Latina, fornecendo serviços transparentes, simples e eficientes. A empresa combate a complexidade para capacitar as pessoas, devolver-lhes o controle de suas finanças e redefinir seus relacionamentos com o dinheiro.

O Nubank nasceu na nuvem e a AWS os apoia em sua jornada desde o primeiro dia.

A equipe de engenharia do Nubank adotou idéias de programação funcional e imutabilidade desde o início. Eles aplicam conceitos de imutabilidade à seus microsserviços desenvolvidos usando o Clojure e seu gerenciamento e persistência de dados usando o Datomic, e gerenciam sua infraestrutura com a ajuda do AWS CloudFormation.

 

Visão Geral

Antes que a computação em nuvem se tornasse uma realidade amplamente disponível, construir uma infraestrutura de servidor tratava-se de lidar com servidores físicos caros. A substituição desses servidores físicos era tão cara e demorada que a abordagem mais prática era aplicar as alterações necessárias nos servidores em execução na produção. Essa é a natureza de uma infraestrutura mutável, e todas essas modificações no local acabam levando a problemas críticos como inconsistência, falta de confiabilidade e complexidade crescente.

Um dos maiores desafios na construção de infraestrutura hoje é a previsibilidade. No entanto, graças à virtualização e à computação em nuvem, agora é possível ter novos fluxos de trabalho de implantação que podem ajudar as empresas a enfrentar esse desafio. Um desses novos fluxos de trabalho é baseado na idéia principal de infraestrutura imutável, na qual nenhuma modificação em um servidor em execução é permitida, a menos que o servidor seja completamente substituído por uma nova instância que contenha todas as alterações necessárias.

 

Passo a passo

O AWS CloudFormation fornece um idioma comum para você descrever e provisionar todos os recursos de infraestrutura em seu ambiente em nuvem. Ele permite que você use um arquivo de texto simples para modelar e fornecer, de maneira automatizada e segura, todos os recursos necessários para seus aplicativos em todas as regiões e contas.

 

Infraestrutura como código

Antes de detalharmos a abordagem do Nubank à infraestrutura imutável, é essencial descrever um aspecto fundamental de como o Nubank lida com a infraestrutura: tudo tem uma representação de código na forma de arquivos de definição.

A seguir, é apresentado um exemplo simplificado de uma definição. Esta definição contém a representação de código para um transactor Datomic que executa em um grupo do 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}

 

Infraestrutura imutável em Nubank

Essas definições são a fonte da verdade do Nubank e sua infraestrutura sempre deve refletir essa fonte da verdade.

O diagrama a seguir mostra o padrão blue-green seguido pelo Nubank:

O AWS CloudFormation ajuda o Nubank ao longo de todo esse processo e está no centro de sua infraestrutura imutável e processo de deployment blue-green.

Esse serviço fornece recursos de uma maneira segura e replicável, permitindo que você construa e reconstrua sua infraestrutura e aplicativos sem precisar executar ações manuais ou gravar scripts personalizados. O AWS CloudFormation se encarrega de determinar as operações corretas a serem executadas ao gerenciar sua stack e reverte as alterações automaticamente se forem detectados erros.

Para aproveitar ao máximo a energia fornecida pelo AWS CloudFormation, o Nubank usa o Nimbus, uma ferramenta personalizada criada pelo Nubank. O Nimbus, escrito em Clojure, é responsável por abstrair e automatizar as interações do Nubank com a AWS e converte os arquivos de definição do Nubank em stacks do AWS CloudFormation.

O diagrama a seguir mostra como o Nimbus interage com o AWS CloudFormation para criar recursos de infraestrutura:

Depois que o Nubank carrega um modelo no AWS CloudFormation, a ferramenta (AWS CloudFormation) cuida da criação de seus recursos, respeitando suas interdependências e aplicando uma operação de tudo ou nada: todos os recursos são criados com êxito ou nenhum deles é criado.

Antes de excluir as pilhas do AWS CloudFormation (excluindo assim os recursos associados da nuvem), a equipe de engenharia do Nubank monitora de perto a integridade geral dos novos recursos, à medida que aumentam gradualmente sua carga. Para monitorar seus sistemas, o Nubank monitora as atividades em dashboards no Grafana e com alertas da OpsGenie: todos criados com base nas métricas do Prometheus.

Esses alertas também fazem parte da infraestrutura do Nubank como código e, portanto, também são representados usando arquivos de definição do Nubank. O exemplo a seguir é a definição de um alerta que visa capturar picos repentinos na latência do consumidor Kafka:

{: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 }}"}}

 

Conclusão

O Nubank usa extensivamente o AWS Cloudformation e, atualmente, eles têm mais de 3000 stacks que são usadas para gerenciar milhares de recursos da nuvem em várias regiões da AWS. O Nubank cria pilhas do AWS CloudFormation para lidar com cenários simples, como o provisionamento de máquinas únicas do Amazon EC2, mas também cria pilhas para lidar com a infraestrutura complexa e interdependente usada para dar suporte aos clusters Kafka e Kubernetes.

O diagrama a seguir mostra o modelo do AWS CloudFormation para um dos clusters Kubernetes do Nubank:

A equipe de engenharia do Nubank está trabalhando para tornar o Nimbus parte de um processo totalmente automatizado, eliminando assim a necessidade de interação humana por meio de uma interface de linha de comando (CLI). Esse nível de automação permite que novos recursos da nuvem sejam provisionados assim que um arquivo de definição do Nubank for modificado e exportado para o Amazon S3. No entanto, ele também pode realizar o rollback automaticamente se um comportamento estranho e potencialmente perigoso for detectado após a implantação.

Ao alavancar o AWS Cloudformation, o Nubank pode criar unidades de implantação de recursos complexos de infraestrutura, mantendo a complexidade geral do gerenciamento sob controle.

 


Sobre os Autores

Bruno Halley Schaefer é engenheiro de software no Nubank. Como membro da equipe da plataforma, ele ajuda a projetar ferramentas de automação para dar suporte ao Nubank em um cenário de hiper-crescimento.

 

 

 

Hugo Carvalho, Arquiteto de Soluções Sênior da AWS, é especializado em ajudar startups em diferentes níveis de maturidade a criar plataformas sustentáveis e altamente escaláveis na nuvem. Com mais de sete anos de experiência em gerenciamento de equipes de tecnologia e tecnologia, Hugo ajudou muitas empresas a definir, implementar e evoluir soluções tecnológicas para diferentes segmentos de mercado.

 

 

 

Marcelo Nunes é Technical Account Manager da AWS, dando suporte ao Nubank desde 2017. Com mais de 20 anos de experiência em tecnologia e como membro da equipe de suporte corporativo da AWS desde 2015, ele ajudou muitas empresas em sua jornada na AWS.