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

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

Flask es un marco de aplicaciones web de código abierto para Python. En este tutorial se detalla el proceso de generación de una aplicación Flask y su implementación en un entorno de AWS Elastic Beanstalk.

En este tutorial, hará lo siguiente:

Prerequisites

Este tutorial asume que tiene conocimiento de las operaciones básicas de Elastic Beanstalk y de la consola de Elastic Beanstalk. Si aún no lo ha hecho, siga las instrucciones que se indican en Introducción a Elastic Beanstalk para lanzar su primer entorno de Elastic Beanstalk.

Para seguir los procedimientos de esta guía, necesitará un shell o un terminal de línea de comando donde pueda ejecutar los comandos. Los comandos aparecen en listas y van precedidos del símbolo del sistema ($) y del nombre del directorio actual, si es aplicable.

~/eb-project$ this is a command this is output

En Linux y macOS, puede utilizar el administrador de shell y paquetes preferido. En Windows 10, puede instalar Windows Subsystem para Linux para obtener una versión de Ubuntu y Bash integrada con Windows.

Flask requiere Python 3.6 o posterior. En este tutorial, vamos a utilizar Python 3.6 y la versión de la plataforma Elastic Beanstalk correspondiente. Instale Python; para ello, siga las instrucciones de Configuración del entorno de desarrollo de Python.

La instalación del marco de Flask forma parte del tutorial.

En este tutorial también se utiliza la interfaz de línea de comandos de Elastic Beanstalk (CLI de EB). Para obtener detalles sobre la instalación y configuración de la CLI de EB, consulte Instalación de la CLI de EB y Configuración de la CLI de EB.

Configuración de un entorno virtual Python con Flask

Cree un directorio de proyecto y un entorno virtual para su aplicación e instale Flask.

Para configurar el entorno del proyecto

  1. Cree el directorio del proyecto.

    ~$ mkdir eb-flask ~$ cd eb-flask
  2. Cree y active un entorno virtual llamado virt:

    ~/eb-flask$ virtualenv virt ~$ source virt/bin/activate (virt) ~/eb-flask$

    Verá (virt) delante del símbolo del sistema, lo que indica que se encuentra en un entorno virtual. Utilice el entorno virtual para el resto de este tutorial.

  3. Instale Flask con pip install:

    (virt)~/eb-flask$ pip install flask==1.1.2
  4. Consulte las bibliotecas instaladas con pip freeze:

    (virt)~/eb-flask$ pip freeze click==7.1.2 Flask==1.1.2 itsdangerous==1.1.0 Jinja2==2.11.3 MarkupSafe===1.1.1 Werkzeug==1.0.1

    Este comando enumera todos los paquetes instalados en su entorno virtual. Debido a que se encuentra en un entorno virtual, no se muestran los paquetes instalados globalmente como la CLI de EB.

  5. Guarde la salida de pip freeze en un archivo llamado requirements.txt.

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

    Este archivo indica a Elastic Beanstalk que instale las bibliotecas durante la implementación. Para obtener más información, consulte Especificar dependencias mediante un archivo de requisitos.

Creación de una aplicación Flask

A continuación, vamos a crear una aplicación que implementará con Elastic Beanstalk. Crearemos el servicio web RESTful "Hello World".

En este directorio, cree un nuevo archivo de texto llamado application.py con el contenido siguiente:

ejemplo ~/eb-flask/application.py

from flask import Flask # print a nice greeting. def say_hello(username = "World"): return '<p>Hello %s!</p>\n' % username # some bits of text for the page. header_text = ''' <html>\n<head> <title>EB Flask Test</title> </head>\n<body>''' instructions = ''' <p><em>Hint</em>: This is a RESTful web service! Append a username to the URL (for example: <code>/Thelonious</code>) to say hello to someone specific.</p>\n''' home_link = '<p><a href="/">Back</a></p>\n' footer_text = '</body>\n</html>' # EB looks for an 'application' callable by default. application = Flask(__name__) # add a rule for the index page. application.add_url_rule('/', 'index', (lambda: header_text + say_hello() + instructions + footer_text)) # add a rule when the page is accessed with a name appended to the site # URL. application.add_url_rule('/<username>', 'hello', (lambda username: header_text + say_hello(username) + home_link + footer_text)) # run the app. if __name__ == "__main__": # Setting debug to True enables debug output. This line should be # removed before deploying a production app. application.debug = True application.run()

En este ejemplo, se imprime un saludo personalizado que varía en función de la ruta utilizada para obtener acceso al servicio.

nota

Si se agrega application.debug = True antes de ejecutar la aplicación, se habilitará la salida de depuración en caso de que se produzca algún error. Esta es una práctica recomendada cuando se realizan tareas de desarrollo. Sin embargo, las instrucciones de depuración deben eliminarse en el código de producción, ya que la salida de depuración puede desvelar aspectos internos de la aplicación.

Si utiliza application.py como nombre de archivo y proporciona un objeto application al que se pueda llamar (en este caso, el objeto Flask), Elastic Beanstalk podrá encontrar fácilmente el código de la aplicación.

Ejecute application.py con Python:

(virt) ~/eb-flask$ python application.py * Serving Flask app "application" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 313-155-123

Abra http://127.0.0.1:5000/ en el navegador web. Debería aparecer la página de índice de la aplicación en ejecución:

Compruebe el registro del servidor para ver el resultado de la solicitud. Si desea detener el servidor web y volver al entorno virtual, escriba Ctrl+C.

Si aparece la salida de depuración, solucione los errores y asegúrese de que la aplicación está ejecutándose en local antes de configurarla para Elastic Beanstalk.

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:

~/eb-flask/ |-- virt |-- application.py `-- requirements.txt

Sin embargo, la carpeta virt, no es obligatoria para que la aplicación se ejecute en Elastic Beanstalk. Al realizar la implementación, Elastic Beanstalk crea un nuevo entorno virtual en las instancias de servidor e instala las bibliotecas indicadas en requirements.txt. Para minimizar el tamaño del paquete de código fuente que cargue durante la implementación, agregue un archivo .ebignore que le indique a la CLI de EB que omita la carpeta virt.

ejemplo ~/Eb-flask/.ebignore

virt

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

Para crear un entorno e implementar la aplicación de Flask

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

    ~/eb-flask$ eb init -p python-3.6 flask-tutorial --region us-east-2 Application flask-tutorial has been created.

    Este comando crea una nueva aplicación llamada flask-tutorial y configura el repositorio local para crear entornos con la última versión de la plataforma Python 3.6.

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

    ~/eb-flask$ 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 tiene uno o siga las instrucciones para crear una nuevo par de claves. 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:

    ~/eb-flask$ eb create flask-env

El entorno tarda unos cinco minutos en crearse e incluye los recursos siguientes:

  • EC2 Instance (Instancia de EC2): una máquina virtual de Amazon Elastic Compute Cloud (Amazon EC2) configurada para ejecutar aplicaciones web en la plataforma que elija.

    Cada plataforma ejecuta un conjunto específico de software, archivos de configuración y scripts compatibles con una determinada versión de lenguaje, marco de trabajo y contenedor web (o una combinación de estos). La mayoría de las plataformas utilizan Apache o nginx como un proxy inverso que se sitúa delante de la aplicación web, reenvía las solicitudes a esta, administra los recursos estáticos y genera registros de acceso y errores.

    importante

    El certificado de firma cruzada DST Root CA X3 de Let’s Script venció el 30 de septiembre de 2021. Debido a esto, es posible que los entornos Beanstalk que se ejecutan en los sistemas operativos Amazon Linux 2 y Amazon Linux AMI no puedan conectarse a los servidores mediante los certificados de Let's Encrypt.

    El 3 de octubre de 2021, Elastic Beanstalk lanzó nuevas versiones de plataforma para Amazon Linux AMI y Amazon Linux 2 con los certificados de entidad de certificación actualizados. Para recibir estas actualizaciones y solucionar este problema, active las Actualizaciones administradas o actualice sus plataformas manualmente. Para obtener más información, consulte las notas de la versión de la actualización de la plataforma en la Notas de la versión de AWS Elastic Beanstalk.

    También puede aplicar las soluciones alternativas manuales descritas en este Artículo del Centro de conocimientos de AWS. Dado que Elastic Beanstalk provee a la AMI GUID bloqueados, le recomendamos que utilice el comando sudo yum install en el artículo. También puede utilizar el comando sudo sed en el artículo si prefiere modificar manualmente el sistema en su lugar.

  • Instance security group (Grupo de seguridad de la instancia): grupo de seguridad de Amazon EC2 configurado para permitir el tráfico entrante en el puerto 80. Este recurso permite que el tráfico HTTP procedente del balanceador de carga llegue a la instancia EC2 en la que se ejecuta la aplicación web. De forma predeterminada, el tráfico no está permitido en otros puertos.

  • Load balancer (Balanceador de carga): balanceador de carga de Elastic Load Balancing configurado para distribuir solicitudes a las instancias que se ejecutan en la aplicación. Los balanceadores de carga también permiten que las instancias no estén expuestas directamente a Internet.

  • Load balancer security group (Grupo de seguridad del balanceador de carga): grupo de seguridad de Amazon EC2 configurado para permitir el tráfico entrante en el puerto 80. Este recurso permite que el tráfico HTTP procedente de Internet llegue al balanceador de carga. De forma predeterminada, el tráfico no está permitido en otros puertos.

  • Auto Scaling group (Grupo de Auto Scaling): grupo de Auto Scaling configurado para reemplazar una instancia si termina o deja de estar disponible.

  • Amazon S3 bucket (Bucket de Amazon S3): ubicación de almacenamiento para el código fuente, los registros y otros artefactos que se crean al utilizar Elastic Beanstalk.

  • Alarmas de Amazon CloudWatch: dos alarmas de CloudWatch que supervisan la carga de las instancias del entorno y que se activan si la carga es demasiado alta o demasiado baja. Cuando se activa una alarma, en respuesta, el grupo de Auto Scaling aumenta o reduce los recursos.

  • Pila de AWS CloudFormation. Elastic Beanstalk utiliza AWS CloudFormation para lanzar los recursos en su entorno y propagar los cambios de configuración. Los recursos se definen en una plantilla que puede verse en la consola de AWS CloudFormation.

  • Domain name (Nombre de dominio): nombre de dominio que direcciona el tráfico a la aplicación web con el formato subdominio.región.elasticbeanstalk.com.

Todos estos recursos los administra Elastic Beanstalk. Cuando termina su entorno, Elastic Beanstalk termina todos los recursos que este contiene.

nota

El bucket de Amazon S3 que Elastic Beanstalk crea se comparte entre los entornos y no se elimina durante la terminación del entorno. Para obtener más información, consulte Usar Elastic Beanstalk con Amazon S3.

Cuando finalice el proceso de creación del entorno, abra el sitio web con eb open:

~/eb-flask$ eb open

Se abrirá una ventana del navegador con el nombre de dominio creado para su aplicación. Debería ver el mismo sitio web de Flask que creó y probó en local.

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 Flask con Elastic Beanstalk.

Cleanup

Cuando termine de trabajar con Elastic Beanstalk, puede terminar su entorno. Elastic Beanstalk termina todos los recursos de AWS asociados al entorno, tales como las instancias de Amazon EC2, las instancias de base de datos, los equilibradores de carga, los grupos de seguridad y las alarmas.

Para terminar su entorno de Elastic Beanstalk

  1. Abra la consola de Elastic Beanstalk y, en la lista Regions (Regiones), seleccione su región de AWS.

  2. En el panel de navegación, elija Environments (Entornos) y, a continuación, elija el nombre del entorno en la lista.

    nota

    Si tiene muchos entornos, utilice la barra de búsqueda para filtrar la lista de entornos.

  3. Elija Environment actions (Acciones de entorno) y, a continuación, Terminate environment (Terminar entorno).

  4. Utilice el cuadro de diálogo en pantalla para confirmar la terminación del entorno.

Con Elastic Beanstalk, puede crear fácilmente un nuevo entorno para su aplicación en cualquier momento.

O, con la CLI de EB:

~/eb-flask$ eb terminate flask-env

Pasos siguientes

Para obtener más información acerca de Flask, visite flask.pocoo.org.

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