

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 Amazon DynamoDB Streams
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams"></a>

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

## Resumen
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-summary"></a>

[Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) 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, Amazon DynamoDB Streams y. AWS Lambda La arquitectura admite la puesta en marcha de trabajos de procesamiento en paralelo con los mismos parámetros de entrada y utiliza una API de REST básica como interfaz. En este ejemplo, el uso de Lambda como backend limita la duración de los trabajos a 15 minutos. Puede evitar este límite utilizando un servicio alternativo para procesar los eventos entrantes (por ejemplo,). AWS Fargate

[Projen](https://pypi.org/project/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](https://docs.aws.amazon.com/cdk/v2/guide/cli.html), [Docker](https://docs.docker.com/get-docker/) y Node.js.](https://nodejs.org/en/download/) Projen configura automáticamente un entorno virtual de [Python](https://www.python.org/downloads/) con [pre-commit](https://pre-commit.com/) 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](#processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools).

## Requisitos previos y limitaciones
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-prereqs"></a>

**Requisitos previos**
+ Un activo Cuenta de AWS
+ Las siguientes herramientas están instaladas en su estación de trabajo:
  + [AWS Cloud Development Kit (AWS CDK) Kit de herramientas](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) versión 2.85.0 o posterior
  + La versión 20.10.21 o posterior de [Docker](https://docs.docker.com/get-docker/)
  + La versión 18 o posterior de [Node.js](https://nodejs.org/en/download/)
  + La versión 0.71.111 o posterior de [Projen](https://pypi.org/project/projen/)
  + La versión 3.9.16 o posterior de [Python](https://www.python.org/downloads/)

**Limitaciones**
+ El número máximo recomendado de lectores para DynamoDB Streams es de dos para evitar la limitación.
+ 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 las funciones de Lambda.

## Arquitectura
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-architecture"></a>

**Arquitectura**

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

![\[Diagrama de arquitectura y proceso, con los pasos enumerados después del diagrama.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/68a46501-16e5-48e4-99c6-fc67a8b4133a/images/29fe6982-ad81-4099-9c65-08b17c96e78f.png)


Un flujo de trabajo habitual incluye los siguientes pasos:

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

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

1. La API de trabajos devuelve una respuesta HTTP que contiene el identificador del trabajo.

1. La API de trabajos agrega los parámetros del trabajo a la tabla `jobs_table` de Amazon DynamoDB.

1. El flujo de DynamoDB de la tabla de DynamoDB `jobs_table` invoca las funciones de Lambda de procesamiento de eventos.

1. Las funciones de Lambda de procesamiento de eventos procesan el evento y, a continuación, agregan los resultados del trabajo a la tabla `jobs_table` de DynamoDB. Para garantizar la coherencia de los resultados, las funciones de procesamiento de eventos implementan un mecanismo de [bloqueo positivo](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html).

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

1. La API de trabajos consulta la tabla `jobs_table` de DynamoDB para recuperar los resultados del trabajo.

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

1. Si el procesamiento de eventos falla, la asignación de orígenes de la función de procesamiento de eventos envía el evento al tema de Amazon Simple Notification Service (Amazon SNS) de gestión de errores.

1. El tema de gestión de errores de SNS envía el evento de forma asíncrona a la función de gestión de errores.

1. La función de gestión de errores agrega los parámetros del trabajo a la tabla `jobs_table` de DynamoDB.

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

1. Si la gestión de errores falla, la función de gestión de errores envía el evento a un archivo de Amazon EventBridge .

   Puede reproducir los eventos archivados utilizando. EventBridge

## Tools (Herramientas)
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools"></a>

**Servicios de AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) es un marco de desarrollo de software que lo ayuda a definir y aprovisionar la infraestructura en la nube de AWS en código.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) es un servicio de base de datos de NoSQL completamente administrado que ofrece un rendimiento rápido, predecible y escalable.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 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, las funciones de AWS Lambda, los puntos de conexión de invocación HTTP que utilizan destinos de API o los buses de eventos de otras cuentas de AWS.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 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.
+ [Amazon Simple Notification Service (Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)) le permite coordinar y administrar el intercambio de mensajes entre publicadores y clientes, incluidos los servidores web y las direcciones de correo electrónico.

**Otras herramientas**
+ [autopep8](https://github.com/hhatto/autopep8) formatea automáticamente el código de Python según la guía de estilo Python Enhancement Proposal (PEP) 8.
+ [Bandit](https://bandit.readthedocs.io/en/latest/) analiza el código de Python para detectar problemas de seguridad comunes.
+ [Commitizen](https://commitizen-tools.github.io/commitizen/) un verificador de confirmaciones y generador de `CHANGELOG` de Git.
+ [cfn-lint es un linter](https://github.com/aws-cloudformation/cfn-lint) AWS CloudFormation 
+ [Checkov](https://github.com/bridgecrewio/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](https://stedolan.github.io/jq/download/) es una herramienta de línea de comandos para analizar JSON.
+ [Postman](https://www.postman.com/) es una plataforma de API.
+ [pre-commit](https://pre-commit.com/) es un administrador de enlaces de Git.
+ [Projen](https://github.com/projen/projen) es un generador de proyectos.
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html) 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 GitHub [Asynchronous Processing with API Gateway y DynamoDB Streams](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk).

## Prácticas recomendadas
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-best-practices"></a>
+ 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](https://constructs.dev/packages/cdk-monitoring-constructs) u otra solución de supervisión.
+ Esta arquitectura de ejemplo usa [permisos de IAM](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html) 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](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html) 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:
  + API Gateway se encarga de la [validación de la primera solicitud](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html).
  + 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 su [uso AWS WAF](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) para proteger su API.
+ Para evitar limitaciones, la [documentación de DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.Processing) desaconseja a los usuarios hacer operaciones de lectura con más de dos consumidores de la misma partición del flujo. Para escalar horizontalmente el número de consumidores, le recomendamos que utilice [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html).
+ En este ejemplo, se ha utilizado el [bloqueo positivo](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html) para garantizar actualizaciones coherentes de los elementos de la tabla `jobs_table` de DynamoDB. Según los requisitos del caso de uso, es posible que tenga que implementar mecanismos de bloqueo más fiables, como el bloqueo negativo.

## Epics
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-epics"></a>

### Configuración del entorno
<a name="set-up-the-environment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Clonar el repositorio. | Para clonar el repositorio localmente, use el siguiente comando:<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git</pre> | 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](https://github.com/projen/projen):<pre>cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk<br />npx projen</pre> | DevOps ingeniero | 
| Instale enlaces de pre-commit. | Para instalar enlaces de pre-commit, haga lo siguiente:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | DevOps ingeniero | 

### Implementación de la arquitectura de ejemplo
<a name="deploy-the-example-architecture"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Bootstrap. AWS CDK | Para arrancar [AWS CDK](https://aws.amazon.com/cdk/) Cuenta de AWS, ejecuta el siguiente comando:<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | AWS DevOps | 
| Implemente la arquitectura de ejemplo. | Para implementar la arquitectura de ejemplo en su Cuenta de AWS hogar, ejecute el siguiente comando:<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | AWS DevOps | 

### Prueba de la arquitectura
<a name="test-the-architecture"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Instale los requisitos previos de prueba. | Instale en su estación de trabajo [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [Postman](https://www.postman.com/downloads/) y [jq](https://jqlang.github.io/jq/).Se sugiere usar [Postman](https://www.postman.com/downloads/) 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 AWA Signature Version 4](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) y consulte los puntos de conexión de la API expuestos, que se pueden inspeccionar [exportando la API de REST](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html). | DevOps ingeniero | 
| Asuma el `JobsAPIInvokeRole`. | [Asuma](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html) el `JobsAPIInvokeRole` que apareció en la salida del comando `deploy`:<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | AWS DevOps | 
| Configure Postman. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | 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](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request). | DevOps ingeniero | 

## Resolución de problemas
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-troubleshooting"></a>


| Problema | Solució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](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html). | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | 

## Recursos relacionados
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-resources"></a>
+ [Plantilla de mapeo de API Gateway y referencia de variables de registro de acceso](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [Cambiar la captura de datos para DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)
+ [Bloqueo optimista con número de versión](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)
+ [Uso de Kinesis Data Streams para capturar los cambios en DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)