Este projeto foi proposto para que se fosse estudado e aprimorado os conceitos, técnicas e aprendizados desenvolvidos sobre Docker e AWS. Este projeto visa criar uma estrutura em que as EC2 estejam privadas e sendo montadas por um EFS que também estará na subnet privada, utilize um Classic Load Balancer e que faça uso do monitoramento do Cloudwatch que irá monitorar as EC2 criadas pelo Auto Scalling Group.
- Docker
- Wordpress
- AWS (EC2, Script User Data, RDS, EFS, Security Group, Auto-Scalling Group, Target Group, Load Balancer)
- Excalidraw para abstração de diagramas
Primeiramente teremos que fazer a instalação do Docker na sua máquina, no caso do Windows faça a instalação do Docker Desktop. No caso do Linux apenas faça a instalação sudo apt update && sudo apt install docker
Para executar o container do Wordpress localmente utilizei o WSL, pois utilizo Windows atualmente, porém se tiver uma máquina que tenha um sistema operacional com Kernel Linux a instalação, criação e execução do container se tornam bem mais simplificadas, pois bem, segue o docker compose que utilizei localmente:
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
APACHE_SERVER_NAME: localhost
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
depends_on:
- db
networks:
- wordpress_network
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
command: --default-authentication-plugin=mysql_native_password
volumes:
- db:/var/lib/mysql
networks:
- wordpress_network
volumes:
wordpress:
db:
networks:
wordpress_network:
Este docker-compose cria um container com Wordpress e MySQL, fazendo uso do MySQL pois o Wordpress necessita de um banco de dados para sua execução, fazendo assim a criação conjunta do container com o Wordpress e o MySQL, fazendo a conexão entre eles via variáveis de ambiente MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD. A porta de acesso para a visualização do wordpress é a porta 8080 e as versões de cada um foram escolhidas por convenção, ambos são exemplos tirados da própria documentação do wordpress no docker hub.
Após a criação do docker-compose.yml faça a inserção do comando docker-compose up ou no caso de não querer visualizar os logs do docker-compose docker-compose up -d.
Para executar o Wordpress via EC2 eu primeiramente criei uma EC2 de maneira simples. Criei uma EC2 com a imagem Ubuntu mais recente e fazendo uso da uma chave .PEM, criei a EC2 utilizando uma t2.micro e fiz a configuração de rede com uma VPC que criei da maneira mais rápida possível, apenas para este teste.

As configurações finais da VPC ficaram assim:
Por fim para rodarmos a nossa EC2 iremos usar está VPC, fazendo uso dela colocaremos nossa EC2 na subnet pública para que tenhamos acesso via SSH a configuração ficaria desta forma:
A parte de conectividade é criar um Security Group com regra de entrada SSH configurada para o seu próprio IP, desta forma somente você conseguira acessar a EC2 via SSH e aproveitando você irá configurar um Security Group para acesso via seu IP para acessar a máquina via HTTP.

De resto podemos manter as configurações padrão e colocar a instância EC2 para rodar.
Ao iniciar a execução da EC2

Eu apaguei o nome da EC2 mas por questão de segurança apenas.
A conexão com a EC2 sendo feita via SSH apenas se atente em caso de ter utilizado uma chave .PEM ou .KSM e caso tenha feito uso de alguma destas chaves na criação da EC2 certifique-se de estar na mesma pasta que a sua chave SSH se encontra, após fazer isto utilizaremos o comando fornecido pela AWS para conectividade via SSH com nossas EC2s:

Após a inserção do comando de exemplo faremos o download do docker, mas antes iremos subir as nossas permissões para Super User, portanto usaremos o comando sudo su e após isso apt install docker -y e após isso iremos puxar o arquivo binário do docker compose utilizando o comando a seguir.
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
e após a inserção deste comando faremos a adequação das permissões para que o docker-compose possa ser executado sudo chmod +x /usr/local/bin/docker-compose e então pegaremos o seguinte docker-compose.yml e copiaremos para dentro de um arquivo com o mesmo nome e usaremos o comando docker-compose up -d e após isso acessaremos a página do Wordpress via IP publico da nossa EC2 e assim teremos algo semelhante a isto:
E pronto, testado !!
A VPC deste projeto deverá ser criada com um NAT GATEWAY acoplado para que as EC2 na subnet privada tenham conectividade com a internet para fazerem o download de todas as pendencias.
A VPC ficará configurada da seguinte forma:

Tendo 1 Nat Gateway, 1 Internet Gateway e 1 VPC Endpoint.
Para a criação da estrutura do wordpress via Docker nós iremos utilizar as Security groups para estruturar a base de comunicação entre as cada uma das partes deste projeto.
O diagrama acima mostra todas as conexões de forma simples e detalhada, mas devemos ter ciência de que todas as conexões não são unilaterais, de ambos os lados deve-se ter tais conexões, portanto no CLB-SG deve-se ter uma conexão com o WEBSERVER-SG de saída via HTTP pois as requisições viram do CLB e ele receberá de qualquer IP as requisições tendo configuração 0.0.0.0/0 de entrada via HTTP.
Todos esses Security Groups foram criados dentro da VPC anteriormente criada.
Para a criação do RDS iremos ter que nos atentar a algumas coisas, o RDS que utilizaremos será com MySQL, o RDS deverá estar privado sem nenhuma possibilidade de conectividade direta a ele.
O RDS funcionará como o banco de dados das instâncias EC2, fazendo a conexão diretamente pelos Security Groups.
Atente-se a senha e a versão do MySQL
Certifique-se destas configurações estarem feitas pois assim não gerará tantos custos para você ao final do projeto.
Estás configurações também devem ser verificadas para não gerar muitos custos ao final do projeto..
Estás configurações são de conectividade as quais definimos como a VPC a ser usada será a nossa anteriormente criada e o SG será o RDS-SG, acesso público configurado como NÃO por padrão e na zona de acessibilidade definimos como sem preferência.
Está é a ultima configuração que faremos, que é da criação do primeiro Database do RDS, o qual precisamos que seja criado anteriormente para que nosso container apenas tenha que fazer o acesso, pois ele não tem permissão de criação dentro do RDS;
O EFS irá servir como um ponto de backup para as outras EC2 que serão criadas em caso das anteriores terem que ser terminadas. Ele terá as credenciais do Wordpress juntamente com todas as modificações que já foram anteriormente feitas no Wordpress (posts, atualizações, usuários e por ai vai)
Para a criação dele precisaremos tomar cuidado com algumas coisas para que a montagem do nosso EFS seja bem executada:
A partir daqui iremos customizar o nosso EFS, a customização será feita para que possamos determinar algumas configurações que nos permitem customizar.
Configuramos aqui o File System como regional, desativamos o backup automático para menos custos e colocamos nenhum em todos os pontos do Lifecycle Management e na performance colocamos como Bursting para termos um throughput alto.
Nesta tela iremos configurar as subnets as quais ficara disponivel a montagem do EFS e alocaremos a EFS-SG para comunicação entre o EFS e o WEBSERVER de maneira adequada.
Nesta parte podemos deixar em branco mesmo, não é necessário configurar nada aqui, e por fim na próxima parte será de revisão e criação, crie em criar e aguarde alguns momentos para que os pontos de montagem sejam criados adequadamente.
Após os pontos de montagem terem sido devidamente criados, verifique-os clicando no EFS e indo para a aba de Network e ali verificaremos os pontos de montagem.
Um detalhe importante para guardarmos do EFS é o seu comando de montagem que se localiza na página que se abre após clicar em "Attach".
Retirei a parte do id do EFS por questão de segurança.
EFS criado, partiremos para a criação do Load Balancer;
O Load Balancer é quem vai fazer a distribuição das requisições feitas as EC2, substituindo a rota de entrada das EC2 pelo CLB.
A configuração do CLB é a seguinte:

Após estás configurações teremos o CLB criado e pré-configurado para uso no Auto Scalling Group.
O auto scalling group é quem fará a criação de outras instâncias EC2 para complementar as que forem sendo desligadas (por quaisquer motivo possível).
Para a criação do ASG utilizaremos um Launch Template.
O launch template é um modelo que será usado para gerar as EC2 através do ASG.
Para criar ele faremos como se estivéssemos criando uma EC2, escolheremos a AMI:
Configurações como o tipo da instância, chave de acesso SSH, conexão de VPC e subnets:
e já deixaremos pronto também a configuração do nosso User Data. O User Data é o script que vai ser rodado durante a inicialização da EC2, para configurar as EC2 devidamente configuradas eu preferi criar um User Data e testa-lo até ter a certeza de que eu conseguiria colocar uma EC2 rodar com ele e funcionar excelentemente bem, pois eu não teria acesso a EC2 portanto o único contato que eu deveria ter seria na criação e atualização do launch template e do User Data.
Segue o User Data criado:
#!/bin/bash
sudo yum update -y
sudo yum install -y docker wget amazon-efs-utils
sudo service docker start
sudo systemctl enable docker.service
sudo usermod -aG docker ec2-user
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo mkdir -p /wordpress
sudo mount -t efs -o tls [id do seu EFS]/ /wordpress
wget -O /home/ec2-user/docker-compose.yml [URL do seu docker-compose.yml RAW]
sudo chown ec2-user:ec2-user /home/ec2-user/docker-compose.yml
cd /home/ec2-user
sudo docker-compose up -d
Após finalizada a criação do launch template, selecionaremos o launch template criado no ASG:
Escolhemos a VPC que temos usado desde o começo e colocam os no ASG e definimos duas zonas de disponibilidade para que sejam usadas para alocar as EC2 criadas (OBS as subnets devem ser privadas).
Aqui clicamos em escolher um Load Balancer existente e depois clicamos em Classic Load Balancers e escolhemos o CLB que criamos.
Selecionamos apenas está opção, para habilitar o health check do Elastic Load Balancer e configuramos o período de ativação do Health Check.
Configuramos o tamanho desejado do grupo para 2, o tamanho mínimo para 2 e máximo para 4.

Nesta parte apenas habilitamos o monitoramento por parte do CloudWatch.
As próximas partes apenas clique next e next pois não são relevantes para o projeto em si, mas se preferir criar uma notificação para o acionamento do ASG ou tags para organização do seu ASG.
Após o ASG criado poderemos fazer o acesso ao Wordpress atráves do DNS do Load Balancer, podendo encontrar a seguinte página.
E logo em seguida teremos a seguinte tela:
E por fim temos a seguinte tela, logo após a tela de confirmação de criação do usuário:
Ao entrar teremos a seguinte tela:

Para a criação do Alarme do Cloudwatch precisaremos fazer algumas alterações primeiro. Antes de tudo teremos que criar uma politica de escalonamento simples ou passo a passo no ASG.
E então criamos uma métrica para a qual o alarme usará para poder fazer o monitoramento:
E a ultima parte dessas configurações é apenas uma revisão, após a configuração podemos verificar a criação do alarme na seguinte tela:
E assim finalizamos o projeto, muito obrigado!





