Implementación de una aplicación Django en Elastic Beanstalk - AWS Elastic Beanstalk

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Implementación de una aplicación Django en Elastic Beanstalk

En este tutorial se explica la implementación de un sitio web de Django autogenerado y predeterminado en un entorno de AWS Elastic Beanstalk que ejecuta Python. En este tutorial se muestra cómo alojar una aplicación web de Python en la nube mediante un entorno de Elastic Beanstalk.

En este tutorial, hará lo siguiente:

Requisitos previos

Para seguir este tutorial, debe tener todos los requisitos previos comunes de Python instalados, incluidos los siguientes paquetes:

  • Python 3.7 o posterior

  • pip

  • virtualenv

  • awsebcli

La instalación de la plataforma Django forma parte del tutorial.

nota

Para crear entornos con la CLI de EB, se requiere una función de servicio. Puede crear una función de servicio creando un entorno en la consola de Elastic Beanstalk. Si no cuenta con ninguna función de servicio, el EB CLI intentará crear uno cuando ejecute eb create.

Configuración de un entorno virtual de Python e instalación de Django

Cree un entorno virtual con virtualenv y utilícelo para instalar Django y sus dependencias. Al utilizar un entorno virtual, puede determinar exactamente qué paquetes son necesarios para la aplicación a fin de que los paquetes necesarios se instalen en las instancias Amazon EC2 que ejecutan su aplicación.

Los siguientes pasos muestran los comandos que debe especificar para sistemas basados en Unix y Windows, que aparecen en pestañas independientes.

Para configurar el entorno virtual
  1. Cree un entorno virtual llamado eb-virt.

    Unix-based systems
    ~$ virtualenv ~/eb-virt
    Windows
    C:\> virtualenv %HOMEPATH%\eb-virt
  2. Active el entorno virtual.

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    Verá (eb-virt) delante del símbolo del sistema, lo que indica que se encuentra en un entorno virtual.

    nota

    En el resto de estas instrucciones se muestra el símbolo del sistema de Linux en el directorio principal ~$. En Windows, este directorio es C:\Users\USERNAME>, donde USERNAME es su nombre de inicio de sesión de Windows.

  3. Use pip para instalar Django.

    (eb-virt)~$ pip install django==2.2
    nota

    La versión de Django que instale debe ser compatible con la versión de Python en la configuración de Elastic Beanstalk Python que elija para implementar su aplicación. Para obtener información sobre la implementación, consulte Implementación del sitio con la CLI de EB en este tema.

    Para obtener más información sobre las versiones de plataforma de Python actuales, consulte Python en el documento AWS Elastic BeanstalkPlatforms.

    Para obtener información sobre la compatibilidad de versiones de Django con Python, consulte ¿Qué versión de Python puedo utilizar con Django?

  4. Para comprobar que Django está instalado, escriba lo siguiente.

    (eb-virt)~$ pip freeze Django==2.2 ...

    Este comando enumera todos los paquetes instalados en su entorno virtual. Más adelante utilizará el resultado de este comando para configurar su proyecto para usarlo con Elastic Beanstalk.

Creación de un proyecto de Django

Ahora está preparado para crear un proyecto de Django y ejecutarlo en su equipo, utilizando el entorno virtual.

nota

Este tutorial utiliza SQLite, que es un motor de base de datos incluido en Python. La base de datos se implementa con los archivos del proyecto. Para entornos de producción, se recomienda utilizar Amazon Relational Database Service (Amazon RDS) y separarlo del entorno. Para obtener más información, consulte Adición de una instancia de base de datos de Amazon RDS a su entorno de Python de Elastic Beanstalk.

Para generar una aplicación de Django
  1. Active el entorno virtual.

    Unix-based systems
    ~$ source ~/eb-virt/bin/activate (eb-virt) ~$
    Windows
    C:\>%HOMEPATH%\eb-virt\Scripts\activate (eb-virt) C:\>

    Verá el prefijo (eb-virt) delante del símbolo del sistema, lo que indica que se encuentra en un entorno virtual.

    nota

    En el resto de estas instrucciones se muestra el símbolo del sistema de Linux ~$ en el directorio principal y el directorio principal de Linux ~/. En Windows, estos directorios son C:\Users\USERNAME>, donde USERNAME es su nombre de inicio de sesión de Windows.

  2. Utilice el comando django-admin startproject para crear un proyecto de Django llamado ebdjango.

    (eb-virt)~$ django-admin startproject ebdjango

    Este comando crea un sitio de Django estándar denominado ebdjango con la siguiente estructura de directorios.

    ~/ebdjango |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py
  3. Ejecute el sitio de Django localmente con manage.py runserver.

    (eb-virt) ~$ cd ebdjango
    (eb-virt) ~/ebdjango$ python manage.py runserver
  4. En un navegador web, abra http://127.0.0.1:8000/ para ver el sitio.

  5. Compruebe el registro del servidor para ver el resultado de la solicitud. Para detener el servidor web y volver al entorno virtual, presione Ctrl+C.

    Django version 2.2, using settings 'ebdjango.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [07/Sep/2018 20:14:09] "GET / HTTP/1.1" 200 16348 Ctrl+C

Configure su aplicación Django para Elastic Beanstalk

Ahora que ya tiene un sitio de Django en su equipo local, puede configurarlo para implementarlo con Elastic Beanstalk.

De forma predeterminada, Elastic Beanstalk busca un archivo llamado application.py para iniciar la aplicación. Como este archivo no existe en el proyecto de Django que ha creado, tendrá que realizar algunos ajustes en el entorno de su aplicación. También deberá configurar las variables de entorno para que puedan cargarse los módulos de la aplicación.

Para configurar su sitio para Elastic Beanstalk
  1. Active el entorno virtual.

    Unix-based systems
    ~/ebdjango$ source ~/eb-virt/bin/activate
    Windows
    C:\Users\USERNAME\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate
  2. Ejecute pip freeze y, a continuación, guarde la salida en un archivo llamado requirements.txt.

    (eb-virt) ~/ebdjango$ pip freeze > requirements.txt

    Elastic Beanstalk utiliza requirements.txt para determinar qué paquete se va a instalar en las instancias EC2 donde se ejecuta la aplicación.

  3. Cree un directorio llamado .ebextensions.

    (eb-virt) ~/ebdjango$ mkdir .ebextensions
  4. En el directorio .ebextensions, añada un archivo de configuración llamado django.config con el siguiente texto.

    ejemplo ~/ebdjango/.ebextensions/django.config
    option_settings: aws:elasticbeanstalk:container:python: WSGIPath: ebdjango.wsgi:application

    Esta configuración, WSGIPath, especifica la ubicación del script de WSGI que utiliza Elastic Beanstalk para iniciar su aplicación.

    nota

    Si está utilizando una versión de la plataforma Python AMI de Amazon Linux (anterior a Amazon Linux 2), reemplace el valor WSGIPath por ebdjango/wsgi.py. El valor del ejemplo funciona con el servidor WSGI de Gunicorn, que no es compatible con las versiones de la plataforma de la AMI de Amazon Linux.

  5. Desactive el entorno virtual con el comando deactivate.

    (eb-virt) ~/ebdjango$ deactivate

    Vuelva a activar su entorno virtual siempre que necesite añadir paquetes a su aplicación o ejecutar su aplicación localmente.

Implementación del sitio con la CLI de EB

Ha añadido todo lo que necesita para implementar su aplicación en Elastic Beanstalk. El directorio del proyecto debe ser similar al siguiente.

~/ebdjango/ |-- .ebextensions | `-- django.config |-- ebdjango | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py |-- db.sqlite3 |-- manage.py `-- requirements.txt

A continuación, creará el entorno de la aplicación e implementará su aplicación configurada con Elastic Beanstalk.

Inmediatamente después de la implementación, editará la configuración de Django para agregar al ajuste de Elastic Beanstalk de Django el nombre de dominio que ALLOWED_HOSTS asignó a su aplicación. A continuación, volverá a implementar la aplicación. Se trata de un requisito de seguridad de Django, diseñado para impedir los ataques de encabezado de Host HTTP. Para obtener más información, consulte Host header validation.

Para crear un entorno e implementar la aplicación de Django
nota

El tutorial utiliza la CLI de EB como un mecanismo de implementación, pero también se puede utilizar la consola de Elastic Beanstalk para implementar un archivo ZIP que incluya el contenido del proyecto.

  1. Inicialice el repositorio de la CLI de EB con el comando eb init.

    ~/ebdjango$ eb init -p python-3.7 django-tutorial Application django-tutorial has been created.

    Este comando crea una aplicación llamada django-tutorial. También configura su repositorio local para crear entornos con la última versión de la plataforma Python 3.7.

  2. (Opcional) Ejecute de nuevo eb init para configurar un par de claves predeterminadas de forma que pueda usar SSH para conectarse a la instancia EC2 donde se ejecuta la aplicación.

    ~/ebdjango$ eb init Do you want to set up SSH for your instances? (y/n): y Select a keypair. 1) my-keypair 2) [ Create new KeyPair ]

    Seleccione un par de claves si ya tiene uno o siga las instrucciones para crear uno. Si no ve el símbolo del sistema o más adelante necesita cambiar la configuración, ejecute eb init -i.

  3. Cree un entorno e implemente la aplicación en él con eb create.

    ~/ebdjango$ eb create django-env
    nota

    Si recibe un mensaje de error "service role required" (es necesario el rol de servicio), ejecute eb create interactivamente (sin especificar un nombre de entorno) y la CLI de EB creará el rol.

    Este comando crea un entorno de Elastic Beanstalk con equilibrio de carga denominado django-env. Se tarda alrededor de cinco minutos en crear el entorno. A medida que Elastic Beanstalk crea los recursos necesarios para ejecutar la aplicación, envía mensajes informativos que la CLI de EB transmite a su terminal.

  4. Cuando finalice el proceso de creación del entorno, busque el nombre de dominio de su nuevo entorno. Para ello, ejecute eb status.

    ~/ebdjango$ eb status Environment details for: django-env Application name: django-tutorial ... CNAME: eb-django-app-dev.elasticbeanstalk.com ...

    El nombre de dominio del entorno es el valor de la propiedad CNAME.

  5. Abra el archivo settings.py en el directorio ebdjango. Localice el ajuste ALLOWED_HOSTS y, a continuación, agregue el nombre de dominio de la aplicación que encontró en el paso anterior al valor del ajuste. Si no encuentra este ajuste en el archivo, agréguelo en una línea nueva.

    ... ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
  6. Guarde el archivo y, a continuación, vuelva a implementar la aplicación. Para ello, ejecute eb deploy. Cuando ejecuta eb deploy, la CLI de EB empaqueta el contenido del directorio del proyecto y lo implementa en su entorno.

    ~/ebdjango$ eb deploy
    nota

    Si utiliza Git con el proyecto, consulte Uso de la CLI de EB con Git.

  7. Cuando finalice el proceso de actualización del entorno, abra el sitio web con eb open.

    ~/ebdjango$ eb open

    Se abre una ventana del navegador con el nombre de dominio creado para su aplicación. Debería ver el mismo sitio web de Django que creó y probó localmente.

Si no ve la aplicación en ejecución o aparece un mensaje de error, consulte Solución de problemas de implementación para intentar determinar la causa del error.

En caso de que vea la aplicación en ejecución (le felicitamos en ese caso), habrá implementado la primera aplicación de Django con Elastic Beanstalk.

Actualizar la aplicación

Ahora que tiene una aplicación en ejecución en Elastic Beanstalk, puede actualizar y volver a implementar su aplicación o su configuración; Elastic Beanstalk se encargará de la tarea de actualizar sus instancias e iniciar la nueva versión de la aplicación.

Para este ejemplo, vamos a habilitar la consola de administración de Django y configurar otros ajustes.

Modificar la configuración del sitio

De forma predeterminada, el sitio web de Django utiliza la zona horaria UTC para mostrar el tiempo. Puede cambiar esta configuración especificando una zona horaria en settings.py.

Para cambiar la zona horaria del sitio
  1. Modifique el valor de TIME_ZONE en settings.py.

    ejemplo ~/ebdjango/ebdjango/settings.py
    ... # Internationalization LANGUAGE_CODE = 'en-us' TIME_ZONE = 'US/Pacific' USE_I18N = True USE_L10N = True USE_TZ = True

    Para obtener una lista de zonas horarias, visite esta página.

  2. Implemente la aplicación en su entorno Elastic Beanstalk.

    ~/ebdjango/$ eb deploy

Crear un administrador del sitio

Puede crear un administrador del sitio para su aplicación de Django que tenga acceso a la consola de administración directamente desde el sitio web. Los detalles de inicio de sesión del administrador se almacenan de forma segura en la imagen de la base de datos local incluida en el proyecto predeterminado que genera Django.

Para crear un administrador del sitio
  1. Inicialice la base de datos local de la aplicación de Django.

    (eb-virt) ~/ebdjango$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK
  2. Ejecute manage.py createsuperuser para crear un administrador.

    (eb-virt) ~/ebdjango$ python manage.py createsuperuser Username: admin Email address: me@mydomain.com Password: ******** Password (again): ******** Superuser created successfully.
  3. Para indicar a Django dónde debe almacenar los archivos estáticos, defina STATIC_ROOT en settings.py.

    ejemplo ~/ebdjango/ebdjango/settings.py
    # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = 'static'
  4. Ejecute manage.py collectstatic para rellenar el directorio static con los recursos estáticos (JavaScript, CSS e imágenes) del sitio de administración.

    (eb-virt) ~/ebdjango$ python manage.py collectstatic 119 static files copied to ~/ebdjango/static
  5. Implemente la aplicación.

    ~/ebdjango$ eb deploy
  6. Consulte la consola de administración abriendo el sitio en el navegador y añadiendo /admin/ a la dirección URL del sitio, como la siguiente.

    http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
    Escriba el nombre de usuario y la contraseña que creó en el paso 2 para iniciar sesión en la consola de administración.
  7. Inicie sesión con el nombre de usuario y la contraseña que ha configurado en el paso 2.

    La consola de administración de Django para su sitio web de Django implementa con Elastic Beanstalk

Puede utilizar un procedimiento similar de actualización/pruebas locales seguido de eb deploy. Elastic Beanstalk se encarga de la tarea de actualizar los servidores en directo, para que usted pueda centrarse en el desarrollo de la aplicación en lugar de en la administración del servidor.

Añadir un archivo de configuración de migración de la base de datos

Puede añadir comandos a su script .ebextensions que se ejecuten cuando se actualice el sitio. Esto le permite generar automáticamente migraciones de base de datos.

Para añadir un paso de migración cuando se implemente su aplicación
  1. Cree un archivo de configuración denominado db-migrate.config con el contenido siguiente.

    ejemplo ~/ebdjango/.ebextensions/db-migrate.config
    container_commands: 01_migrate: command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate" leader_only: true option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: ebdjango.settings

    Este archivo de configuración activa el entorno virtual del servidor y ejecuta el comando manage.py migrate durante el proceso de implementación, antes de iniciar la aplicación. Como se ejecuta antes de iniciar la aplicación, deberá configurar la variable de entorno DJANGO_SETTINGS_MODULE explícitamente (normalmente wsgi.py se encarga de todo esto por usted durante el inicio). La especificación de leader_only: true en el comando garantiza que se ejecute solo una vez cuando realice la implementación en varias instancias.

  2. Implemente la aplicación.

    ~/ebdjango$ eb deploy

Limpieza

Para ahorrar horas de instancias y otros recursos de AWS entre las sesiones de implementación, termine el entorno de Elastic Beanstalk con eb terminate.

~/ebdjango$ eb terminate django-env

Este comando finaliza el entorno y todos los recursos de AWS que se ejecutan en él. No elimina la aplicación. Al contrario, podrá crear más entornos con la misma configuración siempre que quiera ejecutando de nuevo eb create. Para obtener más información sobre los comandos de la CLI de EB, consulte Administración de entornos de Elastic Beanstalk con la CLI de EB.

Si ha terminado de trabajar con la aplicación de ejemplo, puede eliminar también la carpeta del proyecto y el entorno virtual.

~$ rm -rf ~/eb-virt ~$ rm -rf ~/ebdjango

Siguientes pasos

Para obtener más información sobre Django, como un tutorial detallado, consulte la documentación oficial.

Si desea probar otra plataforma web de Python, consulte Implementación de una aplicación Flask en Elastic Beanstalk.