Implementaci贸n de aplicaciones de Django en AWS EC2 con Docker

    Introducci贸n

    En el acelerado campo de las aplicaciones web, la contenedorizaci贸n se ha convertido no solo en algo com煤n, sino en el modo preferido de empaquetar y entregar aplicaciones web. Los contenedores nos permiten empaquetar nuestras aplicaciones e implementarlas en cualquier lugar sin tener que reconfigurar o adaptar nuestras aplicaciones a la plataforma de implementaci贸n.

    A la vanguardia de la contenerizaci贸n est谩 Estibador, que es una herramienta que se utiliza para empaquetar y ejecutar aplicaciones en contenedores que son independientes de la plataforma. La tecnolog铆a sin servidor tambi茅n est谩 floreciendo en esta era de contenedorizaci贸n y est谩 demostrando ser la opci贸n preferida para los desarrolladores cuando implementan sus aplicaciones con m谩s y m谩s proveedores que permiten a los usuarios implementar software en contenedores.

    Si bien la creaci贸n de una aplicaci贸n es importante, ponerla a disposici贸n de los usuarios finales tambi茅n es una parte crucial del producto. En esta publicaci贸n, empaquetaremos una aplicaci贸n Django usando Docker y la implementaremos en EC2 de Amazon.

    驴Qu茅 es EC2?

    De Amazon Nube inform谩tica el谩stica (EC2) es una oferta que permite a los desarrolladores aprovisionar y ejecutar sus aplicaciones creando instancias de m谩quinas virtuales en la nube. EC2 tambi茅n ofrece escalado autom谩tico donde los recursos se asignan en funci贸n de la cantidad de tr谩fico recibido.

    Al igual que cualquier otra oferta de AWS, EC2 se puede integrar f谩cilmente con los otros servicios de Amazon, como el Servicio de cola simple (SQS), o Simple Storage Service (S3), entre otros.

    EC2 tiene las siguientes caracter铆sticas:

    • Instancias: Entornos o servidores inform谩ticos virtuales que permiten a los desarrolladores ejecutar sus aplicaciones. Estas instancias se pueden configurar en t茅rminos de memoria, almacenamiento, potencia inform谩tica y recursos de red para adaptarse a la necesidad o escenario actual.
    • Im谩genes de la m谩quina de Amazon (AMI): plantillas preconfiguradas que se utilizan para crear instancias. Vienen con sistemas operativos y software precargado seg煤n sea necesario y son personalizables.
    • Vol煤menes de almac茅n de instancias: Se utiliza para almacenar datos temporalmente. Estos datos se eliminan cuando se termina la instancia.
    • Tienda de bloques el谩sticos (EBS) Vol煤menes: vol煤menes de almacenamiento confiables y de alta disponibilidad que se adjuntan a instancias con el fin de almacenar datos de manera persistente. Los datos almacenados en EBS Volumes sobreviven a las instancias y se pueden montar varios vol煤menes en una instancia.
    • Grupos de seguridad: Firewalls virtuales que gobiernan el acceso a las instancias especificando protocolos, rangos de direcciones IP y puertos. Esto nos permite controlar y restringir el tr谩fico a nuestras instancias.

    Estas son solo algunas de las caracter铆sticas de Elastic Compute Cloud de Amazon y se pueden encontrar m谩s en la documentaci贸n.

    Prerrequisitos

    En este tutorial, crearemos una aplicaci贸n web y la implementaremos en el servicio EC2 de Amazon. Para lograr eso necesitamos:

    • Un Servicios web de Amazon (AWS) que nos dar谩 acceso a EC2. Mediante este enlace, puede registrarse en el nivel gratuito que es suficiente para el trabajo en esta publicaci贸n.
    • Python 3.6+, Pip y Virtualenv instalado para construir nuestra aplicaci贸n Django.
    • Estibador Tambi茅n ser谩 necesario empaquetar nuestra aplicaci贸n y ejecutarla f谩cilmente en un contenedor que no solo sea port谩til, sino que pueda ejecutarse en cualquier lugar donde est茅 instalado Docker.

    Dockerizar una aplicaci贸n Django

    Comenzaremos construyendo nuestra sencilla aplicaci贸n Django y coloc谩ndola en contenedores para permitirnos implementarla f谩cilmente. Comencemos creando una carpeta para nuestro proyecto:

    $ mkdir django_ec2 && cd $_
    

    Luego un entorno virtual:

    $ virtualev --python=python3 env --no-site-packages
    

    Entonces, activ茅moslo e instalemos Django:

    $ source env/bin/activate
    $ pip install Django
    

    Una simple aplicaci贸n Django de marcador de posici贸n ser谩 suficiente. Todo lo que tenemos que hacer para arrancar el proyecto es ejecutar django-admines startproject comando, que inicia un proyecto b谩sico para el nombre de directorio dado:

    $ django-admin startproject django_ec2_project
    

    Luego, ingresemos al directorio del proyecto:

    $ cd django_ec2_project
    

    E inicie un servidor de desarrollo ligero:

    $ python manage.py runserver
    

    Si todo va bien, deber铆amos poder ver la siguiente p谩gina de destino cuando accedamos a nuestra aplicaci贸n en localhost:8000:

    Antes de empaquetar nuestra aplicaci贸n Django, debemos permitir el tr谩fico a todas las fuentes, lo que podemos lograr modificando el ALLOWED_HOSTS instal谩ndose django_ec2_project/django_ec2_project/settings.py:

    # Add the asterisk in the empty list
    ALLOWED_HOSTS = ['*']
    

    Nota: No es recomendable dejar un comod铆n en un entorno de producci贸n. Utilice el dominio de su propio sitio de producci贸n en lugar de este.

    Dado que esto es suficiente para ser implementado, sigamos adelante y organicemos nuestra aplicaci贸n en contenedores agregando un Dockerfile en la ra铆z de nuestro proyecto que contiene lo siguiente:

    FROM python:3.6-alpine
    
    MAINTAINER Robley Gori <ro6ley.github.io>
    
    EXPOSE 8000
    
    RUN apk add --no-cache gcc python3-dev musl-dev
    
    ADD . /django_ec2
    
    WORKDIR /django_ec2
    
    RUN pip install -r requirements.txt
    
    RUN python django_ec2_project/manage.py makemigrations
    
    RUN python django_ec2_project/manage.py migrate
    
    CMD [ "python", "django_ec2_project/manage.py", "runserver", "0.0.0.0:8000" ]
    

    Este Dockerfile describe c贸mo se colocar谩 en contenedores y se ejecutar谩 nuestra aplicaci贸n. En la parte superior, usamos una imagen base que viene con Python 3.6 instalado. Tambi茅n exponemos el puerto 8000, lo que significa que el tr谩fico hacia el contenedor debe dirigirse a ese puerto, que es tambi茅n desde donde se ejecutar谩 nuestra aplicaci贸n Django. Instalamos algunos paquetes en nuestra imagen y luego agregamos nuestra aplicaci贸n Django al django_ec2 directorio.

    Dado que nuestro proyecto Django est谩 en contenedores, no necesitaremos crear un entorno virtual ya que ya est谩 aislado de la m谩quina que lo ejecutar谩. Por lo tanto, instalamos los requisitos directamente y ejecutamos las migraciones.

    Al final, agregamos el comando que se ejecutar谩 cuando se inicie el contenedor, que en nuestro caso tambi茅n iniciar谩 nuestra aplicaci贸n Django y la ejecutar谩 en el puerto 8000.

    Si desea una explicaci贸n m谩s detallada sobre este tema, consulte nuestro art铆culo Dockerizing Python Applications.

    El siguiente paso ser谩 crear nuestra imagen de Docker usando el Dockerfile anterior. Antes de eso, guardaremos las dependencias instaladas en el entorno en un archivo:

    $ pip freeze > requirements.txt
    

    Y solo entonces, construyamos la imagen de la ventana acoplable:

    $ docker build . -t django_ec2
    

    Mediante este comando, Docker buscar谩 nuestro Dockerfile en la carpeta actual y lo usar谩 para construir una imagen, que ser谩 etiquetada como django_ec2. Una vez que nuestra imagen est谩 construida, podemos ejecutarla usando el comando:

    $ docker run -d -p 8000:8000 django_ec2
    

    Este comando iniciar谩 nuestro contenedor que tiene nuestra aplicaci贸n Django en ejecuci贸n y mapear谩 el puerto 8000 en nuestra m谩quina al puerto del contenedor 8000, seg煤n lo especificado por el -p bandera y se ejecutar谩 sin cabeza (incluso despu茅s de cerrar la terminal) seg煤n lo especificado por el -d bandera.

    Deber铆amos ser recibidos por la misma p谩gina de destino de Django cuando navegamos a localhost:8000 una vez m谩s, solo que esta vez estaremos accediendo a la aplicaci贸n en el contenedor Docker en lugar de a la de nuestra m谩quina local.

    Con nuestra imagen lista, necesitamos publicarla en Dockerhub para facilitar el proceso de implementaci贸n en EC2.

    Dockerhub es un registro de im谩genes listas para usar que permite a los usuarios crear y compartir im谩genes personalizadas de Docker para todos los prop贸sitos. Tambi茅n nos permite publicar nuestras im谩genes para poder acceder a ellas en otras plataformas como AWS. En nuestro caso, publicaremos nuestra imagen en Dockerhub y luego la colocaremos en EC2 para su implementaci贸n.

    Para publicar nuestra imagen, necesitamos crea una cuenta en Dockerhub primero e inicie sesi贸n en nuestro terminal:

    $ docker login
    

    Una vez que haya iniciado sesi贸n, necesitaremos etiquetar nuestra imagen con nuestro nombre de usuario y luego enviarla a Dockerhub:

    $ docker tag django_ec2 <DOCKERHUB_USERNAME>/django_ec2
    $ docker push <DOCKERHUB_USERNAME>/django_ec2
    

    Con esto, estamos listos para el siguiente paso, que es implementar nuestra aplicaci贸n en Elastic Compute Cloud de Amazon.

    Implementaci贸n en EC2

    Con nuestra imagen de Docker lista y publicada en Dockerhub, ahora podemos iniciar sesi贸n en la consola de nuestra cuenta de AWS y en el Panel de control EC2, podemos crear una nueva instancia, lo que se logra mediante una serie de pasos.

    Elija la AMI

    El primer paso consiste en seleccionar una imagen de m谩quina de Amazon (AMI) que se utilizar谩 para crear nuestra instancia. Se nos presentan opciones que incluyen Red Hat, Ubuntu Server y Windows Server.

    Para esta demostraci贸n, necesitaremos una imagen personalizada para ejecutar contenedores y barcos con Docker. Para encontrarlo, escriba ECS en la barra de b煤squeda:

    El Amazon Linux 2 optimizado para Amazon ECS es ideal para nuestro escenario y es el que elegiremos.

    Elija el tipo de instancia

    Despu茅s de elegir la AMI para nuestra instancia, ahora tenemos que elegir un tipo de instancia. Nuestra elecci贸n aqu铆 dictar谩 la cantidad de recursos que tendr谩 nuestra instancia en t茅rminos de CPU, memoria, almacenamiento y capacidad de rendimiento de la red.

    Dado que estamos en la capa gratuita de AWS, seguiremos adelante y utilizaremos la t2.micro instancia, que est谩 pensada para instancias de uso general y viene con 1 CPU virtual y 1 GiB de memoria.

    La lista contiene tipos de instancias m谩s potentes y otras est谩n optimizadas para potencia inform谩tica, memoria o almacenamiento.

    Configurar instancia

    Ahora que hemos elegido el tipo de instancia, el siguiente paso nos permite especificar algunos detalles m谩s sobre nuestra instancia, incluida la cantidad de instancias que se lanzar谩n en un momento dado, opciones de red y sistemas de archivos, entre otros detalles. No realizaremos ning煤n cambio en las opciones predeterminadas en este paso.

    Agregar almacenamiento

    El cuarto paso consiste en agregar y especificar los detalles de almacenamiento para nuestra instancia. Esta secci贸n nos permite agregar vol煤m

    Etiquetas: