Este projeto tem como objetivo desenvolver e testar habilidades em Linux, AWS e automação, através da configuração de um ambiente de servidor web monitorado.
A solução consiste em:
- Criar uma VPC personalizada na AWS com sub-redes públicas e privadas.
- Configurar uma instância EC2 com sistema operacional Linux (Ubuntu/Amazon Linux).
- Instalar e configurar o servidor web Nginx para servir uma página HTML personalizada.
- Implementar um script de monitoramento que verifica periodicamente a disponibilidade do site e envia notificações via Discord e Telegram em caso de indisponibilidade.
- Automatizar toda a configuração utilizando User Data na inicialização da instância.
- Opcionalmente, criar um template CloudFormation para provisionamento automatizado da infraestrutura.
-
VPC:
- 2 sub-redes públicas para acesso externo
- 2 sub-redes privadas para uso futuro
-
Instância EC2:
- AMI: Ubuntu ou Amazon Linux 2023
- Tipo: t2.micro
- Sub-rede pública
- Security Group configurado para permitir HTTP (80) e SSH (22)
-
Servidor Web:
- Nginx instalado e configurado para servir uma página HTML simples com informações do projeto.
- Serviço systemd configurado para reiniciar automaticamente o Nginx em caso de falha.
-
Script de Monitoramento:
- Executado a cada 1 minuto via cron.
- Verifica o status HTTP do site.
- Envia notificações para Discord e Telegram caso o serviço esteja indisponível.
- Logs gravados em
/var/log/monitoramento.log.
-
Automação:
- Todo o setup é realizado via script User Data, que é injetado na inicialização da instância EC2.
Criação da VPC, com 2 sub-redes públicas e 2 sub-redes privadas manualmente por meio do AWS Console
- Para criar a VPC por meio do dashboard VPC, primeiramente, clique em Create VPC.

- Na tela Create VPC clique em VPC and more para definir automaticamente duas sub-redes públicas e duas sub-redes privadas. Em Name tag auto-generation, pode ser fornecido o valor do nome, caso se deseje, se não ele será gerado pela AWS.

- É possível ainda alterar a quantidade de sub-redes desejadas e adicionar NAT gateways.

- Caso a VPC seja criada pelo modo VPC Only as sub-redes deverão ser configuradas posteriormente.
Criação da instância EC2 (pelo console)
- Para se criar a instância pelo dashboard EC2, primeiramente, clique em Launch Instance

- Na tela Launch an instance, configure as tags segundo a instância que você deseja configurar.

- Na aba Application and OS Images selecione a imagem desejada, sendo que, no caso desse projeto as opções são Amazon Linux ou Ubuntu. A imagem em específico pode ser a mais recente disponíel.

- Em Key pair, selecione um par de chaves já criado, ou crie um novo e salve em sua máquina para uso de conexão SSH por meio de chaves.

- Em Network Settings, clique em Edit para configurar de forma avançada. Selecione a VPC e a subnet pública apropriada, crie ou utilize um grupo de segurança existente.

- Caso deseje criar um grupo de segurança, escolha um nome e uma descrição para o grupo, e configure as regras do firewall. No caso do projeto, para fins de estudo, escolheu-se a opção de Source type como "Anywhere", mas em caso de produção, no é recomendável liberar todos os serviços dessa forma. A opção de public IP foi selecionada para se poder acessar a máquina pelo browser.

- As outras informações podem ser configuradas de forma padrão.
- Por fim, clique em Launch instance, no summary, ao lado.

Desafio Bônus 1
Criação da instância EC2 (pela linha de comando)
- Para criação da instância pela linha de comando, tanto pela AWS CLI, quanto pelo CloudShell dentro da AWS.
aws ec2 run-instances \
--image-id ami-0c55b159cbfafe1f0 \
--instance-type t2.micro \
--key-name MyKeyPair \
--security-group-ids sg-0123456789abcdef0 \
--subnet-id subnet-0123456789abcdef0 \
--count 1
- As flags são image-id: a imagem escolhida da VM, instance-type tipo de instância, key-name par de chaves, security-group-ids identificação do grupo de segurança, subnet-id a subnet escolhida count a quantidade de instâncias da forma a ser utilizada, block-device-mappings para informações do armazenamento,user-data o script a ser executado automaticamente, sendo ele codificado em Base64,tag-especifications os tipos de tag(segundo o tipo de recurso, como instance e volume), e em seguida as tags em pares de chave e valor.
- Pequenos ajustes para melhorar a visibilidade do README.
Instalação do Nginx
- Inicializada a máquina virtual, para se instalar o Nginx, basta executar o comando:
apt install Nginx
- O nginx já vem inicializado com uma página index padrão, localizada em /var/www/html. Essa página deve ser substituída pela página que se deseja servir pelo Nginx.
Página index do projeto
- A página index do projeto foi adicionada aos arquivos do projeto.
Script de monitoramento
- O script de monitoramento busca acompanhar o estado do servidor Nginx e enviar registros tanto para o arquivo /var/log/monitoramento.log, localizado na instância EC2, tanto para bots telegram e discord. No arquivo monitoramento.log, teremos o resultado de todas as verificações do script, enquanto os bots do Telegram e do Discord somente serão utilizados quando o servidor não estiver disponível. Para utilizar o script, deve-se passar a URL do bot . O script se localizará em /usr/bin/monitoramento.sh.
- O script utiliza o comando curl do Linux para verificar o estado do servidor. O curl foi escolhido por já vir instalado na maioria das distribuições Linux, ser de fácil uso, e permitir a manipulação da resposta HTTP/HTTPS por meio de flags como -s, assim obtendo somente o status do servidor.
- O IP da máquina é obtido se utilizando uma requisição HTTP para a página *checkip.amazon, que retorna o endereço de IP da instância EC2.
- Exemplo de uso:
/usr/bin/monitoramento.sh "<DISCORD_URL>" "<TELEGRAM_BOT_TOKEN>" "<CHAT_ID>"
- No caso, o script de monitoramento será configurado para execução automática por meio do Cron, utilitário do Linux que permite o agendamento de jobs(um tipo de processo Linux, que pode ser executado em foreground ou em background). Para se configurar a execução pelo cron, executa-se a série de comandos abaixo, onde primeiro se confere permissão de execução do script, e depois adiciona-se a linha que fará com que o script execute 1 vez por minuto ao arquivo crontab, que gerencia os jobs do cron.
chmod +x /usr/local/bin/monitoramento.sh
(crontab -l 2>/dev/null; echo "* * * * * /usr/local/bin/monitoramento.sh") | crontab -
- Por último, caso o Nginx não tenha se iniciado automaticamente, podem ser utilizados os seguintes comandos a fim de inicializá-lo:
systemctl enable nginx
systemctl start nginx
- Para se testar o funcionamento do script, pode se invocar o seguinte comando, forçando sua parada:
systemctl stop nginx
Alteração do script de monitoramento
- O script anteriormente utilizava parâmetros passados ao se invocar o script pela linha de comando. O script foi alterado para utilizar variáveis de ambiente, que é uma forma mais adequada para o uso a longo prazo.
- Para configurar as variáveis de ambiente, deve-se criar um arquivo chamado .env, da seguinte forma:
DISCORD_URL=https://discord.com/api/webhooks/...
TOKEN=123456:ABCDEF
CHAT_ID=456892554
- Esse arquivo deve ser carregado antes da execução do script, assim como pode ser visto abaixo.
source .env
./monitoramento.sh
- Foi criado o script userdata.sh que executará todos os passos da versão 2.1.0 automaticamente durante a inicialização da máquina. O script possui todos os comandos listados anteriormente, em ordem. Para se utilizar o arquivo userdata.sh, deve-se preencher a parte do arquivo .env com seu próprio TOKEN e CHAT ID do Telegram e o WEBHOOK do Discord, além de criar automaticamente o script monitoramento.sh e a página HTML index.html que o Nginx servirá.
- O script também inclui configurações do Nginx para sempre reinicializar caso ele se desligue, adiciona ao override.conf do serviço Nginx as seguintes linhas:
[Service]
Restart=always
RestartSec=3
- Foi adicionado o template do Cloudformation, que provisiona automaticamente a instância EC2. Detalhamento do arquivo:
AWSTemplateFormatVersion: '2010-09-09'
Description: EC2 with monitoring and Nginx, using Launch Template and cron
- AWSTemplateFormatVersion: Versão do formato YAML do CloudFormation (sempre esta string).
- Description: Uma breve descrição da pilha, útil para identificar o propósito da infraestrutura.
Parameters:
VpcId:
Type: AWS::EC2::VPC::Id
Description: VPC ID where the instance will be launched
SubnetId:
Type: AWS::EC2::Subnet::Id
Description: Subnet ID for the instance
- Aqui são os parâmetros de subnet e vpc, que devem ser criados na AWS anteriormente à execução do template. Os dois devem ser preenchidos.
Resources:
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH and HTTP
VpcId: !Ref VpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- Aqui se inicia a seção de recursos, onde se configura um security group que permite o uso dos protocolos SSH e HTTP, utilizando a mesma Id VPC encontrada acima.
EC2LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
- Aqui se inicia, dentro da seção de recursos, o template de lançamento da instância EC2 Define-se o tipo do template. Em seguida, são definidas as Properties
- ImageId: AMI usada para criar a instância (ex.: Amazon Linux 2 ou Ubuntu).
- InstanceType: Tipo da instância (ex.: t2.micro).
- KeyName: Nome da chave SSH para acesso remoto.
- NetworkInterfaces: Vincula à Subnet e ao Security Group fornecidos.
- BlockDeviceMappings: Define o disco raiz (sem snapshot manual).
- MetadataOptions: Reforça segurança de metadados.
- TagSpecifications: Aplica tags à instância e ao volume (útil para organização e cobrança).
- UserData: Script em Bash que será executado automaticamente quando a instância for criada.
- Ao final, cria-se a instância EC2, utilizando o Launch Template definido acima.
EC2Instance:
Type: AWS::EC2::Instance
Properties:
LaunchTemplate:
LaunchTemplateId: !Ref EC2LaunchTemplate
Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
SubnetId: !Ref SubnetId
- Evite expor chaves e tokens em repositórios públicos. Utilize variáveis de ambiente ou AWS Secrets Manager para produção.
- Configure corretamente grupos de segurança para deixar somente os protocolos correspondentes aos serviços necessários.
- AWS EC2, VPC, Sub-redes, Security Groups
- Ubuntu 22.04
- Nginx
- Bash
- Cron
- Discord e Telegram Webhooks para notificações
