O Well-Architected Framework é um framework de Arquitetura de Software em Nuvem desenvolvido pela Amazon Web Services (AWS) para ajudar os arquitetos de nuvem a criar uma infraestrutura com os mais altos níveis de segurança, performance, resiliência e eficiência possíveis para suas aplicações.

Especialmente se você está se preparando para uma das certificações da AWS, conhecer bem as práticas do Well-Architected Framework será muito importante para você.

Independente de qualquer coisa se você quer construir aplicações em nuvem, conhecer bem esses conceitos vai agregar bastante valor para você.

Os Pilares da Arquitetura de Software em Nuvem

O Well-Architected Framework foi criado com base em 5 pilares:

  1. Excelência operacional
  2. Segurança
  3. Confiabilidade
  4. Performance
  5. Otimização de custos

Nesse artigo vou destacar alguns dos conceitos que considero mais importantes sobre Arquitetura de Software em Nuvem levando em consideração os principais conceitos do Framework da AWS.

Princípios Básicos para Arquitetura de Software em Nuvem

Use a Elasticidade a seu Favor

Pare de tentar adivinhar a capacidade necessária para executar suas aplicações!

Isso é, quantos servidores vou precisar?

Quanto de memória?

Quanto de Processamento (CPU)?

Você não quer e não precisa mais pagar por recursos que não vai usar!

Por outro lado, não quer ficar na mão numa Black Friday, ou no momento em que tiver um pico de uso em suas aplicações.

Por isso use a elasticidade a seu favor!

A grande maioria dos serviços da AWS, permitem que você aumente ou reduza a capacidade de acordo conforme a necessidade no momento.

Automatize Tudo

Pare de acessar as máquinas via SSH.

Pare de subir serviços nos servidores manualmente.

Pare de aumentar os reduzir a capacidade manualmente.

Certifique-se que tudo isso está automatizado, e que isso é efeito através de código fonte, é o famoso conceito de infraestrutura como código (Infrastructure as Code), esse conceito é tão importante se repete em diversos pontos do Well-Architected Framework.

Teste em Escala

Execute seus teste num ambiente potencialmente igual ao ambiente de produção.

Esteja preparado para falhas! Elas vão acontecer cedo ou tarde.

Certifique-se e automatize seus testes para garantir que se um recurso, componente, serviço, ou até mesmo um sistema inteiro fique fora do ar.

Nesse caso, os demais serviços devem continuar funcionando para que seus clientes e usuários sofram o menor impacto possível numa situação de falha de algum dos componentes envolvidos em sua arquitetura, ou até mesmo num caso em que um data center inteiro fique fora do ar.

Excelência Operacional na Nuvem

A Excelência operacional diz respeito a garantir que suas aplicações funcionam continuamente sem falhas, com resiliencia, a prova de erros.

Para que você consiga atingir a Excelência operacional, é importante seguir as seguintes práticas:

Automatize

Enfatizando ainda mais esse ponto que já foi citado antes.

Automatize suas operações.

Todas as operações devem ser feitas via código e nunca manualmente.

Certifique-se de que sua equipe não executa passos manualmente para atualizar ou manter sua infra-estrutura em perfeito funcionando.

Tudo ser ser automatizado com utilizando SDKs, scripts, linhas de comando (CLI).

O código de automação infraestrutura assim como o código de suas aplicações deve ser versionando num sistema de controle de versões como o Git, por exemplo, para que você faça a gestão sobre as mudanças e possa reverter para versão anterior se necessário.

A automação garante consistência, garante que as coisas vão ser feitas sempre da mesma forma.

Já quando os procedimentos são feitos manualmente, pequenas mudanças na ordem de execução ou nas condições de execução podem ocasionar problemas, reduzindo a resiliência e qualidade dos serviços abrindo brechas para falhas humanas e erros.

Documente

Certifique-se que todos tenham uma forma fácil de saber porque as coisas foram feitas da forma que foram feitas.

Para isso, mantenha alguma forma de documentação sempre atualizada, idealmente no seu repositório de código.

Faça Mudanças Incrementais

Evite grandes mudanças.

Faça pequenas mudanças que possam ser facilmente revertidas se necessário (Rollback).

Assuma que as coisas vão falhar

Esteja preparado que qualquer componente da sua arquitetura falhe sem comprometer o sistema como um todo.

A Netflix, por exemplo, possui um conjunto de ferramentas chamado Simian Army (Netflix Open Source Software – Netflix OSS) que propositadamente força componentes a falharem para verificar se arquitetura continua consistente.

Já que as coisas vão falhar cedo ou tarde, reduza ou seu blast radius, ou seja reduza o impacto da falha ao máximo possível, permitindo que apenas uma parte das funcionalidades fiquem indisponíveis se algum componente falhar, mas não a aplicação toda.

Serverless e Microservices podem ajudar nesse tipo de abordagem.

Monitoramento

Certifique-se que se tudo é observável, ou seja, de que tudo está sendo logado, e que pode ser monitorado, de preferência, em tempo real, e que e você pode gerar métricas, e agir em cima do monitoramento dessas métricas para prevenir problemas antes que eles aconteçam.

E se não for possível prevenir, certifique-se que ao menos os logs gerados permitam que seja feita uma análise aprofundada do de tudo o que aconteceu para que seja possível então fazer uma profunda análise do problema para que então se tire algumas lições aprendidas para prevenir problemas similares no futuro, e tornar os sistemas e a equipe mais madura e resiliente.

Verifique a saúde de suas aplicações consistentemente, execute health checks, e crie procedimentos automatizados para resolver problemas caso algum dos componentes não esteja respondendo da maneira que deveria.

RunBook

Um Runbook é um manual operacional contendo uma compilação de
procedimentos e operações que podem ser executados numa determinada situação, ou quando um evento acontece.

Normalmente, um runbook contém procedimentos para iniciar, parar, supervisionar e depurar um sistema, ele descreve os procedimentos para lidar com eventos e contingências inesperados.

Runbook é escrito em código, para garantir consistência de execução e evitar erros humanos. Geralmente os runbooks são versionados em um repositório Git.

Tudo o que é executado através de um terminal em um de seus servidores deve estar no runbook.

Um runbook deve incluir as seguintes seções:

  • Detalhes do evento: Breve descrição do evento, critérios de sucesso, cobertura de mídia, de evento e detalhes de contato com das principais partes interessadas, no cliente e na AWS.
  • Lista de serviços de Nuvem: Enumera todos os serviços da AWS para serem usados durante o evento. Além disso, a carga esperada nesses serviços, as regiões afetadas e as IDs de conta.
  • Revisão de arquitetura e aplicações: Documente os resultados de testes de carga, os pontos de estresse no projeto do aplicativo e da infraestrutura, resiliência medidas para a carga de trabalho, os pontos únicos de falha (SPOFs) e possíveis gargalos.
  • Revisão operacional: Configuração de monitoramento, critérios de integridade, mecanismos de notificação e os procedimentos de restauração de serviço.
  • Checklist de preparação: Inclui considerações como verificações de limites de serviço pré-aquecimento dos componentes da stack de aplicações, como balanceadores de carga, pré-provisionamento de recursos, partições do DynamoDB, partições do S3 e assim por diante.

Game Days

Um GameDay é um dia dedicado a fazer experimentos com a finalidade de gerar aprendizado para melhor familiarizar equipes com o ambiente em nuvem e desafiá-los a encontrar maneiras de resolver problemas com base nos recursos disponíveis para eles.

Idealmente as equipes criam ambientes similares a um ambiente de produção e executam uma série de testes nas aplicações, testes de segurança, testes de performance, testes de escalabilidade, testes de interoperabilidade.

O que acontece se um serviço estiver fora do ar? Os demais serviços continuam funcionando?

O que acontece se houver um pico de acesso em um dos serviços?

O que acontece se um data-center (AZ) da AWS cair?

E se uma região inteira cair?

Idealmente os testes criados no GameDay devem também ser automatizados e adicionados ao seu RunBook.

Otimização de Custos na Nuvem

Certifique-se que Arquitetura de Software em Nuvem e seu ambiente como um todo está otimizado para que você não desperdice dinheiro e recursos sem necessidade.

Reduza recursos ociosos

Evite manter recursos ociosos sem necessidade, utilize recursos de auto-scaling e desligue os recursos quando não forem necessários. Use instâncias spot quando disponibilidade não for um problema.

Reserve recursos

Você pode pagar por recursos em nuvem sob demanda (on demand), isso é você paga por hora, por segundo, às vezes até por milisegundo, mas existe também para alguns serviços a possibilidade de reservar um recursos por um ano, ou até mesmo três anos, gerando economias em alguns casos maiores do que 50%, considere essa possibilidade.

Escolha os recursos certos

Há várias formas de se resolver um mesmo problema com serviços da AWS.

Procure entender bem cada um dos serviços disponíveis e como os custos se aplicam a cada um para escolher com sabedoria o melhor custo/benefício.

Um site estático, por exemplo, na vasta maioria das vezes pode ser configurado usando apenas o Amazon S3 sem necessidade se provisionar e manter servidores, gerando uma diferença enorme nos custos.

É comum as empresas que estão migrando para nuvem apenas replicarem os servidores que tinham on premisses na nuvem (isso é chamado de lift and shift).

Lift and Shift como um primeiro passo pode ser ok, mas é importante repensar os componentes e a arquitetura para otimizar os custos e garantir mais qualidade e melhor uso dos recursos.

Considere usar serviços gerenciados em vez de manter tudo manualmente em máquinas EC2 (para bancos de dados, por exemplo, use RDS), pense em migrar funções de aplicações para Serverless, utilizar containers, migrar recursos estáticos para S3, etc.

Confiabilidade na Nuvem

Recupere-se automaticamente de falhas

Certifique-se de que se um recurso ou servidor cair, ou um serviço falhar, não seja necessário intervenção manual para que o serviço volte a estar disponível após a falha.

Use Multi-AZ

Certifique que todos os recursos estejam disponíveis em mais de uma zona de disponibilidade (data center) para que se um deles falhar o outro assuma o tráfego sem gerar indisponibilidade para seus usuários.

Escale automaticamente

Novamente, faça uso de recursos que escalam automaticamente (auto-scaling) para que sua aplicação não perca performance, ou saia do ar, quando a carga aumentar repentinamente.

Gerencia mudanças de forma automatizada

Evite qualquer tipo de acesso manual aos servidores ou aplicação de forma manual.

Automatize sua infraestrutura usando recursos como CloudFormation ou frameworks como Chef, Puppet ou Ansible para garantir que tudo está sendo feito de forma automatizada.

Fique atento ao limites

AWS tem alguns limites de número de recursos que podem ser criados em alguns serviços, é importantes conhecê-los e saber como contornar esses limites.

Alguns exemplos são limites de IPs, limites de networking, limites de banda, limites de quantidade de VPCs, limites de storage, limites de capacidade, etc.

Performance na Nuvem

Além de certificar que suas aplicações Escalem Automaticamente como descrito anteriormente, fique atento a cosias como:

Reduzir a Latência

Use serviços como o Amazon CloudFront e use as Edge Locations para certificar que os recursos estejam disponíveis sempre perto de seus usuários para garantir o melhor tempo de resposta possível.

Serverless

Faça uso de serviços Serverless como DynamoDB e Lambda que já foram criados e pensados para escalar quase que infinitamente de forma automática.

A maioria dos serviços serverless são baseados em eventos (event driven design), ou seja, as aplicações reagem a eventos, como um item adicionado numa fila ou um arquivo salvo no s3, por exemplo.

Um exemplo interessante de Serverless é a plataforma CloudGuru, um serviço de aprendizagem a distância (LMS) que foi criado de ponta a ponta utilizando tecnologia serverless.

A AWS oferece uma série de serviços serverless como o Lambda (para você criar suas funções), o Cognito (para autenticação), o DynamoDB (um banco de dados NoSQL), dentre muitos outros.

Busque e Elimite Gargalos

Há sempre algum recurso ou serviço que está limitando suas aplicações de serem mais performáticas do que são.

Identifique qual o próximo gargalo e procure melhorar (muitas das vezes trocando a abordagem como trocar um container por uma função lambda ou usando serviços gerenciados em vez de executá-los por conta) , repita o processo continuamente até encontre o nível de otimização ideal para sua aplicação.

Segurança na Nuvem

Privilégios Essenciais

Certifique de criar os grupos e conceder apenas as permissões realmente necessárias para cada usuário através do IAM (Least Privilege).

Lembre-se de habilitar o MFA (Multi-factor Authentication) para seus usuários. Dessa forma os usuários além de criarem uma senha forte vão precisar usar o token (físico ou virtual) para acessar suas contas (como fazem os bancos, por exemplo).

Rastreabilidade

Saiba quem fez o que e quando.

Habilite os logs, e faça auditoria dos acessos e registros com frequência.

Um dos serviços importantes é o AWS Cloud Trail que permite que virtualmente tudo que é realizado numa conta da AWS seja logado com todas as evidências para posterior auditoria.

O CloudTrail disponibiliza o histórico de eventos da atividade da conta da AWS, inclusive ações executadas por meio do Console de Gerenciamento da AWS, dos AWS SDKs, das ferramentas da linha de comando e de outros Serviços da AWS.

Automatize tarefas de segurança

Automatize aplicação de correções (patches), e garanta que as rotinas de segurança são executadas regularmente sem intervenção manual.

Criptografia

Dance como se ninguém estivesse vendo, mas criptografe como se todos pudessem ver.

Werner Vogels, CTO Amazon

Certifique-se de criptografar os dados em trânsito e também armazenados (at rest).

Proteja recursos a nível de Rede

Certifique-se de criar as VPCs de forma segura e otimizada, deixando público apenas o que precisa ser público, e criando subnets privadas para os recursos que não precisam ser expostos.

Backup e Teste o Backup

Certifique-se de criar as políticas de backup dos dados e testar a recuperação dos backups frequentemente.

Well-Architected Tool

O AWS Well-Architected Tool é um serviço da AWS que ajuda a analisar se você está ou não colocando em prática melhores práticas de arquitetura.

A ferramenta é baseada no AWS Well-Architected Framework e fornece uma abordagem consistente para clientes e parceiros avaliarem arquiteturas, foi usada em dezenas de milhares de arquiteturas e oferece orientações ajudar a implementar projetos que escalam de acordo com a evolução das necessidades ao longo do tempo.

Através dessa ferramenta você responderá uma série de perguntas sobre seu design e receberá um relatório em PDF com o resultado da avaliação das boas práticas.

AWS Well-Architected Framework Questionnaire

Melhores Livros sobre Arquitetura de Software em Nuvem

Palestra sobre Arquitetura de Software em Nuvem

Gostou? Deixe seus comentários.