Skip to content

kf0405/CompassUOLPB-ProjetoLinux

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Projeto Linux - Configuração de Servidor Web com Monitoramento na AWS

Descrição

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.

Estrutura do Projeto

  • 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.

Versão 1.0.0

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. Console 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. Create VPC
  • É possível ainda alterar a quantidade de sub-redes desejadas e adicionar NAT gateways. Subredes e NAT
  • 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 Console EC2
  • Na tela Launch an instance, configure as tags segundo a instância que você deseja configurar. Name tags
  • 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. Images
  • 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. Key pair
  • 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. Network Settings parte 1
  • 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. Network Settings parte 2
  • As outras informações podem ser configuradas de forma padrão.
  • Por fim, clique em Launch instance, no summary, ao lado. Sumário

Desafio Bônus 1

  • Insira, em Advanced details, o script user data, que será executada pela instância ao ser lançada.User Data

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.

Versão 1.0.1

  • Pequenos ajustes para melhorar a visibilidade do README.

Versão 2.0.0

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

Versão 2.1.0

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

Versão 3.0.0

  • 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

Versão 4.0.0

  • 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

Segurança

  • 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.

Tecnologias Utilizadas

  • AWS EC2, VPC, Sub-redes, Security Groups
  • Ubuntu 22.04
  • Nginx
  • Bash
  • Cron
  • Discord e Telegram Webhooks para notificações

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors