

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
<a name="create-deploy-python-django"></a>

En este tutorial se explica la implementación de un sitio web de [Django](https://www.djangoproject.com/) 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:
+ [Configuración de un entorno virtual de Python e instalación de Django](#python-django-setup-venv)
+ [Creación de un proyecto de Django](#python-django-create-app)
+ [Configure su aplicación Django para Elastic Beanstalk](#python-django-configure-for-eb) 
+ [Implementación del sitio con la CLI de EB](#python-django-deploy) 
+ [Actualización de la aplicación](#python-django-update-app) 
+ [Limpieza](#python-django-stopping)

## Requisitos previos
<a name="python-django-prereq"></a>

Para seguir este tutorial, debe tener todos los [requisitos previos comunes](python-development-environment.md) de Python instalados, incluidos los siguientes paquetes:
+ Python 3.7 o posterior
+ `pip`
+ `virtualenv`
+ `awsebcli`

La instalación de la plataforma [Django](https://www.djangoproject.com/) forma parte del tutorial.

**nota**  
Para crear entornos con la CLI de EB, se requiere un [rol de servicio](concepts-roles-service.md). Puede crear un rol de servicio creando un entorno en la consola de Elastic Beanstalk. Si no cuenta con ningún rol 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
<a name="python-django-setup-venv"></a>

Cree un entorno virtual con `virtualenv` y utilícelo para instalar Django y sus dependencias. Al usar un entorno virtual, puede saber exactamente qué paquetes necesita su aplicación, de modo que los paquetes necesarios se instalen en las EC2 instancias de Amazon 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
   ```

------

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á `(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`C:\Users\USERNAME>`, aquí es donde *USERNAME* está su nombre de inicio de sesión de Windows.

1. 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](#python-django-deploy) en este tema.  
Para obtener más información sobre las versiones de plataforma de Python actuales, consulte [Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python) en el documento *AWS Elastic Beanstalk Platforms*.  
Para obtener información sobre la compatibilidad de versiones de Django con Python, consulte [¿Qué versión de Python puedo utilizar con Django?](https://docs.djangoproject.com/en/3.1/faq/install/#what-python-version-can-i-use-with-django)

1. 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
<a name="python-django-create-app"></a>

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](create-deploy-python-rds.md).

**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 son`C:\Users\USERNAME>`, dónde *USERNAME* está su nombre de inicio de sesión de Windows.

1. 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
   ```

1. Ejecute el sitio de Django localmente con `manage.py runserver`.

   ```
   (eb-virt) ~$ cd ebdjango
   ```

   ```
   (eb-virt) ~/ebdjango$ python manage.py runserver
   ```

1. En un navegador web, abra `http://127.0.0.1:8000/` para ver el sitio.

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

   ```
   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
<a name="python-django-configure-for-eb"></a>

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
   ```

------

1. Ejecute `pip freeze` y, a continuación, guarde la salida en un archivo llamado `requirements.txt`.

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

   Elastic `requirements.txt` Beanstalk utiliza para determinar qué paquete instalar EC2 en las instancias que ejecutan la aplicación.

1. Cree un directorio llamado `.ebextensions`.

   ```
   (eb-virt) ~/ebdjango$ mkdir .ebextensions
   ```

1. En el directorio `.ebextensions`, añada un [archivo de configuración](ebextensions.md) llamado `django.config` con el siguiente texto.  
**Example \$1/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.

1. 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
<a name="python-django-deploy"></a>

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](https://docs.djangoproject.com/en/2.2/topics/security/#host-headers-virtual-hosting).

**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.

1. (Opcional) **eb init** Vuelve a ejecutarlo para configurar un key pair predeterminado de forma que puedas usar SSH para conectarte a la EC2 instancia que ejecuta tu 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**.

1. 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.

1. 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`.

1. 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']
   ```

1. 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](eb3-cli-git.md).

1. 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](troubleshooting.md#troubleshooting-deployments) para intentar determinar la causa del error.

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

## Actualización de la aplicación
<a name="python-django-update-app"></a>

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.

### Modificación de la configuración del sitio
<a name="python-django-modify-site"></a>

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`.  
**Example \$1/ .py ebdjango/ebdjango/settings**  

   ```
   ...
   # 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](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).

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

   ```
   ~/ebdjango/$ eb deploy
   ```

### Creación de un administrador del sitio
<a name="python-django-create-admin"></a>

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
   ```

1. 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.
   ```

1. Para indicar a Django dónde debe almacenar los archivos estáticos, defina `STATIC_ROOT` en `settings.py`.  
**Example \$1/ .py ebdjango/ebdjango/settings**  

   ```
   # Static files (CSS, JavaScript, Images)
   # https://docs.djangoproject.com/en/2.2/howto/static-files/
   STATIC_URL = '/static/'
   STATIC_ROOT = 'static'
   ```

1. Ejecútelo `manage.py collectstatic` para rellenar el `static` directorio con activos estáticos (JavaScriptCSS e imágenes) para el sitio de administración.

   ```
   (eb-virt) ~/ebdjango$ python manage.py collectstatic
   119 static files copied to ~/ebdjango/static
   ```

1. Implementa la aplicación.

   ```
   ~/ebdjango$ eb deploy
   ```

1. 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.\]](http://docs.aws.amazon.com/es_es/elasticbeanstalk/latest/dg/images/eb_django_admin_login.png)

1. 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\]](http://docs.aws.amazon.com/es_es/elasticbeanstalk/latest/dg/images/eb_django_admin_console.png)

Puede utilizar un procedimiento similar al local updating/testing seguido **eb deploy** de. 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
<a name="python-django-migrate-site"></a>

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](ebextensions.md) denominado `db-migrate.config` con el contenido siguiente.  
**Example \$1/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.

1. Implementa la aplicación.

   ```
   ~/ebdjango$ eb deploy
   ```

## Limpieza
<a name="python-django-stopping"></a>

Para ahorrar horas de instancia y otros AWS recursos entre las sesiones de desarrollo, finalice su entorno de Elastic Beanstalk con. **eb terminate**

```
~/ebdjango$ eb terminate django-env
```

Este comando finaliza el entorno y todos los AWS recursos 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**.

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

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

## Siguientes pasos
<a name="python-django-next-steps"></a>

Para obtener más información sobre Django, como un tutorial detallado, consulte [la documentación oficial](https://docs.djangoproject.com/en/2.2/).

Si desea probar otra plataforma web de Python, consulte [Implementación de una aplicación Flask en Elastic Beanstalk](create-deploy-python-flask.md).