Skip to content

LucasEmanoel/Compass-Aws

Repository files navigation

Compass Uol

Linux Aws + NFS Client + ApacheServer

Version Licença MIT Lucas Emanoel Project Lang Github Linux



Logo

Atividade Prática

Iniciar uma instância na aws, transformar ela em um servidor apache com status check automatizado!
Explore a documentação »



Conteúdos
  • Sobre o Projeto
  • Preparando Ambiente
  • Usando SSH
  • Release 1.0.0
  • Release 2.0.0
  • Release 3.0.0
  • Recomendações de Uso
  • Roadmap
  • Contato


  • Sobre o projeto

    Existem muitas razões para utilizarmos a plataforma cloud computing da amazon em trabalhos onde é requisitado servidores. Aqui estão algumas:

    • Aumento da segurança - de acordo com o modelo de responsabilidade.
    • Estabilidade
    • Flexibilidade

    Para o momento iremos usar Aws Cloud Computing e é claro adotar boas práticas para aproveitarmos os benefícios da cloud, recomendo uma rápida leitura no Modelo De Responsabilidade.

    Preparando Ambiente

    De início vamos utilizar dois serviços disponibilizados pela aws e configurar com a CLI.

    Configurando o acesso local para Aws

    Para seguir o tutorial, você deve acessar o serviço IAM no Console AWS, criar um novo usuário ou usar um existente, ir na aba do security credentials e criar uma access key do tipo command line interface, por fim, faça o download das informações e vá para o terminal na sua maquina local:

    img img
    • Na maquina local, use os comando abaixo para instalar o cli, para instalar em windows ou mac veja: Iniciando com CLI.
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip";
    unzip awscliv2.zip;
    sudo ./aws/install
    • por fim use o comando aws configure.
    sudo aws configure
    AWS Access Key ID:
    AWS Secret Access Key:
    Default region name:
    Default output format:
    1. Copie e cole o AWS Access Key ID.
    2. Copie e cole o AWS Secret Access Key.
    3. Defina uma região.
    4. Escolha o tipo de saída dos comandos do CLI.

    Veja um exemplo:

    image

    Configurando VPC

    1. caso não possua uma VPC, crie uma vpc com o comando abaixo.
    • Caso tenha uma VPC, Copie o id na console aws e cole aqui.
    VpcId="Cole o Id da vpc"
    • Caso não, use o comando abaixo para criar.
    VpcId=$(aws ec2 create-vpc --cidr-block 172.31.0.0/16 --query Vpc.VpcId --output text)
    • Para associar outra VPC, copie o id dela no console aws.
    • Note que usamos $() para executar um comando e armazenar o resultado na variável VpcId, devemos fazer o filtro dessa informação usando o --query e exportando o resultado em formato de texto usando o --output text.
    1. Para criar as sua subnet, utilize os comandos abaixo.
    • Caso tenha uma Subnet configurada, Copie o id na console aws e cole aqui.
    SubnetId01="Cole o Id da subnet"
    SubnetId01=`aws ec2 create-subnet --vpc-id $VpcId --cidr-block 172.64.1.0/20 --query Subnet.SubnetId --output text`
    • Note que é preciso alterar os finais pois estamos fazendo uma divisão da rede, assim disponibilizando 256 ip's, para cada uma uma pois usamos /24.

    • Por fim use modify-subnet-attribute, para a instancia ser criada automaticamente com ip publico.

    aws ec2 modify-subnet-attribute --subnet-id $SubnetId01 --map-public-ip-on-launch
    1. Criando Internet Gateway(IGW).
    IgwId=`aws ec2 create-internet-gateway --query InternetGateway.InternetGatewayId --output text`
    • basicamente o IGW, é responsável por conectar a instancia com a internet, logo é necessário um em nosso ambiente.
    1. Vinculando o IGW na nossa VPC.
    aws ec2 attach-internet-gateway --vpc-id $VpcId --internet-gateway-id $IgwId
    • É necessário fazer isso pois o IGW, deve está associado a VPC onde a instancia será criada.
    1. Criando um Route Table(RT).
    RouteTableId=`aws ec2 create-route-table --vpc-id $VpcId --query RouteTable.RouteTableId --output text`
    • O route table será responsável por direcionar o trafego nossa instancia, nesse caso iremos configurar ele para o igw criado.
    1. Crie uma rota no route table direcionando para o igw
    aws ec2 create-route --route-table-id $RouteTableId --destination-cidr-block 0.0.0.0/0 --gateway-id $IgwId
    • Após criar a rota, associe a subnet utilizando associate-route-table.
    aws ec2 associate-route-table --subnet-id $SubnetId01 --route-table-id $RouteTableId
    • Pronto, agora você pode criar uma instancia dentro dessa subnet e conectar na internet
    1. Criando um Security Group para ter acesso a porta TCP/22, porta padrão do SSH.
    • Caso tenha uma Security Group configurado, Copie o id na console aws e cole aqui.
    SgId="Cole o Id do security group"
    SgId=`aws ec2 create-security-group --group-name AwsCompassSG --description "Security group for SSH access" --vpc-id $VpcId --query GroupId --output text`
    • Permitir porta 22, para poder usar login SSH.
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol tcp --port 22 --cidr 0.0.0.0/0
    • Permitir porta 2049, para porta usada pelo NFS.
    #TCP: 2049
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol tcp --port 2049 --cidr 0.0.0.0/0
    #UDP: 2049
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol udp --port 2049 --cidr 0.0.0.0/0
    • Permitir porta 111, Utilizadas pelo NFS.
    #TCP: 111
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol tcp --port 111 --cidr 0.0.0.0/0
    #UDP: 111
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol udp --port 111 --cidr 0.0.0.0/0
    • Permitir porta 80 e 443, Utilizadas pelo Apache.
    #TCP: 80
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol tcp --port 80 --cidr 0.0.0.0/0
    #TCP: 443
    aws ec2 authorize-security-group-ingress --group-id $SgId --protocol tcp --port 443 --cidr 0.0.0.0/0

    Configurando EC2

    1. Criando a SSH da instancia.
    • Crie primeiramente um SSH para poder logar na instancia.
    aws ec2 create-key-pair --key-name MySSH --query "KeyMaterial" --output text > MySSH.pem
    • Utilizando o --query "KeyMaterial", podemos visualizar apenas o valor da chave ssh, assim usando >, para salvar o output da query num arquivo .pem, por fim altere as permissões usando chmod, para leitura e escrita.
    chmod 400 MySSH.pem
    1. Iniciando a instancia.
    • Abra o console aws, e copie as seguintes informações.
      • ImageId - Vamos especificar uma id de imagem retirada da aws console.
      • SubnetId - Podemos escolher uma das 3 subnets criadas.
      • Device - Para especificar o armazenamento, no nosso caso 16gb.
    ImageId="ami-0b5eea76982371e91"
    • Especificando device de armazenamento.
      {
        "DeviceName": "/dev/xvda",
        "Ebs":{ "VolumeSize":16,
                "VolumeType":"gp2" }
      }
    • Iremos passar esse json para dentro de um comando run-instances
    InstanceId=`aws ec2 run-instances --image-id $ImageId --count 1 --instance-type t3.small --key-name MySSH --security-group-ids $SgId --subnet-id $SubnetId01 --block-device-mappings "[{\"DeviceName\":\"/dev/xvda\",\"Ebs\":{\"VolumeSize\":16,\"VolumeType\":\"gp2\"}}]" --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=LUCAS EMANOEL SILVA BARROS},{Key=Project,Value=PB},{Key=CostCenter,Value=PBCompass}]' --query Instances.InstanceId --output text`
    1. Criando e Associando Elastic IP a Instancia Criada.
    • Esse comando irá criar um Elastic IP!
    AllocationId=`aws ec2 allocate-address --query AllocationId --output text`
    • Para associar com a instancia usamos o comando abaixo.
    aws ec2 associate-address --allocation-id $AllocationId --instance-id $InstanceId

    Usando SSH

    • Abra o console aws, e copie a seguinte informação:
      • Elastic Ip - Ip publico associado a instancia.

    img

    ssh -i "MySSH.pem" ec2-user@[Elastic-IP]

    Release 1.0.0

    Transforme sua instancia em um servidor apache


    • Comando para instalar o apache, em distribuições que usam o package manager yum. caso esteja usando dpkg tente: sudo apt install apache2.
    sudo yum -y update;
    sudo yum -y install httpd
    • Agora você precisa utilizar o comando systemctl start iniciar o servidor apache!
    sudo systemctl start httpd
    • Verifique se está tudo configurado e rodando com o comando status!
    sudo systemctl status httpd
    • Caso precise, habilite o httpd para iniciar com a instancia usando enable.
    sudo systemctl enable httpd

    Release 2.0.0

    • O EFS permite que os possamos escalar nosso File System, ele funciona similar a um nfs onde podemos acessar os arquivos na rede em mais de uma instancia, assim provendo escalabilidade e permitindo espaço adicional.

    Instalar Pacotes necessários

    sudo yum -y update;
    sudo yum -y install amazon-efs-utils
    • Basicamente poderemos fazer um mount e acessar os arquivos em nosso maquina.
    sudo mkdir -p /mnt/efs
    • Para fazer o mount na pasta criada basta usar o comando mount -t efs, em seguida, especificar o <dns-efs>:<path-efs> <path-local>
    mount -t efs fs-00551b6438692354b.efs.us-east-1.amazonaws.com:/ /mnt/efs

    Release 3.0.0

    Criando um ShellScript para status check do servidor apache


    • Utilize novamente o gerenciador de pacotes yum, agora para instalar o cronie serviço que faremos o agendamento do script.
    sudo yum -y update;
    sudo yum install -y cronie
    • Inicie o serviço e verifique se está correto.
    sudo systemctl start crond
    sudo systemctl status crond
    • Caso necessário habilite o serviço para iniciar com o sistema
    sudo systemctl enable crond
    1. Criando nosso primeiro script.
    • Iremos criar uma pasta especifica para armazenar os shell scripts criados.
    sudo mkdir -p scripts/status_apache
    sudo vim scripts/status_apache/script.sh
    • Começamos o script especificando o bash.
    • Note que é uma boa pratica especificar qual script atual você está trabalhando e fazer uma breve descrição.
    #!/bin/bash
    # path: scripts/status_apache/script.sh
    # description: exemplo para verificar status de serviço no linux.
    
    SERVICE="httpd"
    STATUS="$(systemctl status $SERVICE | awk '/Active:/ {print $2 FS $3}')"
    DATE=`date +%F-%T`
    
    if [[ "${STATUS}" == "active (running)" ]]; then
            $(mkdir -p /mnt/efs/lucas-emanoel/log) echo "Data e Hora: $DATE - Serviço: $SERVICE | Status: $STATUS | Sucesso: O Servidor Está ONLINE! " > /mnt/efs/lucas-emanoel/log/SERVICO-ONLINE-$DATE.txt
    else
            $(mkdir -p /mnt/efs/lucas-emanoel/log) echo "Data e Hora: $DATE - Serviço: $SERVICE | Status: $STATUS | Erro: O Servidor Está OFFLINE! " > /mnt/efs/lucas-emanoel/log/SERVICO-OFFLINE-$DATE.txt
            exit 1
    fi
    1. Precisamos alterar as permissões dos scripts para poder executa-los e das pastas para gravar os resultados dos logs.
    sudo chmod +x scripts/status_apache/script.sh    
    • Para o crontab poder escrever os arquivos de log vamos alterar as permissões de leitura e escrita.
    sudo chmod go+rw /mnt/efs/lucas-emanoel
    • Configurando Crond
    1. Utilize o comando crontab para abrir o arquivo de agendamentos do usuário atual.
    sudo crontab -e
    • Dentro do arquivo você poderá configurar o tempo em que cada script será executado.
    • Observe que cada * representa uma unidade de medida:
      • 1º - Minutos
      • 2º - Horas
      • 3º - Dias
      • 4º - Meses
      • 5º - Dia da Semana
    */5 * * * * /scripts/status_apache/script.sh 
    • Para verificar se as configurações deram certo, use o comando abaixo e verifique se o arquivo de log foi criado na pasta de logs.
    sudo crontab -l
    sudo ls -lh /mnt/efs/lucas-emanoel/log

    Uso

    Para usar em seu ambiente fique ciente que deve seguir os passos adaptando para seu console aws, configurando sua cli, caso necessário consultado informações diretamente no console, alguns comandos você aplicará diretamente no seu terminal então recomendo uma visualização mais detalhada na documentação do CLI.

    volte pra o inicio

    Roadmap

    • Inicie uma Instancia Aws - t3.small - 16gb SSD
    • Associe um Elastic Ip
    • Subir um Servidor Apache
    • Fazer um Mount no EFS Disponibilizado Pela Compass
    • Criar um Script de Status
      • Data + Hora
      • Nome do Serviço
      • Status do Serviço
      • Mensagem Online ou Offline
      • Gerar 1 Arquivo para Cada Status
      • Execução a Cada 5 Minutos
      • Enviar os Arquivos para EFS

    volte pra o inicio

    Contato

    Lucas Emanoel - @Lucas Barros - lucas2014.barros@gmail.com

    Project Link: Linux Aws Pratica

    volte pra o inicio

    About

    Repositório para atividade prática, Compass PB UFAPE : Aws - Apache - Crontab - Efs

    Topics

    Resources

    Stars

    Watchers

    Forks

    Packages

    No packages published

    Languages