Criação e Deploy de API REST Django na AWS

Como criar API REST Django e publicar na AWS
Voltar

Material complementar:

  • Conteúdo no YouTube: Acesse em breve
  • Conteúdo no GitHub: Acesse
  • Curso gratuito na Udemy (Criação e Deploy de API REST Django na AWS): Acesse

Conceito:

Criação de projeto backend API REST com Django REST Framework, utilizando ViewSets e Routers. Publicação (deploy) em cloud Amazon Web Services (AWS). Consumo da API REST com Postman. Pré-requisitos são conta gratuita no Postman e na AWS. Será utilizado serviço free tier AWS EC2 (gratuito). API REST conciste em CRUD de loft em Londres.


API REST Django:

  1. Instalar Django: pip3 install django djangorestframework django-cors-headers --break-system-packages
  2. Criar projeto e app: django-admin startproject loft_api && cd loft_api && python manage.py startapp lofts
  3. Editar loft_api/settings.py, complementando com códigos:
    
    INSTALLED_APPS = [
        # Outro conteúdo
        "rest_framework",
        "corsheaders",
        "lofts",
    ]
    
    MIDDLEWARE = [
        # Outro conteúdo
        "corsheaders.middleware.CorsMiddleware",
    ]
    
    CORS_ALLOW_ALL_ORIGINS = True
    
    REST_FRAMEWORK = {
        "DEFAULT_RENDERER_CLASSES": [
            "rest_framework.renderers.JSONRenderer",
        ],
        "DEFAULT_PARSER_CLASSES": [
            "rest_framework.parsers.JSONParser",
        ]
    }
    
  4. Em lofts/models.py, criar model Loft:
    
    from django.db import models
    
    class Loft(models.Model):
        title = models.CharField(max_length=50)
        description = models.CharField(max_length=255)
        address = models.CharField(max_length=50)
        price = models.DecimalField(max_digits=10, decimal_places=2)
    
        def __str__(self):
            return self.title
    
  5. Em lofts/serializers.py, informar serializadores:
    
    from rest_framework import serializers
    from .models import Loft
    
    class LoftSerializer(serializers.ModelSerializer):
        class Meta:
            model = Loft
            fields = '__all__'
    
  6. Em lofts/views.py, informar ViewSet de loft:
    
    from rest_framework import viewsets
    from .models import Loft
    from .serializers import LoftSerializer
    
    class LoftViewSet(viewsets.ModelViewSet):
        queryset = Loft.objects.all()
        serializer_class = LoftSerializer
    
  7. Em lofts/urls.py, informar rotas locais:
    
    from rest_framework.routers import DefaultRouter
    from .views import LoftViewSet
    
    router = DefaultRouter()
    router.register(r'lofts', LoftViewSet, basename='loft')
    
    urlpatterns = router.urls
    
  8. Em loft_api/urls.py, informar rotas globais:
    
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/', include('lofts.urls')),
    ]
    
  9. Na pasta raíz do projeto, criar e executar banco de dados:
    • python manage.py makemigrations
    • python manage.py migrate
  10. Executar projeto: python manage.py runserver 0.0.0.0:8000

Deploy na AWS:

Publicar projeto (deploy) na cloud Amazon Web Services (AWS), gratuitamente, via recursos AWS free tier. Criação de instância EC2 (máquina Ubuntu CLI) contendo projeto Django REST API acima, baixado via GitHub. Passo a passo na AWS:


--- CRIAR INSTÂNCIA EC2 ---
EC2 / Instâncias / Executar instâncias
- Nome: ubuntuDjangoLoft
- AMI: Ubuntu Server (nível gratuito)
- Tipo: t3.micro (verificar se região é t2 ou t3 nível gratuito)
- Criar par de chaves:
-- Nome: keyDjangoLoft1
-- Tipo: RSA
-- Formato: conforme SO de sua máquina
Criar par de chaves / Baixar par de chaves
- Rede:
-- Atribuir IP público automaticamente: habilitar
-- Criar grupo de segurança (nome 'grupoDjangoLoft'), com regras de entrada:
--- Permitir tráfego Tipo HTTP, Intervalo de Portas 80, Origem qualquer lugar (0.0.0.0/0)
--- Permitir tráfego Tipo HTTPS, Intervalo de Portas 443, Origem qualquer lugar (0.0.0.0/0)
--- Permitir tráfego Tipo SSH, Intervalo de Portas 22, Origem qualquer lugar (0.0.0.0/0)
--- Permitir tráfego Tipo TCP, Intervalo de Portas 8000, Origem qualquer lugar (0.0.0.0/0)
- Armazenamento: 8GiB, com gp3 (padrão, nível gratuito)
Executar instância

Selecionar instância / Conectar
- Connection type: IP público
- Endereço IPv4 público: selecionar
Conectar

--- DENTRO DA INSTÂNCIA EC2 ---
Executar comandos:
- sudo apt update && sudo apt install python3-pip npm python3-venv git -y && sudo pip3 install django djangorestframework django-filter django-cors-headers --break-system-packages
- git clone https://github.com/mateusschwede/loft_api.git
- cd loft_api/loft_api/
- python3 manage.py migrate
- nano loft_api/settings.py (inserir conteúdo extra no arquivo):
ALLOWED_HOSTS = [
    'ec2-54-233-2-156.sa-east-1.compute.amazonaws.com', // DNS pública da instância EC2
    '18.231.73.21' // IPv4 pública da instância EC2
    'localhost',
    '127.0.0.1',
] // Ou troque o conteúdo para '*' se quiser permitir acesso total
- python3 manage.py runserver 0.0.0.0:8000 // ou com '&' no final, para funcionar em segundo plano

Acessar instância:

  • No browser: http://ipv4_instancia:8000/api/lofts/
  • Postman (Adicionar Loft):
    • Método: POST
    • URL: http://ipv4_instancia:8000/api/lofts/
    • Body (raw JSON):
      
      {
          "title": "Loft Londrino UB Social 1",
          "description": "Loft Londrino UB Social 1, com vista para London Tower",
          "address": "Rua X, número yyy, Londres - UK",
          "price": 862000.94
      }
      
    • Executar (Send)
  • Postman (Listar Lofts):
    • Método: GET
    • URL: http://ipv4_instancia:8000/api/lofts/
    • Executar (Send)
  • Postman (Ver Loft específico):
    • Método: GET
    • URL: http://ipv4_instancia:8000/api/lofts/ID-LOFT/
    • Executar (Send)
  • Postman (Editar Loft):
    • Método: PUT
    • URL: http://ipv4_instancia:8000/api/lofts/ID-LOFT/
    • Body (raw JSON):
      
      {
          "title": "Loft Londrino UB Social ATUALIZADO",
          "description": "Loft Londrino UB Social 1, com vista para London Tower",
          "address": "Rua X, número yyy, Londres - UK",
          "price": 862000.94
      }
      
    • Executar (Send)
  • Postman (Deletar Loft):
    • Método: DELETE
    • URL: http://ipv4_instancia:8000/api/lofts/ID-LOFT/
    • Executar (Send)

Elaborado por Mateus Schwede
ubsocial.github.io