1
resposta

Erro 502 ao acessar o Load Balancer

Olá segui todos os passos do video mas ao acessar a url do load balanacer para faze ro teste de carga, deu erro 502 na página. Seguem os códigos:

main.tf

terraform {
    required_providers{
        aws = {
            source = "hashicorp/aws"
            version = "~> 3.27"
        }
    }

    required_version = ">= 0.14.9"
}

provider "aws" {
  region  = var.regiao_aws
}

resource "aws_launch_template" "maquina" {
  image_id           = "ami-0cb91c7de36eed2cb"
  instance_type = var.instancia
  key_name = var.chave 
  tags = {
    Name = "Terraform Ansible Python"
  }
  security_group_names = [ var.grupoDeSeguranca ]
  user_data = filebase64("ansible.sh")
}

resource "aws_key_pair" "chaveSSH"{
  key_name = var.chave
  public_key = file("${var.chave}.pub")
}


resource "aws_autoscaling_group" "grupo" {
  availability_zones = [ "${var.regiao_aws}a", "${var.regiao_aws}b" ]
  name = var.nomeGrupo
  max_size = var.maximo
  min_size = var.minimo
  launch_template {
    id = aws_launch_template.maquina.id
    version = "$Latest"
  }
  target_group_arns = [ aws_lb_target_group.alvoLoadBalancer.arn ]
}

resource "aws_default_subnet" "subnet_1"{
  availability_zone =  "${var.regiao_aws}a"
}

resource "aws_default_subnet" "subnet_2"{
  availability_zone =  "${var.regiao_aws}b"
}

resource "aws_lb" "loadBalancer"{
  internal = false
  subnets = [ aws_default_subnet.subnet_1.id,aws_default_subnet.subnet_2.id ]
  security_groups = [aws_security_group.acesso_geral.id]
}

resource "aws_lb_target_group" "alvoLoadBalancer"{
  name = "maquinasAlvo"
  port = "8000"
  protocol = "HTTP"
  vpc_id = aws_default_vpc.default.id
}

resource "aws_lb_listener" "entradaLoadBalancer"{
  load_balancer_arn = aws_lb.loadBalancer.arn
  port = "8000"
  protocol = "HTTP"
  default_action {
    type = "forward"
    target_group_arn = aws_lb_target_group.alvoLoadBalancer.arn
  }
}

resource "aws_default_vpc" "default"{

}

ansible.sh


#!/bin/bash
cd /home/ubuntu
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3 get-pip.py
sudo python3 -m pip install ansible
tee -a playbook.yml > /dev/null <<EOT
- hosts: localhost
  tasks:
    - name: Instalando o python3, virtualenv
      apt:
        pkg:
          - python3
          - virtualenv
        update_cache: 'yes'
      become: 'yes'
    - name: Git Clone
      ansible.builtin.git:
        repo: 'https://github.com/guilhermeonrails/clientes-leo-api.git'
        dest: /home/ubuntu/tcc
        version: master
        force: yes
    - name: Instalando dependencias com pip(django e django Rest)
      pip:
        virtualenv: /home/ubuntu/tcc/venv
        requirements: /home/ubuntu/tcc/requirements.txt
    - name: Verificando se o projeto ja existe
      stat:
        path: /home/ubuntu/tcc/setup/settings.py
      register: projeto
    - name: Iniciando o projeto
      shell: >-
        . /home/ubuntu/tcc/venv/bin/activate; django-admin startproject setup
        /home/ubuntu/tcc/
      when: not projeto.stat.exists
    - name: Alterando o hosts do settings
      lineinfile:
        path: /home/ubuntu/tcc/setup/settings.py
        regexp: ALLOWED_HOSTS
        line: 'ALLOWED_HOSTS = ["*"]'
        backrefs: 'yes'
    - name: Instalar setuptools
      pip:
        name: setuptools
        virtualenv: /home/ubuntu/tcc/venv    
    - name: Configurando o banco de dados
      shell: '. /home/ubuntu/tcc/venv/bin/activate; python /home/ubuntu/tcc/manage.py migrate'
    - name: Carregando os dados iniciais
      shell: '. /home/ubuntu/tcc/venv/bin/activate; python /home/ubuntu/tcc/manage.py loaddata clientes.json'
    - name: Iniciando o servidor
      shell: '. /home/ubuntu/tcc/venv/bin/activate; nohup python /home/ubuntu/tcc/manage.py runserver 0.0.0.0:8000 &'  
EOT
sudo ansible-playbook playbook.yml
1 resposta

Um erro 502 (Bad Gateway) ao acessar o Load Balancer na AWS geralmente significa que o Load Balancer conseguiu se conectar à instância, mas não recebeu uma resposta válida. No contexto do seu projeto Terraform + Ansible + Django, aqui vão alguns pontos que vale checar para identificar o problema:


Aplicação realmente está rodando na porta 8000?

No ansible.sh, o Django está sendo iniciado com:

python /home/ubuntu/tcc/manage.py runserver 0.0.0.0:8000

Mas essa porta precisa estar aberta no grupo de segurança associado ao Load Balancer e à instância!

Grupo de Segurança

Você definiu este trecho:

security_group_names = [ var.grupoDeSeguranca ]

Mas não incluiu o código do security group em si. Então, confira:

  • Se o Security Group var.grupoDeSeguranca permite entrada na porta 8000.
  • O Security Group do Load Balancer também precisa permitir entrada na porta 8000 para usuários externos.

Se estiver faltando, adicione algo assim:

resource "aws_security_group" "acesso_geral" {
  name        = "acesso_geral"
  description = "Permite acesso HTTP"

  ingress {
    from_port   = 8000
    to_port     = 8000
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

E associe esse grupo nas suas instâncias:

security_group_names = [ aws_security_group.acesso_geral.name ]

Health Check do Load Balancer:

Por padrão, o Target Group faz health check em / na porta 8000`.

Mas o Django provavelmente não tem rota / (ou retorna 404), e isso pode estar marcando as instâncias como unhealthy.

Você pode alterar o health check:

resource "aws_lb_target_group" "alvoLoadBalancer" {
  name     = "maquinasAlvo"
  port     = 8000
  protocol = "HTTP"
  vpc_id   = aws_default_vpc.default.id

  health_check {
    path                = "/clientes"  # ou alguma rota válida no seu projeto
    interval            = 30
    timeout             = 5
    healthy_threshold   = 2
    unhealthy_threshold = 2
    matcher             = "200-399"
  }
}

Ve se o Django está rodando

Você pode conectar via SSH em uma das instâncias com:

ssh -i minha-chave.pem ubuntu@<ip-da-instancia>

E checar se o processo está rodando:

ps aux | grep manage.py

Se não estiver, o problema pode estar no script ansible.sh.

Erros no ansible.sh?

Esse script pode falhar em várias partes. Tente logar a saída de erro no script para facilitar o debug. Por exemplo:

nohup ansible-playbook playbook.yml > ansible.log 2>&1 &

E depois olhe o ansible.log dentro da instância:

cat ansible.log

Ve essas coisas.