Automatizando a migração para AWS com Application Migration Service

Em 2020 fiz um post sobre o tema Migração para AWS com Cloud Endure, mas essa ferramenta foi descontinuada (exceto nas regiões AWS GovCloud e da China), devido a essa mudança, resolvi criar esse tutorial detalhando sobre a migração para a AWS usando o Application Migration Service.

Com o Application Migration Service podemos automatizar o processo de conversão de servidores para execução nativa na nuvem AWS. Com essa solução podemos migrar por exemplo, aplicações como Oracle, SAP e SQL Server executadas em servidores físicos, VMware vSphere, Microsoft Hyper-V e outras infraestruturas on-premises. Nesse tutorial irei demonstrar a migração de um servidor Linux que está em um ambiente on-premises convertendo esse servidor para uma Instância EC2.

Vamos lá!

Primeiramente vamos criar o usuário no Identity and Access Management (IAM) para utilizarmos no AWS Application Migration Service. Acessando a console do IAM, clique na opção Users do menu lateral e depois no botão Create user, conforme imagem abaixo:

Após clicar no botão Create user irá carregar a janela abaixo, onde iremos inserir o nome de usuário (user name), para essa demonstração iremos inserir o nome de usuário migration e clicar no botão Next:

Na próxima janela iremos definir as permissões que esse usuário terá no ambiente da AWS, como iremos utilizá-lo somente para o Application Migration Service, iremos selecionar a política (policy) AWSApplicationMigrationFullAccess e clicar no botão Next conforme imagem abaixo:

A política selecionada acima dará acesso total (full) ao Application Migration Service (MGN) necessárias para esse ambiente de demonstração. Para mais detalhes sobre as políticas (policies) do Application Migration Service, confira abaixo no link:
https://docs.aws.amazon.com/mgn/latest/ug/security-iam-awsmanpol.html

Clicando no botão Next, será carregada a página de Review onde será possível revisar as configurações realizadas. Após revisar e estando de acordo com as configurações, clique no botão Creater user para criar o usuário:

Após a criação do usuário, iremos criar as credenciais para acesso programático. Através dessas credenciais que Application Migration Service terá acesso para realizar a migração do servidor para a AWS. Na console do IAM, selecionamos o usuário que criamos clicando em seu nome (imagem abaixo):

Será aberta uma janela similar a da imagem abaixo, onde iremos clicar no link Create access key:

Na próxima janela, selecione a opção Third-party service, confirme a escolha através do checkbox “I understand…” e clique no botão Next conforme imagem abaixo:

Na próxima tela, clique no botão Create access key:

Clicando no botão, serão exibidas as credenciais que foram criadas, salve-as em um local seguro, caso as perca, será necessário criar novas credenciais, pois não é possível recuperá-las:

Com o usuário e suas credenciais criadas, vamos para a próxima etapa.
Precisaremos agora instalar o AWS Replication Agent que é o agent que irá realizar a replicação do servidor com a AWS para que seja possível migrá-lo posteriormente.

Agora, iremos acessar a console do Application Migration Service para realizar o download do agent na console do Application Migration Service, basta acessar o menu Source servers na barra lateral esquerda, clicar em Add server na tela que irá carregar no lado direito. Confira os passos descritos na imagem abaixo:

Para essa demonstração iremos utilizar como base um servidor Linux, após clicar no botão Add server irá carregar uma janela conforme abaixo:

Descendo a barra de rolagem você verá os itens 5 e 6 onde haverá as seguintes linhas de comando, na primeira (item 5), faz o download do instalador e na segunda (item 6) faz a instalação do agent:

Agora, em posse das linhas de comando, iremos acessar o servidor que iremos migrar para a AWS. Após fazer o download e iniciar a instalação, você verá uma tela similar a tela abaixo, caso tenha sucesso na instalação, aparecerá a seguinte mensagem “The AWS Replication Agent was successfully installed.” conforme a última linha da imagem abaixo:

Caso ocorra algum erro na instalação, confira na página de troubleshooting abaixo, os possíveis erros de instalação:
https://docs.aws.amazon.com/pt_br/mgn/latest/ug/Troubleshooting-Agent-Issues.html

É importante lembrar que para a replicação o Application Migration Service cria uma Instância EC2 de replicação (Replication Server) automaticamente. Por padrão será uma instância t3.small,  essa instância atende muito bem o nosso cenário de teste. Para migração de um ambiente de vários servidores, sugiro que leiam na documentação abaixo:
https://docs.aws.amazon.com/mgn/latest/ug/instance-type.html
Para alterar o tipo de instância basta alterar através do menu Settings / Replication template na console do Application Migration Service.

Com o AWS Replication Agent instalado será possível visualizar o servidor na console do Application Migration Service, na imagem abaixo o servidor já foi replicado para a AWS e já está pronto para seguirmos para a próxima etapa que é subir uma instância EC2 de teste do servidor replicado.

Na janela acima, clicamos no nome do servidor que queremos migrar para a AWS conforme descrito na imagem abaixo:

Ao clicar será carregada a janela com o dashboard de migração, por essa tela será possível acompanhar o status atual do ciclo de vida da Migração desse servidor:

A seguir, iremos na aba Launch settings onde teremos as configurações da Instancia EC2 que irá subir no momento da migração. Essa configuração é puxada através do Launch template padrão, que foi criado pelo próprio serviço (Application Migration Service):

Depois de verificado as configurações da Instância, iremos subir uma instância de teste para validar o funcionamento antes da migração definitiva. Para fazer esse teste precisaremos clicar no botão Test and cutover e depois na opção Launch test instance, conforme demonstrado na imagem abaixo:

Aparecerá um pop-up alertando que a instância que será criada, utilizará como base as configurações do Launch template, basta clicar no botão Launch e o processo de subir a Instância será iniciado.

Nesse momento, o Application Migration Service irá subir uma nova Instância EC2 para realizar o processo de conversão (Tag name: AWS Application Migration Service Conversion Server), esse servidor realiza a conversão dos discos para iniciar na EC2, faz alterações no bootloader, injeta os drives do hypervisor e instala as ferramentas de nuvem (cloud tools). Servidor de conversão criado na imagem abaixo:

Após esse processo e a Instância iniciada, o servidor de conversão (Conversion Server) será deletado, conforme imagem abaixo:

Com a instância de teste iniciada, você poderá acessá-la para testar as aplicações contidas e validar que estão em perfeito funcionamento. Após a validação, voltamos para a console do Application Migration Service para confirmar que a instância está pronta para ser migrada para a AWS e avançarmos para a próxima etapa do ciclo de vida da migração.
Para isso basta clicar no menu Mark as “Ready for cutover”, conforme imagem abaixo:

Após clicar será aberta um pop-up informando que ao confirmar a Instância de teste será deletada:

É interessante que a própria solução vai informando qual a próxima etapa no ciclo de vida da migração, evitando que você fique confuso durante esse processo. É importante lembrar que, nessa demonstração estamos migrando somente 1 servidor, mas em um cenário real poderiam ser vários servidores.

Agora vamos para a etapa de cutover (transição) onde iremos subir a instância EC2 em definitivo para a AWS. Para isso basta clicar no menu Launch cutover instance e confirmar no botão Launch no pop-up que irá carregar, conforme imagens abaixo :

Após os ações acima, o Application Migration Service irá executar os passos realizados no momento de subida da instância EC2 de teste, criando o servidor de conversão e apagando ele após o processo.

Como podemos ver, o servidor foi migrado para a AWS como uma instância EC2 e está pronto para o uso.

Agora vamos finalizar o processo no Application Migration Service. Nesse ponto precisaremos ter certeza que a Instância que subiu está funcionando perfeitamente. Tendo essa certeza, basta clicar no menu Finalize cutover.

Como citado anteriormente, ao clicar no botão Finalize todos os dados de replicação e recursos usados nessa migração serão apagados. Depois que clicar não terá mais volta.

A partir desse momento o ciclo de migração estará finalizado e a Instância EC2 pronta para ser colocada em produção na AWS. 🙂

Para finalizar, clicaremos em Mark as archived no menu Actions e o servidor será removido da janela Source server do Application Migration Service

Concluído! Finalizamos nossa migração de um servidor Linux para a AWS.

Até breve!!! 🤓

Como proteger a sua aplicação web na AWS usando WAF (Web Application Firewall)

Atualmente na era digital, a segurança online se tornou uma prioridade, especialmente quando se trata da proteção de aplicações web contra ameaças cibernéticas. No ecossistema da Amazon Web Services (AWS), a implementação de medidas robustas de segurança é fundamental para garantir a integridade e disponibilidade de seus recursos na nuvem. Neste post, exploraremos em detalhes a utilização do WAF (Web Application Firewall) na AWS, uma ferramenta essencial para fortificar a segurança de suas aplicações web. Descubra como o WAF pode ser uma barreira eficaz contra ameaças do tipo: ataques DDoS, injeção de SQL e outros exploits comuns, proporcionando uma camada adicional de proteção para o seu site hospedado na AWS. Prepare-se para aprofundar seus conhecimentos e elevar o nível de segurança de sua presença online na nuvem.

Essa publicação demonstrará como configurar o WAF como a primeira camada de proteção da aplicação, trabalhando em conjunto com o CloudFront (CDN).

O Cloud Front é uma CDN (Content Delivery Network) da AWS para entrega de conteúdo com alta velocidade e baixa latência devido a sua quantidade de (PoPs) Pontos de Presença espalhados pelo mundo.  
Mais detalhes sobre esse serviço aqui: https://aws.amazon.com/pt/cloudfront/

Acessando a console do WAF pela primeira vez, será exibida uma janela similar a essa abaixo, clique no botão laranja Create web ACL:

Será carregada uma janela de configuração da Web ACL, nessa primeira etapa será necessário informar o tipo de recurso que você irá associar a essa ACL, existem duas opções CloudFront distributions (opção padrão) ou recursos regionais, por exemplo: Application Load Balancers, API Gateway entre outros serviços.

Nessa demonstração iremos criar a ACL para o CloudFront, inserindo o nome da Web ACL, o campo CloudWatch metric name será automaticamente preenchido, esse nome será para indentificar as métricas da Web ACL no Cloud Watch:

No próximo bloco de configurações podemos definir o Body size limit que o WAF irá inspecionar, esse limite se aplica ao request body, headers e cookies. Para essa demonstração, iremos deixar a opção Default (Padrão) que é 16 KB, pagando um valor adicional, esse valor pode ser alterado até 64 KB conforme imagem abaixo:

Definido o Body size limit, iremos selecionar o CloudFront Distribution que iremos associar a Web ACL que estamos criando.

Clicando no botão Add AWS resource conforme imagem acima, irá carregar uma janela com as Distributions existentes, selecione o Distribution e clique no botão Add conforme imagem abaixo:

Irá voltar para a tela anterior (imagem abaixo), clique no botão Next:

Nessa etapa, iremos definir as regras conforme os comportamentos das requisições web e de acordo com o que for identificado na requisição, a ação que será tomada. Por exemplo, se será liberado (Allow) ou bloqueado (Block).

Clicando em Add rules e depois em Add managed rule groups, será carregado uma tela com as regras gerenciadas, existem regras da própria AWS (que iremos usar aqui) e também de outros diversos fabricantes. Clicando em AWS managed rule groups vai expandir as regras gerenciadas pela AWS…

Iremos selecionar as regras gratuitas da AWS chamada Core rule set, que inclui proteções para aplicações Web incluindo OWASP publications (publicações OWASP) e Amazon IP reputation list que é baseada na Amazon threat intelligence (Inteligência de Ameaças Amazon) e irá bloquear IPs associados a bots entre outras ameaças já conhecidas pela AWS.

Após selecionar as regras desejadas, basta clicar no botão Add rules no final da página.

Um ponto importante que deve ser considerado é que cada regra (Rules) tem um limite de capacidade que é de 5000 WCUs, mas usando acima de 1500 WCUs existirá um custo adicional.
O WCU é basicamente uma unidade de medida de capacidade da Web ACL, que a AWS utiliza para calcular e controlar os recursos necessários para executar as regras.
Para saber dos custos envolvidos nas regras, acesse: https://aws.amazon.com/waf/pricing/

Entendendo a regra abaixo, no nosso cenário usamos somente duas regras que utilizam uma capacidade de 725 WCUs e estaremos liberando o tráfego das requisições que o comportamento não for o esperado nas regras adicionadas na sessão Rules:

Clique no botão Next.

Após configurar as regras e seu comportamento, iremos definir a prioridade de processamento delas no WAF, quando uma requisição chegar eles serão avaliadas de cima para baixo.

No cenário da nossa Web ACL, é necessário que o WAF faça o bloqueio de qualquer IP que esteja na lista AWS-AWSManagedRulesAmazonIpReputationList, antes que ele faça a análise da regra AWS-AWSManagedRulesCommonRuleSet, com isso será alterada a ordem de processamento. Observe no vídeo abaixo:

Nessa etapa, iremos configurar o nome que as métricas serão enviadas para o CloudWatch para monitoramento, deixaremos com as opções padrão:

Ao clicar no botão Next será exibida a tela de Review (análise), onde você poderá visualizar o que foi configurado em todas as etapas da configuração da Web ACL, caso esteja de acordo, é só clicar no botão Create web ACL para criar a Web ACL.

Finalizada a criação da Web ACL, navegaremos pelo Dashboards e analisaremos o tráfego. Para popular os Dashboards, foi realizado um teste online através de sites gratuitos para gerar tráfego e conseguirmos ver o WAF em funcionamento.
Acessando a Web ACL criada, iremos selecionar a aba Traffic overview. Conforme janela abaixo:

Na primeira parte temos o resumo com a quantidade total do tráfego, o que foi liberado (allow), bloqueado (blocked) e em qual regra foi bloqueado:

Na segunda parte (Traffic characteristics), conseguimos ver a característica do tráfego que são informações importantes, tais como: o tipo do cliente, os tipos de ataques, se é tráfego de Bot ou não e o país de origem do tráfego.

Já nessa última parte, é possível ver em qual regra / grupo de regra a requisição foi categorizada.

A partir de agora, teremos mais uma camada de proteção na aplicação web.

É fundamental destacar que nessa demonstração, foram empregadas apenas duas regras. Isso se deu com o propósito de elucidar o funcionamento da solução de WAF da AWS. No entanto, ao lidar com um ambiente que envolva uma aplicação real e crítica, é imperativo realizar uma análise detalhada da aplicação. Essa análise permitirá identificar quais regras (proteções) devem ser configuradas na WebACL, garantindo uma abordagem personalizada e eficaz para a segurança do ambiente.

Abaixo, observe algumas regras que poderiam ser adicionadas a WebACL:

Espero que essa publicação possa ser uma contribuição valiosa para a comunidade da AWS, como um auxílio para quem está buscando conhecimento na área de Cloud.

Até breve!!

Upgrade RDS MySQL com Blue/Green Deployment

Veja como criar um ambiente de Blue/Green para um banco de dados RDS MySQL em produção e utilizar essa funcionalidade para upgrade do MySQL, reduzindo o downtime durante processo de upgrade de versão, possibilidade de rollback mais rápido entre outras possibilidades que irei comentar nesse post.

O Blue/Green deployment são dois ambientes, onde o ambiente Green (Ambiente de Teste) permanece sincronizado com o ambiente Blue (Ambiente de Produção) através de replicação lógica, possibilitando alterações e testes mais assertivos no ambiente Green sem afetar o banco em produção (Blue).


Vamos lá…

Para esse post, foi criado um banco de dados com a versão 8.0.28 (imagem abaixo) que será o Banco de Dados Blue e no momento da criação do Blue/Green Deployment iremos especificar a versão 8.0.32 para o Banco de dados Green com isso será possível simular um upgrade utilizando o recurso.

Com o banco de dados criado, vamos configurar o ambiente para funcionar como Blue/Green Deployment, acessando a console do RDS iremos selecionar o banco da dados e através do menu Action / Create Blue/Green Deployment iremos fazer as configurações:

Na próxima janela será configurado o Blue/Green deployment, inserindo o nome do ambiente, engine version (versão do banco de dados) e parameter group do banco de dados Green. Nesse ponto selecionamos a versão mais atual disponível.

Após selecionar as opções acima e finalizado o processo de criação do ambiente, que nessa demonstração demorou em torno de 16 minutos, será possível ver a seguinte estrutura abaixo na console do RDS:

Um ponto importante é que após a criação do Blue/Green Deployment, o endpoint de conexão continuará o mesmo, criando apenas um novo endpoint para acesso ao Banco de Dados Green. Como isso não seria necessário alterar os parametros de conexão da sua aplicação.
O banco de dados Green será um clone do banco de dados Blue, portanto, se o banco de dados Blue for MultiAZ e tiver replicas de leitura, o Green também terá essa mesma estrutura.

Com o ambiente Blue/Green criado, irei realizar o teste fazendo o “Switch over” do banco de dados Blue para o Green e com isso irei monitorar o tempo que irá demorar para fazer essa “virada”.
Para realizar o “Switch over” é muito muito simples, basta seguir os passos abaixo:

Clicando no opção Switch over irá carregar a janela abaixo com um sumário dos bancos de dados Blue e Green e também o Timeout setting onde você especificará o tempo limite para o switch over ocorrer. Caso o Switch over demore mais que o tempo especificado em Timeout setting, o procedimento não será concluido e nenhuma alteração será aplicada no ambiente.

Após clicar no botão Switch over, o processo será iniciado e a coluna status dos bancos de dados ficará conforme a image abaixo:

Após o Switch over o DB identifier dos bancos será alterado, o banco de dados que estava como Green assumirá como db-mysql1 e o banco de dados que era o Blue foi renomeado com db-mysql1-old1 como pode ser visto abaixo:

O procedimento demorou em torno de 2 minutos, nesse período toda a gravação (write) foi interrompida no banco, mas a leitura (read) continuou normalmente. Essa funcionalidade ficou sensacional! Não acham?

Aplicação em um cenário real

Imaginando um cenário em um ambiente de produção de uma empresa, onde é necessário fazer um upgrade de um banco de dados, mas com o menor tempo de indisponibilidade possível e a menor carga operacional. 
Essa funcionalidade seria uma ótima opção, pois o upgrade, testes e validações seriam realizados no banco de dados Green, finalizando essas etapas, seria necessário somente programar uma janela de manutenção para fazer o Switch over para colocar a nova versão em produção.

Observações

1 – Realizamos esses procedimentos em um banco de teste, mas em um banco de produção com maior volume gravação, o tempo para o Switch over poderá ser maior.

2 – No momento em que escrevo esse post, o Blue/Green deployment é compatível apenas com o Amazon Aurora com MySQL, RDS MariaDB e RDS MySQL…

Agora só nos resta aguardar essa funcionalidade ficar disponível para outras bancos de dados :).

Até breve!

Aplicações Web com Arquitetura Serverless na AWS

Aprenda como publicar uma Aplicação Web na internet utilizando a nuvem AWS e com uma Arquitetura 100% Serverless, imagine não se preocupar, por exemplo, em atualizações de patches do sistema operacional, pois essa parte será abstraida pela AWS o que reduz a atuação da equipe responsável pela infraestrutura e no quesito segurança, temos uma redução da superfície de ataque.

Com essa arquitetura é possível dar um foco maior na sua aplicação e não se preocupar com a administração da infraestrutura, pois utilizaremos serviços que são altamente disponíveis e administrados pela própria AWS.
Para saber mais detalhes sobre o modelo de responsabilidade compartilhada, você poderá acessar o endereço:

https://aws.amazon.com/pt/compliance/shared-responsibility-model/

Utilizaremos os seguintes serviços:


Cloud Front
S3
IAM


CI/CD


Vamos lá…

Iniciaremos com os serviços que serão a base da infraestrutura na AWS 

Criaremos um Bucket no Amazon Simple Storage Service (Amazon S3) ou comumente chamado de S3 para armazenar os arquivos do Web Site, esse é um serviço de Storage na Nuvem da AWS para o armazenamento de objetos onde teremos escalabilidade, alta disponibilidade dos dados, segurança e performance.

S3 – Criação do Bucket

Na tela do Amazon S3, clique no botão laranja Create bucket:

Iremos criar um bucket S3 com as configurações padrões, ativando somente a opção ACLs enabled no Object Ownership e a criptografia padrão conforme as imagens abaixo:

CloudFront – Criar o distribution ID

Agora vamos para o Cloud Front que terá a função de disponibilizar o nosso site para o mundo, pois ele fará a entrega do conteúdo da aplicação.

O Cloud Front é uma CDN (Content Delivery Network) da AWS para entrega de conteúdo com alta velocidade e baixa latência devido a sua quantidade de (PoPs) Pontos de Presença espalhados pelo mundo.  
Mais detalhes sobre esse serviço aqui: https://aws.amazon.com/pt/cloudfront/

Precisaremos criar um Distribution, ao acessar a página do Cloud Front, clique no botão laranja Create distribution:

Ao clicar no botão Create distribution você será direcionado para a página de criação, no primeiro bloco iremos inserir as configurações de Origin, selecionando o bucket que foi criado, a opção Origin access é exibida com algumas opções que iremos configurar conforme as imagens abaixo, visando maior sergurança e performance:

Na etapa de configuração do cache, no Default cache behavior e Cache key and origin requests deixaremos as configurações padrão:

No bloco Function associations, deixaremos o padrão (imagem abaixo), pois não utilizaremos essas configurações nessa demonstração.

Em Settings, podemos configurar a opção de performance, WAF (Web Application Firewall), nome de domínios (CNAME), certificado e versão do HTTP.

Para essa demonstração específica configuraremos o Default root object como index.html, mas dependendo de como a sua aplicação foi construída, pode não ser necessário informar o index.html.

Finalizado a infraestrutura base, seguiremos para o deploy da aplicação…

Deploy da Aplicação

Simularemos uma esteira de CI/CD utilizando o Gitlab para realizar os ajustes na infraestrutura base que criamos anteriormente e o deploy da aplicação (Web Site). O intuito é automatizar esse processo e ganhar agilidade nos deploys.

Obs.: É importante lembrar que as etapas demonstradas a partir desse momento, podem ser realizadas manualmente, desde o upload dos arquivos para o S3 até os ajustes no Cloud Front.

Crie um novo projeto no Gitlab e insira as variáveis (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY e AWS_DEFAULT_REGION) para que o Gitlab tenha acesso ao nosso ambiente AWS e consigar realizar o deploy da aplicação (Web Site) conforme imagem abaixo:

Esse projeto possui uma aplicação web simples para essa demonstração, mas também é possível utilizar a mesma infraestrutura com aplicações em Node.js, React, entre outras, utilizando o arquivo serverless.yml que deixarei disponível nesse projeto.
Iremos focar nos arquivos destacados em vermelho na imagem abaixo:

Na pasta www estão os arquivos que serão enviados para o Bucket S3.
No arquivo .gitlab-ci.yml definimos as ações que serão tomadas, a ordem de execução, em qual condição e os recursos necessários.
Segue abaixo os comandos básicos necessários para fazer o download do projeto para a sua máquina e enviar as alterações para o Gitlab:

# 1- Clonar o projeto com o comando abaixo:
git clone git@gitlab.com:devops-breno/serverless_website.git
# 2 - Faça as alterações necessárias no projeto e envie para o repositório executando os comandos abaixo:
git add .
git commit -m "Novo WebSite Estático"
git origin push main

Após executar os comandos, você poderá acompanhar a execução do Job no menu CI/CD / Jobs, se tiver sucesso no deploy, você irá visualizar uma tela conforme imagem abaixo:

Recebendo a mensagem Job succeeded, o deploy foi realizado com sucesso e você poderá acessar o endereço do Cloud Front para teste conforme abaixo:

Acessando o endereço, será possível acessar a página de exemplo com a arquitetura serverless do ambiente:

Pronto! Agora temos uma Aplicação Web 100% Serverless na AWS.
O link abaixo é referente ao site publicado nesse post:

https://d2uhz4c1bwszas.cloudfront.net

Link para download do projeto utilizado:
https://github.com/BrenoACarvalho/ServerlessWebSite

Até breve! 🙂