Proyectos en AWS

Crear una aplicación web moderna

Implemente una aplicación web, conéctese a una base de datos y analice el comportamiento del usuario

Módulo 5: Captura del comportamiento del usuario

En este módulo, capturará el comportamiento de los usuarios usando AWS Lambda y otros servicios sin servidor.

Información general

Ahora que el sitio de Mythical Mysfits está en marcha, creemos una forma para comprender mejor cómo están interactuando los usuarios con el sitio web y sus Mysfits. Sería muy fácil para nosotros analizar las acciones que realizan los usuarios en el sitio web y tienen como resultado cambios en los datos en nuestro backend (cuando alguien adopta o indica que le gusta un mysfit).

Sin embargo, comprender las acciones que realizan los usuarios en el sitio web antes de tomar la decisión de dar “me gusta” a un mysfit o adoptarlo podría ayudarlo a diseñar una mejor experiencia de usuario en el futuro que haga que los mysfits se adopten aún más rápido. Para ayudarnos a recopilar esta información, implementaremos la capacidad para que el frontend del sitio web envíe una pequeña solicitud cada vez que un usuario haga clic en el perfil de un mysfit a una nueva API de microservicio que crearemos. Una función de código sin servidor procesará en tiempo real estos registros, los que se acumularán y almacenarán para cualquier análisis futuro que usted desee realizar.

Los principios modernos de diseño de aplicaciones prefieren el uso de servicios dirigidos, desacoplados y modulares. Por lo tanto, en lugar de agregar métodos y capacidades adicionales dentro del servicio Mysfits existente con el que ha estado trabajando, crearemos un servicio nuevo y desacoplado con el fin de recibir eventos de clics de usuarios del sitio web de Mysfits. Esta pila completa se ha representado usando una plantilla de CloudFormation proporcionada.

Diagrama de la arquitectura

capturar el comportamiento del usuario

¿Por qué debería elegir AWS Lambda para esta implementación?

Lambda es una excelente opción para aplicaciones basadas en datos que necesitan responder en tiempo real a cambios en los datos, modificaciones del estado del sistema o acciones de los usuarios. Estas aplicaciones suelen conectarse a almacenes de datos para acceder a los datos y analizarlos con el fin de realizar procesamiento por lotes, análisis de transmisiones e inferencias de aprendizaje automático. Lambda es idóneo para estas aplicaciones porque está integrado a almacenes de datos como Kinesis Data Streams y Data Firehose, S3, CloudWatch Events, CloudWatch Logs y DynamoDB, con un total de 17 orígenes de eventos en la actualidad.   

Recursos sin servidor utilizados en este módulo

Secuencia de entrega de AWS Kinesis Firehose: Kinesis Firehose es un servicio administrado de streaming en tiempo real de alta disponibilidad que acepta registros de datos y los envía automáticamente a varios destinos de almacenamiento posibles dentro de AWS, como el bucket de Amazon S3 o el clúster de almacén de datos de Amazon Redshift. Kinesis Firehose también permite que todos los registros que recibió la transmisión se envíen automáticamente a una función sin servidor creada con AWS Lambda. Esto significa que el código que ha escrito puede llevar a cabo cualquier procesamiento o transformación adicional de los registros antes de que se acumulen y almacenen en el destino configurado.

Bucket de Amazon S3: se creará un nuevo bucket en S3 en el que todos los registros de eventos de clics procesados se acumulen en archivos y se almacenen como objetos.

Función de AWS Lambda: AWS Lambda permite que los desarrolladores escriban funciones de código que solo contienen lo que requiere su lógica, y que dicho código pueda implementarse, invocarse, lograr un alto nivel de confiabilidad y escalarse sin necesidad de administrar ningún tipo de infraestructura. En este caso, se define una función de código sin servidor usando AWS SAM. Se implementará en AWS Lambda, se escribirá en Python y, luego, se procesará y enriquecerá los registros de clics que reciba la transmisión de entrega. El código que escribimos es muy simple, y el enriquecimiento que hace podría haberse logrado en el frontend del sitio web sin ningún otro procesamiento posterior. La función recupera atributos adicionales sobre el Mysfit en el que se ha hecho clic para el registro del clic sea más significativo (datos que ya había recuperado el frontend del sitio web). Sin embargo, para los fines de este taller, el código está pensado para demostrar las posibilidades de arquitectura de incluir una función de código sin servidor que lleve a cabo cualquier procesamiento o transformación adicional que se requiera, en tiempo real, antes de que se almacenen los registros. Una vez que se crea la función de Lambda y se configura la secuencia de entrega de Kinesis Firehose como un origen de eventos para la función, la secuencia de entrega entregará automáticamente registros de clic como eventos a la función de código que hemos creado, recibirá las respuestas devueltas por nuestro código y entregará los registros actualizados al bucket de Amazon S3 configurado.

Una API de REST de Amazon API Gateway: AWS Kinesis Firehose proporciona una API de servicio al igual que otros servicios de AWS. En este caso, usamos su operación PutRecord para colocar los registros de eventos de clics de usuarios en la secuencia de entrega. Sin embargo, no se espera que la interfaz de nuestro sitio web se integre directamente a la API de PutRecord de Kinesis Firehose. Si así fuera, se requeriría que administremos credenciales de AWS dentro del código del frontend para autorizar las solicitudes de la API a la API de PutRecord y expondría a los usuarios la API de AWS directa de la que se depende (lo que podría alentar a que visitantes malintencionados del sitio intenten agregar registros a la secuencia de entrega que tengan formato incorrecto o sean perjudiciales para nuestro objetivo de conocer el comportamiento real de los usuarios). En cambio, usaremos Amazon API Gateway para crear un proxy de servicio de AWS en la API de PutRecord de Kinesis Firehose. Esto nos permite desarrollar nuestro propio punto de enlace RESTful público que no requiera administración de credenciales de AWS en el frontend para las solicitudes. Además, también usaremos una plantilla de mapeo de solicitudes en API Gateway, lo que nos permitirá definir nuestra propia estructura de carga de solicitudes que restringirá las solicitudes a la estructura esperada y, luego, transformará dichas solicitudes con formato correcto en la estructura que requiere la API de PutRecord de Kinesis Firehose.

Roles de IAM: Kinesis Firehose requiere un rol de servicio que le permita entregar registros recibidos como eventos a la función Lambda creada, además de enviar los registros procesados al bucket de S3 de destino. La API de Amazon API Gateway también requiere un nuevo rol que permita que la API invoque la API de PutRecord dentro de Kinesis Firehose para cada solicitud de API que recibida.

Instrucciones para la implementación

  • A: Crear un nuevo repositorio de CodeCommit

    Esta nueva pila que implementará usando CloudFormation no solo contendrá los recursos de entorno de infraestructura, sino también el mismo código de aplicación que AWS Lambda ejecutará para procesar eventos de streaming. Para agrupar la creación de la infraestructura y del código en una implementación, usaremos otra herramienta de AWS que viene preinstalada en el IDE de AWS Cloud9: la CLI de AWS SAM. Se envía el código de las funciones de AWS Lambda al servicio cargando el código de la función en un paquete .zip en un bucket de Amazon S3.

    La CLI de SAM automatiza ese proceso por nosotros. Gracias a esta característica, podemos crear una plantilla de CloudFormation que haga referencia de forma local en el sistema de archivos donde todo el código de nuestra función Lambda está almacenado. Luego, la CLI de SAM la comprimirá a un archivo .zip, la cargará a un bucket de Amazon S3 configurado y creará una nueva plantilla de CloudFormation que indique la ubicación en S3 en la que se cargó el paquete en formato .zip para la implementación en AWS Lambda. A continuación, podemos implementar la plantilla de CloudFormation que generó la CLI de SAM en AWS y observar la creación del entorno junto con la función Lambda, que usa el paquete de código cargado por la CLI de SAM.

    En primer lugar, creemos un nuevo repositorio de CodeCommit donde se ubicará el código del servicio de streaming:

    aws codecommit create-repository --repository-name MythicalMysfitsStreamingService-Repository

    Copie el valor de “cloneUrlHttp” en la respuesta a dicho comando. Debe tener el siguiente formato: https://git-codecommit.REEMPLAZAR_REGION.amazonaws.com/v1/repos/MythicalMysfitsStreamingService-Repository

    A continuación, clonaremos el repositorio nuevo y vacío en nuestro IDE:

    cd ~/environment/
    git clone {insert the copied cloneValueUrl from above}
    B: Copiar el código de base del servicio de streaming

    Ahora, mudemos nuestro directorio de trabajo a este nuevo repositorio:

    cd ~/environment/MythicalMysfitsStreamingService-Repository/

    Luego, copiemos los componentes de la aplicación del módulo 5 a este nuevo directorio del repositorio:

    cp -r ~/environment/aws-modern-application-workshop/module-5/app/streaming/* .

    Por último, también copiemos la plantilla de CloudFormation para este módulo.

    cp ~/environment/aws-modern-application-workshop/module-5/cfn/* .
  • A: Usar pip para instalar dependencias de la función Lambda

    Ahora, hemos configurado el directorio del repositorio con todos los artefactos proporcionados:

    Una plantilla de CFN para crear la pila completa

    Un script de Python que contiene el código para nuestra función Lambda: streamProcessor.py

    Este es un enfoque común que usan los clientes de AWS: almacenar sus plantillas de CloudFormation junto con el código de aplicación en un repositorio. De esa manera, se tiene un único lugar donde puede hacerse un seguimiento de todos los cambios a la aplicación y su entorno juntos.

    Sin embargo, si observa el código dentro del archivo streamProcessor.py, notará que está usando las solicitudes del paquete de Python para realizar una solicitud de API al servicio de Mythical Mysfits que creó anteriormente. No se incluyen bibliotecas externas de manera automática en el entorno de tiempo de ejecución de AWS Lambda, ya que es posible que diferentes clientes de AWS dependan de versiones distintas de varias bibliotecas, etc.

    Deberá empaquetar todas sus dependencias de biblioteca junto con la función de código de Lambda antes de cargarlas al servicio de Lambda. Para ello, utilizaremos el pip del administrador de paquetes de Python. En el terminal de Cloud9, ejecute el siguiente comando para instalar el paquete de solicitudes y sus dependencias de manera local junto con el código de la función:

    pip install requests -t .

    Una vez que se completa este comando, verá varias carpetas adicionales del paquete de Python almacenadas dentro del directorio del repositorio.

    B: Actualizar el código de la función Lambda

    A continuación, tendremos que hacer un cambio más en el código antes de que el código de nuestra función Lambda esté completamente listo para su implementación. Existe una línea en el archivo streamProcessor.py que debe reemplazarse con el punto de enlace ApiEndpoint para la API del servicio de Mysfits: el mismo punto de enlace ApiEndpoint de servicio que creó en el módulo 4 y usó en la interfaz del sitio web.

    replace-api-endpoint

    Ese servicio es responsable de integrarse a MysfitsTable en DynamoDB, por lo que, incluso si pudiéramos escribir una función Lambda que también se integrara directamente a la tabla de DynamoDB, hacerlo interferiría con el propósito del primer microservicio y nos dejaría con bases de código múltiples y separadas que se integrarían a la misma tabla. En cambio, nos integraremos a esa tabla a través del servicio existente y tendremos una arquitectura de aplicación mucho más desacoplada y modular.

    C: Enviar el código a CodeCommit

    Confirmemos los cambios en el código en el nuevo repositorio para que se guarden en CodeCommit:

    git add .
    git commit -m "New stream processing service."
    git push
  • A: Crear un bucket de S3 para los paquetes de código de la función Lambda

    Una vez que se haya cambiado la línea del archivo de Python y se haya confirmado el código, estamos listos para usar la CLI de AWS SAM para empaquetar todo el código de la función, cargarlo en S3 y crear la plantilla de CloudFormation implementable para crear nuestra pila de streaming.

    En primer lugar, utilice la CLI de AWS para crear un nuevo bucket de S3 donde se cargarán los paquetes del código de la función Lambda. Los nombres de buckets de S3 deben ser únicos a nivel global entre todos los clientes de AWS, por lo que debe reemplazar el final del nombre de este bucket con una cadena que sea única para usted:

    B: Usar la CLI de SAM para empaquetar el código de Lambda

    Una vez creado el bucket, estamos listos para usar la CLI de SAM para empaquetar y cargar el código y transformar la plantilla de CloudFormation. Asegúrese de reemplazar el último parámetro del comando con el nombre del bucket que acaba de crear en el paso anterior (este comando también supone que su terminal continúa en el directorio de trabajo del repositorio):

    sam package --template-file ./real-time-streaming.yml --output-template-file ./transformed-streaming.yml --s3-bucket replace-with-your-bucket-name

    Si funciona correctamente, verá que el archivo transformed-streaming.yml creado recientemente existe en el directorio ./MythicalMysfitsStreamingService-Repository/. Si observa en el contenido, verá que el parámetro CodeUri de la función Lambda sin servidor se ha actualizado con la ubicación del objeto en la que la CLI de SAM ha cargado su código empaquetado.

    C: Implementar la pila usando AWS CloudFormation

    El comando de la CLI de SAM también devuelve el comando de CloudFormation que debe ejecutarse para crear la nueva pila completa. Sin embargo, debido a que nuestra pila crea recursos de IAM, deberá agregar un parámetro adicional al comando. Ejecute el siguiente comando para implementar la pila de streaming:

    aws cloudformation deploy --template-file /home/ec2-user/environment/MythicalMysfitsStreamingService-Repository/cfn/transformed-streaming.yml --stack-name MythicalMysfitsStreamingStack --capabilities CAPABILITY_IAM

    Una vez que la creación de esta pila se haya completado, se creará el microservicio de procesamiento completo en tiempo real.

    En situaciones futuras en las que solo se hayan hecho cambios en el código de la función de Lambda y el resto de la pila de CloudFormation permanezca sin cambios, puede repetir los mismos comandos de la CLI de AWS SAM y de CloudFormation que se indicaron anteriormente. Esto dará como resultado que no haya cambios en el entorno de infraestructura, pero que se produzca una implementación de código en su función Lambda.

  • A: Actualizar el contenido del sitio web

    Con la pila de streaming en marcha, ahora necesitamos publicar una nueva versión de nuestro frontend de Mythical Mysfits que incluya el JavaScript que envía los eventos a nuestro servicio siempre que un usuario haga clic en el perfil de un mysfit.

    El nuevo archivo index.html está incluido en la siguiente ruta: ~/environment/aws-modern-application-workshop/module-5/web/index.html.

    Este archivo contiene los mismos marcadores de posición que el módulo 4 y que deben actualizarse, además de un marcador de posición adicional para el nuevo punto de enlace del servicio de procesamiento de secuencias que acaba de crear. Para obtener los valores de las variables anteriores, puede consultar el archivo index.html anterior que actualizó como parte del módulo 4.

    Ejecute el siguiente comando para que la nueva pila de streaming recupere el nuevo punto de enlace de API Gateway para su servicio de procesamiento de secuencias:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsStreamingStack
    B: Enviar la nueva versión del sitio a S3

    Reemplace el valor final en index.html de streamingApiEndpoint y estará listo para publicar su actualización final de la página de inicio de Mythical Mysfits:

    aws s3 cp ~/environment/aws-modern-application-workshop/module-5/web/index.html s3://YOUR-S3-BUCKET/

    Actualice su sitio web de Mythical Mysfits en el navegador una vez más y, de este modo, tendrá un sitio que registra y publica cada vez que un usuario hace clic en el perfil de un mysfit.

    Si desea ver los registros que se han procesado, llegarán al bucket de S3 de destino como parte de la pila MythicalMysfitsStreamingStack.

    Ahora que tiene una arquitectura de aplicación moderna completa, lo alentamos a que explore la consola de AWS y toda la variedad de servicios que ha creado para lanzar Mythical Mysfits.

  • Asegúrese de eliminar todos los recursos creados durante el taller para garantizar que la facturación de los recursos no continúe durante más tiempo del que desea. Recomendamos que utilice la consola de AWS para explorar los recursos que creó y que los elimine cuando esté listo.

    Con respecto a los dos casos en los que aprovisionó recursos usando AWS CloudFormation, puede eliminar esos recursos simplemente ejecutando el siguiente comando de CLI para cada pila:

    aws cloudformation delete-stack --stack-name STACK-NAME-HERE

    Para eliminar los recursos creados, puede visitar las siguientes consolas de AWS, que contienen recursos que ha creado durante el taller de Mythical Mysfits:

Conclusión

La intención de esta experiencia era que pudiera probar cómo se siente ser un desarrollador que diseña y crea arquitecturas de aplicaciones modernas en AWS. Los desarrolladores en AWS pueden aprovisionar recursos mediante programación usando la CLI de AWS, reutilizar definiciones de infraestructura mediante AWS CloudFormation, crear e implementar automáticamente cambios en el código usando el conjunto de herramientas para desarrolladores de AWS de servicios de código y aprovechar distintas capacidades de servicios informáticos y de aplicaciones que no requieren que usted aprovisione ni administre ningún tipo de servidor.

Como un gran siguiente paso, si desea obtener más información acerca del funcionamiento interno del sitio web de Mythical Mysfits que creó, profundice en las plantillas de CloudFormation proporcionadas y los recursos declarados dentro de ellas.

Esperamos que haya disfrutado el taller AWS Modern Application Workshop. Este tutorial también se encuentra alojado en GitHub, por lo que podrá enviar un problema si tiene alguna recomendación. También podrá iniciar una solicitud “pull” de GitHub si desea colaborar en la mejora del código.

Si desea obtener más información acerca de desarrollo en AWS, visite nuestro Centro de desarrolladores de AWS.

¡Felicitaciones!

Creó una aplicación web moderna en AWS.
Compártala con sus amigos o envíenos comentarios.

Twilight Glitter está impresionada por su trabajo