Procesamiento de eventos de forma asíncrona con Amazon API Gateway y AWS Lambda - Recomendaciones de AWS

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.

Procesamiento de eventos de forma asíncrona con Amazon API Gateway y AWS Lambda

Andrea Meroni, Mariem Kthiri, Nadim Majed y Michael Wallner, Amazon Web Services

Resumen

Amazon API Gateway es un servicio totalmente gestionado que los desarrolladores pueden utilizar para crear, publicar, mantener, supervisar y proteger APIs a cualquier escala. Gestiona las tareas relacionadas con la aceptación y el procesamiento de centenares de miles de llamadas simultáneas a la API.

Una cuota de servicio importante de API Gateway es el tiempo de espera de la integración. El tiempo de espera es el tiempo máximo durante el que un servicio de backend debe devolver una respuesta antes de que la API de REST devuelva un error. El límite estricto de 29 segundos suele ser aceptable para las cargas de trabajo sincrónicas. Sin embargo, ese límite representa un desafío para los desarrolladores que desean usar API Gateway con cargas de trabajo asíncronas.

Este patrón muestra un ejemplo de arquitectura para procesar eventos de forma asíncrona mediante API Gateway y. AWS Lambda La arquitectura admite la puesta en marcha de trabajos de procesamiento con una duración de hasta 15 minutos y utiliza una API de REST básica como interfaz.

Projen se utiliza para configurar el entorno de desarrollo local y para implementar la arquitectura de ejemplo en un objetivo Cuenta de AWS, en combinación con el AWS Cloud Development Kit (AWS CDK) kit de herramientas, Docker y Node.js. Projen configura automáticamente un entorno virtual de Python con pre-commit y las herramientas que se utilizan para garantizar la calidad del código, analizar la seguridad y realizar pruebas unitarias. Para obtener más información, consulte la sección Herramientas.

Requisitos previos y limitaciones

Requisitos previos

Limitaciones

  • El tiempo de ejecución máximo de un trabajo está limitado por el tiempo de ejecución máximo de las funciones de Lambda (15 minutos).

  • El número máximo de solicitudes de trabajo simultáneas está limitado por la simultaneidad reservada de la función de Lambda.

Arquitectura

El siguiente diagrama muestra la interacción de la API de trabajos con las funciones Lambda de procesamiento y gestión de errores de eventos, con los eventos almacenados en un archivo de eventos de Amazon. EventBridge

Nube de AWS architecture showing user interaction with jobs API, Lambda functions, and EventBridge.

Un flujo de trabajo habitual incluye los siguientes pasos:

  1. Usted se autentica con AWS Identity and Access Management (IAM) y obtiene las credenciales de seguridad.

  2. Envía una solicitud POST HTTP al punto de conexión de la API de trabajos /jobs, especificando los parámetros del trabajo en el cuerpo de la solicitud.

  3. La API de trabajos, que es una API de REST de API Gateway, le devuelve una respuesta HTTP que contiene el identificador del trabajo.

  4. La API de trabajos invoca de forma asíncrona la función de Lambda de procesamiento de eventos.

  5. La función de procesamiento de eventos procesa el evento y, a continuación, agrega los resultados del trabajo a la tabla de Amazon DynamoDB de trabajos.

  6. Envía una solicitud GET HTTP al punto de conexión de la API de trabajos /jobs/{jobId}, con el identificador de trabajo del paso 3 como {jobId}.

  7. La API de trabajos consulta la tabla jobs de DynamoDB para recuperar los resultados del trabajo.

  8. La API de trabajos devuelve una respuesta HTTP que contiene los resultados del trabajo.

  9. Si se produce un error al procesar un evento, la función de procesamiento de eventos envía el evento a la función de gestión de errores.

  10. La función de gestión de errores agrega los parámetros del trabajo a la tabla jobs de DynamoDB.

  11. Puede recuperar los parámetros del trabajo enviando una solicitud GET HTTP al punto de conexión de la API de trabajos /jobs/{jobId}.

  12. Si se produce un error en la gestión de errores, la función de gestión de errores envía el evento a un archivo de eventos. EventBridge

    Puede reproducir los eventos archivados utilizando. EventBridge

Tools (Herramientas)

Servicios de AWS

  • AWS Cloud Development Kit (AWS CDK)es un marco de desarrollo de software que le ayuda a definir y aprovisionar la Nube de AWS infraestructura en código.

  • AWS Command Line Interface (AWS CLI) es una herramienta de código abierto que le ayuda a interactuar con los servicios de AWS mediante comandos en su shell de línea de comandos.

  • Amazon DynamoDB es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.

  • Amazon EventBridge es un servicio de bus de eventos sin servidor que le ayuda a conectar sus aplicaciones con datos en tiempo real de diversas fuentes. Por ejemplo, funciones de Lambda, puntos de conexión de invocación HTTP que utilizan destinos de API o buses de eventos en otras Cuentas de AWS.

  • AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

Otras herramientas

  • autopep8 formatea automáticamente el código de Python según la guía de estilo Python Enhancement Proposal (PEP) 8.

  • Bandit analiza el código de Python para detectar problemas de seguridad comunes.

  • Commitizen un verificador de confirmaciones y generador de CHANGELOG de Git.

  • cfn-lint es un linter AWS CloudFormation

  • Checkov es una herramienta de análisis de código estático que revisa si la infraestructura como código (IaC) se ha configurado mal en términos de seguridad y cumplimiento.

  • jq es una herramienta de línea de comandos para analizar JSON.

  • Postman es una plataforma de API.

  • pre-commit es un administrador de enlaces de Git.

  • Projen es un generador de proyectos.

  • pytest es un marco de Python para escribir pruebas pequeñas y legibles.

Repositorio de código

Este ejemplo de código de arquitectura se encuentra en el repositorio Lambda y procesamiento de eventos GitHub asíncrono con API Gateway.

Prácticas recomendadas

  • Esta arquitectura de ejemplo no incluye la supervisión de la infraestructura implementada. Si su caso de uso requiere supervisión, evalúe la posibilidad de agregar CDK Monitoring Constructs u otra solución de supervisión.

  • Esta arquitectura de ejemplo usa permisos de IAM para controlar el acceso a la API de trabajos. Cualquier persona autorizada a asumir JobsAPIInvokeRole podrá invocar la API de trabajos. Como tal, el mecanismo de control de acceso es binario. Si su caso de uso requiere un modelo de autorización más complejo, evalúe la posibilidad de usar un mecanismo de control de acceso diferente.

  • Cuando un usuario envía una solicitud POST HTTP al punto de conexión de la API de trabajos /jobs, los datos de entrada se validan en dos niveles diferentes:

    • Amazon API Gateway se encarga de la validación de la primera solicitud.

    • La función de procesamiento de eventos realiza la segunda solicitud.

      No se hace ninguna validación cuando el usuario realiza una solicitud GET HTTP al punto de conexión de la API de trabajos /jobs/{jobId}. Si su caso de uso requiere una validación de entrada adicional y un mayor nivel de seguridad, evalúe la posibilidad de usar AWS WAF para proteger su API.

Epics

TareaDescripciónHabilidades requeridas

Clonar el repositorio.

Para clonar el repositorio localmente, use el siguiente comando:

git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk.git
DevOps ingeniero

Configure el proyecto.

Cambie el directorio a la raíz del repositorio y configure el entorno virtual de Python y todas las herramientas mediante Projen

cd asynchronous-event-processing-api-gateway-api-gateway-lambda-cdk npx projen
DevOps ingeniero

Instale enlaces de pre-commit.

Para instalar enlaces de pre-commit, haga lo siguiente:

  1. Active el entorno virtual Python:

    source .env/bin/activate
  2. Instale los enlaces de pre-commit:

    pre-commit install pre-commit install --hook-type commit-msg
DevOps ingeniero
TareaDescripciónHabilidades requeridas

Bootstrap. AWS CDK

Para arrancar AWS CDK Cuenta de AWS, ejecuta el siguiente comando:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap
AWS DevOps

Implemente la arquitectura de ejemplo.

Para implementar la arquitectura de ejemplo en su Cuenta de AWS hogar, ejecute el siguiente comando:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy
AWS DevOps
TareaDescripciónHabilidades requeridas

Instale los requisitos previos de prueba.

Instale en su estación de trabajo AWS Command Line Interface (AWS CLI), Postman y jq.

Se sugiere usar Postman para probar esta arquitectura de ejemplo, pero no es obligatorio. Si elige una herramienta para probar API alternativa, asegúrese de que sea compatible con la autenticación de AWS Signature Version 4 y consulte los puntos de conexión de la API expuestos, que se pueden inspeccionar exportando la API de REST.

DevOps ingeniero

Asuma el JobsAPIInvokeRole.

Asuma el JobsAPIInvokeRole que apareció en la salida del comando de implementación:

CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \ --no-cli-pager \ --role-arn $<JOBS_API_INVOKE_ROLE_ARN> \ --role-session-name JobsAPIInvoke) export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’) export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’) export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)
AWS DevOps

Configure Postman.

  1. Para importar la colección de Postman que se incluye en el repositorio, siga las instrucciones de la documentación de Postman.

  2. Defina las variables de JobsAPI con los siguientes valores:

    • accessKey: el valor del atributo Credentials.AccessKeyId del comando assume-role.

    • baseUrl: el valor de la salida de JobsApiJobsAPIEndpoint del comando de implementación sin la barra diagonal final.

    • region‒ El valor del Región de AWS lugar en el que implementó la arquitectura de ejemplo

    • seconds: el valor de un parámetro de entrada para el trabajo de ejemplo. Debe ser un entero positivo.

    • secretKey: el valor del atributo Credentials.SecretAccessKey del comando assume-role.

    • sessionToken: el valor del atributo Credentials.SessionToken del comando assume-role.

AWS DevOps

Pruebe la arquitectura de ejemplo.

Para probar la arquitectura de ejemplo, envíe solicitudes a la API de trabajos. Para obtener más información, consulte la documentación de Postman.

DevOps ingeniero

Resolución de problemas

ProblemaSolución

La destrucción y posterior redespliegue de la arquitectura de ejemplo fallan porque el grupo de CloudWatch registros de Amazon Logs /aws/apigateway/JobsAPIAccessLogs ya existe.

  1. Si es necesario, exporte los datos de registro a Amazon S3.

  2. Elimine el grupo CloudWatch de registros. /aws/apigateway/JobsAPIAccessLogs

  3. Vuelva a implementar la arquitectura de ejemplo.

Recursos relacionados