Desarrollo de aplicaciones Python sin servidor con AWS Chalice

    Introducci贸n

    En el desarrollo de software, estamos constantemente creando soluciones para los usuarios finales que resuelven un problema en particular o facilitan / automatizan un determinado proceso. Por lo tanto, dise帽ar y construir el software no es la 煤nica parte del proceso, ya que tenemos que poner el software a disposici贸n de los usuarios previstos.

    Para las aplicaciones basadas en web, la implementaci贸n es un aspecto muy importante y parte del proceso, ya que la aplicaci贸n no solo debe funcionar, sino que tambi茅n debe funcionar para muchos usuarios al mismo tiempo y estar altamente disponible.

    Algunas de las opciones de implementaci贸n que tenemos a nuestra disposici贸n incluyen comprar nuestro propio hardware de servidor e implementar nuestras aplicaciones o alquilar espacio de servidor en otras empresas. Esto tiene un costo no solo de los recursos necesarios para adquirirlos, sino tambi茅n de los costos de mantenimiento y del personal para monitorear los recursos del servidor.

    驴Qu茅 pasar铆a si pudi茅ramos hacer que nuestra aplicaci贸n estuviera disponible sin tener que preocuparnos por aprovisionar servidores o mantenerlos? Nuestra agilidad y entrega mejorar铆an enormemente.

    Podemos lograr esto a trav茅s de una plataforma inform谩tica sin servidor como AWS Lambda, que est谩 disponible por Servicios web de Amazon.

    驴Qu茅 es la inform谩tica sin servidor?

    Los proveedores de la nube ofrecen diferentes soluciones para implementar y ejecutar aplicaciones, una de ellas es la inform谩tica sin servidor. En esta arquitectura, el proveedor de la nube aloja sus aplicaciones y asume las responsabilidades de la gesti贸n del servidor en t茅rminos de software y hardware. Piense en ello como una infraestructura como servicio (IaaS).

    El proveedor de la nube se encarga del escalado, la disponibilidad, el mantenimiento del servidor y la configuraci贸n, entre otras cosas, de modo que, como desarrolladores, nuestro enfoque est谩 completamente en nuestro c贸digo. Esto, a su vez, reduce la sobrecarga necesaria para que nuestras aplicaciones se ejecuten y est茅n disponibles para nuestros usuarios finales.

    La computaci贸n sin servidor tiene sus ventajas, pero tambi茅n presenta algunos inconvenientes, como que el desarrollador se limita a las opciones o herramientas que utiliza el proveedor para fines como el registro, el seguimiento y la supervisi贸n, y el desarrollador no puede utilizar sus propias herramientas. Adem谩s, como desarrollador, est谩 atado a la disponibilidad del proveedor, si experimentan problemas o interrupciones, nuestra aplicaci贸n tambi茅n se ver谩 afectada.

    AWS es un proveedor de nube l铆der que ofrece inform谩tica sin servidor a trav茅s de AWS Lambda. Este es un tiempo de ejecuci贸n de computaci贸n sin servidor que permite a los desarrolladores ejecutar su c贸digo en respuesta a ciertos eventos de los usuarios, como hacer una solicitud o cargar archivos en un Cubo S3.

    Este servicio tambi茅n nos permite pagar solo por los recursos inform谩ticos que utilizamos en lugar de un costo general por los servicios. Esto sucede a trav茅s de una funci贸n Lambda que escala para adaptarse a la escala y es independiente de la infraestructura subyacente.

    驴Qu茅 es el c谩liz?

    C谩liz es un microframework para crear e implementar r谩pidamente aplicaciones sin servidor en Python para funciones de AWS Lambda. Chalice no solo nos ayuda a crear aplicaciones de Python, sino tambi茅n a implementarlas r谩pidamente al proporcionar una herramienta de l铆nea de comandos para crear, administrar e implementar nuestra aplicaci贸n.

    Chalice tambi茅n brinda funcionalidad de integraci贸n a otros servicios de Amazon como Amazon API Gateway, Amazon Simple Storage Service (S3) y Simple Queue Service (SQS), entre otros. Podemos crear API RESTful, tareas que se ejecutan en un horario determinado o que se integran al bucket de S3 para su almacenamiento.

    Preparar

    Configuraci贸n de AWS

    Para comenzar con Chalice, necesitamos tener una cuenta de AWS configurada para interactuar e implementar nuestro c贸digo. Esto se puede lograr a trav茅s del P谩gina de inicio de AWS donde podemos registrarnos o iniciar sesi贸n en una cuenta de AWS existente. AWS requiere que no solo ofrezcamos nuestros datos, sino tambi茅n los datos de facturaci贸n, pero para esta demostraci贸n utilizaremos el Capa gratuita de AWS con fines de prueba y desarrollo, por lo que no se nos facturar谩.

    Una vez que nuestra cuenta est谩 configurada, en el men煤 desplegable de nuestro perfil, hay una secci贸n llamada “Mis credenciales de seguridad”. Aqu铆 podremos crear credenciales que se utilizar谩n al interactuar con la consola de AWS. Estas credenciales tambi茅n ser谩n utilizadas por la herramienta CLI de Amazon.

    Amazon tambi茅n ofrece una herramienta CLI que podemos usar para interactuar con nuestros servicios de AWS usando comandos en nuestro terminal. Est谩 disponible para plataformas Mac, Linux y Windows y requiere Python 2.6+ o Python 3.3 o una versi贸n posterior. Podemos instalarlo ejecutando el siguiente comando pip:

    $ pip install awscli
    

    Una vez configurada, podemos probar la herramienta CLI ejecutando:

    $ aws --version
    

    Se pueden encontrar m谩s detalles sobre la herramienta CLI y la instalaci贸n en otras plataformas Aqu铆.

    Con la configuraci贸n de la herramienta AWS CLI, usaremos las credenciales, es decir, la clave secreta y el ID de acceso, que generamos anteriormente para configurar nuestra herramienta CLI ejecutando:

    $ aws configure
    

    Recibiremos un mensaje para completar nuestro Access Key ID, Secret Access Key y regiones y formatos de salida predeterminados. Los dos 煤ltimos son opcionales pero necesitaremos la clave de acceso y el secreto que obtuvimos del tablero de la consola de AWS.

    Tambi茅n puede configurar diferentes credenciales para diferentes usuarios en AWS. M谩s sobre eso y otros detalles se pueden encontrar Aqu铆.

    Configuraci贸n del proyecto

    Para este proyecto de demostraci贸n, crearemos una aplicaci贸n Python y es una buena pr谩ctica trabajar dentro de un entorno virtual para mantener nuestro entorno de proyecto abstra铆do del entorno Python del sistema. Para este prop贸sito, utilizaremos el Virtualenv herramienta para crear un entorno virtual dentro del cual trabajaremos.

    En caso de Virtualenv La herramienta a煤n no est谩 instalada, podemos instalarla simplemente ejecutando:

    $ pip install virtualenv
    

    Puede encontrar m谩s informaci贸n sobre la herramienta Virtualenv Aqu铆.

    Con Virtualenv instalado, vayamos a nuestro directorio de trabajo y creemos un entorno ejecutando el siguiente comando:

    $ virtualenv --python=python3 venv-chalice
    

    Activaremos nuestro entorno ejecutando:

    $ source venv-chalice/bin/activate
    

    Nuestro entorno ahora est谩 configurado, y ahora podemos instalar Chalice y verificar la instalaci贸n ejecutando los siguientes comandos:

    $ pip install chalice
    $ chalice --help
    

    El segundo comando aqu铆 se usa simplemente para verificar la instalaci贸n de Chalice.

    Implementaci贸n

    Ahora tenemos una cuenta de AWS, la herramienta AWS CLI instalada, la configuraci贸n del entorno y Chalice instalado. Ahora podemos usar Chalice para crear nuestra API RESTful simple de la siguiente manera:

    $ chalice new-project demoapp
    

    Este comando crea un proyecto de c谩liz simple dentro de una carpeta que tiene la siguiente estructura:

    $ tree demoapp
    demoapp
    鈹溾攢鈹 app.py
    鈹斺攢鈹 requirements.txt
    

    Cualquier otro requisito que nuestra aplicaci贸n Chalice requiera para ejecutarse mientras se implementa en AWS Lambda se incluir谩 en el requirements.txt archivo dentro del demoapp carpeta, y nuestra nueva funcionalidad residir谩 principalmente en el app.py archivo. Podemos crear otros archivos e importarlos al app.py archivo, que es nuestro archivo de proyecto principal.

    Para nuestra API simple, crearemos una API que devuelva una lista de los repositorios p煤blicos de GitHub de un usuario, los idiomas utilizados en cada uno y la cantidad de estrellas que tiene el repositorio. Esta informaci贸n est谩 disponible p煤blicamente en la API de GitHub, por lo tanto, no necesitaremos credenciales para interactuar con la API. Crearemos una funci贸n que recibe un nombre de usuario y devuelve los detalles que requerimos. Si el nombre de usuario proporcionado no existe, recibiremos una carga 煤til de respuesta vac铆a.

    Creemos el github_repos funci贸n que ser谩 responsable de la interacci贸n API de GitHub:

    import requests
    
    def github_repos(username):
        # Final list to contain our repository objects
        formatted_repos = []
    
        if username:
            # Format the url by insterting the passed username
            url = "https://api.github.com/users/{}/repos".format(username)
    
            r = requests.get(url)
    
            # Get the JSON containing the list of repositories
            list_of_repos = r.json()
    
            for repo in list_of_repos:
                repo_object = {
                  "name": repo["name"],
                  "stars": repo["watchers"],
                  "language": repo["language"],
                }
    
                formatted_repos.append(repo_object)
    
        return formatted_repos
    

    La funci贸n github_repos recibe un nombre de usuario y lo conecta a la URL de la API de GitHub antes de realizar la solicitud. La respuesta recibida tiene mucha informaci贸n que no necesitamos por ahora, por lo que extraemos los detalles de un repositorio que necesitamos, creamos un nuevo objeto y lo agregamos a la lista de formatted_repos que enviaremos de vuelta al usuario a trav茅s de la aplicaci贸n Chalice.

    Primero ejecutemos algunas pruebas locales para nuestra funci贸n y este es el resultado:

    La funci贸n ya est谩 lista para integrarse en nuestra aplicaci贸n Chalice en el app.py archivo, y esta es la versi贸n final de nuestra aplicaci贸n:

    import requests
    from chalice import Chalice
    
    def github_repos(username):
        # Function implementation above
    
    app = Chalice(app_name="demoapp")
    
    @app.route("https://Pharos.sh.com/")
    def index():
        return {'hello': 'world'}
    
    # Create our new route to handle github repos functionality
    @app.route('/user/{username}')
    def github(username):
        return {"repos": github_repos(username)}
    

    Nuestra aplicaci贸n ahora est谩 lista para ser consumida por los usuarios, implem茅ntela ahora en AWS Lambda.

    Implementando nuestra aplicaci贸n

    La implementaci贸n de una aplicaci贸n Chalice en AWS Lambda es tan simple como ejecutar el siguiente comando en nuestro directorio de trabajo:

    $ chalice deploy
    

    Chalice se encargar谩 del proceso de implementaci贸n por nosotros y nos devolver谩 un enlace con el que podemos interactuar con la API RESTful que acabamos de crear:

    Para probar nuestra API, podemos usar Cartero, un navegador web o cualquier otra herramienta de interacci贸n API para realizar solicitudes al /user/<github-username> punto final en la “URL de la API REST” de la captura de pantalla anterior. Pas茅 mi nombre de usuario de GitHub y este fue el resultado:

    Si hacemos alg煤n cambio en nuestro c贸digo, simplemente ejecutamos el chalice deploy comando de nuevo y Chalice volver谩 a implementar nuestra aplicaci贸n con los cambios que acabamos de hacer.

    Cuando nos dirigimos a la Consola de AWS y hacemos clic en la secci贸n “Funciones” en la barra lateral plegable en el lado izquierdo, podemos ver la funci贸n Lambda que actualmente est谩 ejecutando nuestra aplicaci贸n:

    Cuando hacemos clic en nuestra funci贸n, obtenemos m谩s detalles sobre ella, como la configuraci贸n actual, las variables de entorno establecidas para nuestra aplicaci贸n, los roles de ejecuci贸n y la configuraci贸n de la memoria.

    AWS tambi茅n nos brinda opciones de monitoreo como registros de eventos y m茅tricas a trav茅s de CloudWatch que es un servicio de monitoreo y administraci贸n ofrecido por AWS.

    Esta es la vista del panel de monitoreo de nuestra aplicaci贸n:

    Obtenemos estad铆sticas sobre el n煤mero de invocaciones por parte de los usuarios, la duraci贸n de las solicitudes atendidas por nuestra API, las tasas de 茅xito y error, entre otras cosas.

    Incluso obtenemos una vista de las solicitudes individuales en el mismo panel, aunque esto no es visible en la captura de pantalla anterior. AWS hace mucho por nosotros de forma inmediata, lo que hace que nuestra experiencia de implementaci贸n sea breve y directa al grano. No tenemos que preocuparnos por mantener nuestro propio servidor o implementar nuestros propios m茅todos de monitoreo y registro, ya que AWS nos tiene cubierto para esto.

    Esta es la experiencia sin servidor.

    Resumen

    En este art铆culo, creamos una API de Python sin servidor utilizando el microframework Chalice y la implementamos en AWS Lambda. La AWS CLI, junto con las herramientas de Chalice CLI, nos ha ayudado a iniciar nuestro proyecto r谩pidamente y lo implementamos en AWS Lambda con un solo comando.

    La nuestra es una aplicaci贸n sin servidor, ya que no tuvimos que encargarnos de ninguna provisi贸n o mantenimiento del servidor por nuestra parte. Simplemente escribimos el c贸digo y dejamos que AWS se encargue del resto por nosotros, incluida la implementaci贸n, el escalado y la supervisi贸n de nuestra aplicaci贸n. El tiempo necesario para que nuestra aplicaci贸n est茅 disponible ha disminuido significativamente, a pesar de que todav铆a dependemos de AWS para otros aspectos, como la supervisi贸n de nuestra aplicaci贸n.

    El c贸digo fuente de este proyecto est谩 disponible aqu铆 en GitHub.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *