

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.

# Ejecute lecturas paralelas de objetos S3 mediante Python en una AWS Lambda función
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function"></a>

*Eduardo Bortoluzzi, Amazon Web Services*

## Resumen
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-summary"></a>

Puede utilizar este patrón para recuperar y resumir una lista de documentos de buckets de Amazon Simple Storage Service (Amazon S3) en tiempo real. El patrón proporciona código de ejemplo para leer en paralelo objetos de buckets de S3 en Amazon Web Services (AWS). El patrón muestra cómo ejecutar eficientemente tareas I/O enlazadas con AWS Lambda funciones usando Python.

Una empresa financiera utilizó este patrón en una solución interactiva para aprobar o rechazar manualmente las transacciones financieras correlacionadas en tiempo real. Los documentos de las transacciones financieras se almacenaron en un bucket de S3 relacionado con el mercado. Un operador seleccionó una lista de documentos del bucket de S3, analizó el valor total de las transacciones calculadas por la solución y decidió aprobar o rechazar el lote seleccionado.

Las tareas vinculadas a operacioness de E/S admiten varios subprocesos. En este código de ejemplo, el [concurrent.futures. ThreadPoolExecutor](https://docs.python.org/3.13/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)se utiliza con un máximo de 30 subprocesos simultáneos, aunque las funciones Lambda admiten hasta 1024 subprocesos (uno de los cuales es el proceso principal). Este límite se debe a que demasiados subprocesos crean problemas de latencia debido al cambio de contexto y al uso de los recursos de computación. También es necesario aumentar el número máximo de conexiones del grupo en `botocore` para que todos los subprocesos puedan descargar el objeto de S3 de forma simultánea.

El código de ejemplo usa un objeto de 8,3 KB, con datos JSON en un bucket de S3. El objeto se lee varias veces. Cuando la función de Lambda lee el objeto, los datos JSON se decodifican en un objeto de Python. En diciembre de 2024, el resultado tras ejecutar este ejemplo fue de 1000 lecturas procesadas en 2,3 segundos y 10 000 lecturas procesadas en 27 segundos mediante una función Lambda configurada con 2304 MB de memoria. AWS Lambda admite configuraciones de memoria de 128 MB a 10 240 MB (10 GB), aunque aumentar la memoria Lambda a más de 2304 MB no ayudó a reducir el tiempo de ejecución de esta tarea específica vinculada a la E/S.

La herramienta [AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) se utilizó para probar diferentes configuraciones de memoria Lambda y verificar la mejor performance-to-cost relación para la tarea. Para obtener más información, consulte la sección [Información adicional](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional).

## Requisitos previos y limitaciones
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ Competencia en desarrollo con Python.

**Limitaciones**
+ Una función de Lambda puede tener como máximo [1024 procesos o subprocesos de puesta en marcha](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution).
+  Cuentas de AWS Los nuevos tienen un límite de memoria Lambda de 3.008 MB. Ajuste la herramienta de ajuste AWS Lambda de potencia en consecuencia. Para obtener más información, consulte la sección [Solución de problemas](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting).
+ Amazon S3 tiene un límite de [5500 GET/HEAD solicitudes por segundo por prefijo particionado](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html).

**Versiones de producto**
+ Python 3.9 o posterior
+ AWS Cloud Development Kit (AWS CDK) v2
+ AWS Command Line Interface (AWS CLI) versión 2
+ AWS Lambda Power Tuning 4.3.6 (opcional)

## Arquitectura
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-architecture"></a>

**Pila de tecnología de destino**
+ AWS Lambda
+ Amazon S3
+ AWS Step Functions (si se ha implementado AWS Lambda Power Tuning)

**Arquitectura de destino**

En el siguiente diagrama, se muestra una función de Lambda que lee objetos de un bucket de S3 en paralelo. El diagrama también incluye un flujo de trabajo de Step Functions para que la herramienta AWS Lambda Power Tuning ajuste con precisión la memoria de funciones Lambda. Este refinamiento permite lograr un buen equilibrio entre el costo y el rendimiento.

![\[Diagrama que muestra la función de Lambda, el bucket de S3 y AWS Step Functions.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/828696e2-6df7-4536-9205-951c99449f4e.png)


**Automatización y escala**

Las funciones de Lambda se escalan rápidamente cuando es necesario. Para evitar los errores 503 de ralentización de Amazon S3 cuando hay mucha demanda, le recomendamos que ponga algunos límites al escalado.

## Tools (Herramientas)
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-tools"></a>

**Servicios de AWS**
+ [AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) es un marco de desarrollo de software que le ayuda a definir y aprovisionar la Nube de AWS infraestructura en código. La infraestructura de ejemplo se creó para implementarla con AWS CDK.
+ [AWS Command Line InterfaceAWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)es una herramienta de código abierto que le ayuda a interactuar Servicios de AWS mediante comandos en su shell de línea de comandos. En este patrón, la AWS CLI versión 2 se utiliza para cargar un archivo JSON de ejemplo.
+ [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 Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) es un servicio de almacenamiento de objetos basado en la nube que le permite almacenar, proteger y recuperar cualquier cantidad de datos.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)es un servicio de organización sin servidor que le ayuda a combinar AWS Lambda funciones y otros servicios de AWS para crear aplicaciones críticas para la empresa.

**Otras herramientas**
+ [Python](https://www.python.org/) es un lenguaje de programación informático de uso general. La [reutilización de subprocesos de trabajo inactivos](https://docs.python.org/3.8/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) se introdujo en la versión 3.8 de Python, y el código de la función de Lambda de este patrón se creó para la versión 3.9 y posteriores de Python.

**Repositorio de código**

El código de este patrón está disponible en el repositorio. [aws-lambda-parallel-download](https://github.com/aws-samples/aws-lambda-parallel-download) GitHub 

## Prácticas recomendadas
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-best-practices"></a>
+ Esta AWS CDK construcción se basa en sus permisos Cuenta de AWS de usuario para implementar la infraestructura. [Si tienes pensado usar AWS CDK Pipelines o despliegues multicuenta, consulta los sintetizadores Stack.](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-synthesizers)
+ Esta aplicación de ejemplo no tiene habilitados los registros de acceso en el bucket de S3. Se recomienda habilitar los registros de acceso en el código de producción.

## Epics
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-epics"></a>

### Preparación del entorno de desarrollo
<a name="prepare-the-development-environment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Compruebe la versión instalada de Python. | Este código se probó específicamente en Python 3.9 y Python 3.13, y debería funcionar en todas las versiones entre estas versiones. Para comprobar su versión de Python, use el comando `python3 -V` en su terminal e instale una versión más reciente si es necesario.Para verificar que los módulos necesarios estén instalados, use `python3 -c "import pip, venv"`. Si no aparece ningún mensaje de error, significa que los módulos están instalados correctamente y que todo está listo para poner en marcha este ejemplo.  | Arquitecto de la nube | 
| Instala. AWS CDK | Para instalarlo AWS CDK si aún no está instalado, siga las instrucciones que aparecen en [Introducción al AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). Para confirmar que la AWS CDK versión instalada es 2.0 o posterior, ejecute`cdk –version`. | Arquitecto de la nube | 
| Arranque su entorno de . | Para arrancar su entorno, si aún no lo ha hecho, siga las instrucciones de [Bootstrap your environment for use with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping-env.html). | Arquitecto de la nube | 

### Clonación del repositorio de ejemplo
<a name="clone-the-example-repository"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Clonar el repositorio. | Para instalar la versión más reciente del repositorio, use el siguiente comando:<pre>git clone --depth 1 --branch v1.2.0 \<br />git@github.com:aws-samples/aws-lambda-parallel-download.git</pre> | Arquitecto de la nube | 
| Cambie el directorio de trabajo al repositorio clonado. | Use el siguiente comando:<pre>cd aws-lambda-parallel-download</pre> | Arquitecto de la nube | 
| Cree un entorno virtual de Python. | Para crear un entorno virtual de Python, use el siguiente comando:<pre>python3 -m venv .venv</pre> | Arquitecto de la nube | 
| Active el entorno virtual. | Para activar el entorno virtual, puede usar el siguiente comando:<pre>source .venv/bin/activate</pre> | Arquitecto de la nube | 
| Instalar las dependencias. | Para instalar las dependencias de Python, use el comando `pip`:<pre>pip install -r requirements.txt</pre> | Arquitecto de la nube | 
| Examine el código. | (Opcional) El código de ejemplo que descarga un objeto del bucket de S3 está en `resources/parallel.py`.El código de la infraestructura está en la carpeta `parallel_download`. | Arquitecto de la nube | 

### Implementación y pruebas de la aplicación
<a name="deploy-and-test-the-app"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Implemente la aplicación. | Ejecute `cdk deploy`.Anote los AWS CDK resultados:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | Arquitecto de la nube | 
| Cargue un archivo JSON de ejemplo. | El repositorio contiene un archivo JSON de ejemplo de unos 9 KB. Para cargar el archivo en el bucket de S3 de la pila creada, use el siguiente comando:<pre>aws s3 cp sample.json s3://<ParallelDownloadStack.SampleS3BucketName></pre>Reemplace `<ParallelDownloadStack.SampleS3BucketName>` con el valor correspondiente de la AWS CDK salida. | Arquitecto de la nube | 
| Ejecute la aplicación. | Para poner en marcha la aplicación, haga lo siguiente:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | Arquitecto de la nube | 
| Agregue el número de descargas. | (Opcional) Para poner en marcha 1500 llamadas a get object, use el siguiente JSON en **Evento JSON** del parámetro `Test`:<pre>{"repeat": 1500, "objectKey": "sample.json"}</pre> | Arquitecto de la nube | 

### Opcional: ejecute Power Tuning AWS Lambda
<a name="optional-run-lamlong-power-tuning"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Ejecute la herramienta AWS Lambda de ajuste de potencia. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html)Al final de la ejecución, el resultado aparecerá en la pestaña **Entrada y salida de ejecución**. | Arquitecto de la nube | 
| Vea los resultados del ajuste de AWS Lambda potencia en un gráfico. | En la pestaña **Entrada y salida de ejecución**, copie el enlace de la propiedad `visualization` y péguelo en una nueva pestaña del navegador. | Arquitecto de la nube | 

### Limpieza
<a name="clean-up"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Elimine los objetos del bucket de S3. | Antes de destruir los recursos implementados, debe eliminar todos los objetos del bucket de S3:<pre>aws s3 rm s3://<ParallelDownloadStack.SampleS3BucketName> \<br />--recursive</pre>Recuerde `<ParallelDownloadStack.SampleS3BucketName>` sustituir por el valor de las AWS CDK salidas. | Arquitecto de la nube | 
| Destruya los recursos. | Para destruir todos los recursos que se hayan creado para este piloto, use el siguiente comando:<pre>cdk destroy</pre> | Arquitecto de la nube | 

## Resolución de problemas
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting"></a>


| Problema | Solución | 
| --- | --- | 
| `'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008` | En el caso de las cuentas nuevas, es posible que no pueda configurar más de 3008 MB en las funciones de Lambda. Para probar con AWS Lambda Power Tuning, añada la siguiente propiedad en el JSON de entrada al iniciar la ejecución de Step Functions:<pre>"powerValues": [<br />    512,<br />    1024,<br />    1536,<br />    2048,<br />    2560,<br />    3008<br />  ]</pre> | 

## Recursos relacionados
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-resources"></a>
+ [Python: futuros simultáneos. ThreadPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)
+ [Cuotas de Lambda: Configuración, implementación y ejecución de funciones](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)
+ [Trabajando con el AWS CDK en Python](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [Funciones de creación de perfiles con AWS Lambda Power Tuning](https://docs.aws.amazon.com/lambda/latest/operatorguide/profile-functions.html)

## Información adicional
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional"></a>

**Código**

El siguiente fragmento de código realiza el procesamiento paralelo I/O :

```
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
  for result in executor.map(a_function, (the_arguments)):
    ...
```

`ThreadPoolExecutor` reutiliza los subprocesos cuando están disponibles.

**Pruebas y resultados**

Estas pruebas se realizaron en diciembre de 2024.

La primera prueba procesó 2500 lecturas de objetos, con el siguiente resultado:

![\[El tiempo de invocación disminuye, mientras que el costo de la invocación es mayor a medida que aumenta la memoria.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f6743412-1e52-4c4c-a51c-ac0f75b3b998.png)


A partir de 3009 MB, el nivel de tiempo de procesamiento se mantuvo prácticamente igual para cualquier incremento de memoria, pero el costo se hacía mayor a medida que aumentaba el tamaño de la memoria.

En otra prueba, se investigó el intervalo entre 1536 MB y 3072 MB de memoria. Se utilizaron valores que eran múltiplos de 256 MB y se procesaron 10 000 lecturas de objetos; los resultados son los siguientes:

![\[Se redujo la diferencia entre el descenso del tiempo de invocación y el aumento del costo de la invocación.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/c75d4443-74d8-4b93-9b4d-b2640869381e.png)


La mejor performance-to-cost relación fue con la configuración Lambda de 2.304 MB de memoria.

A modo de comparación, un proceso secuencial de 2500 lecturas de objetos tardó 47 segundos. El proceso paralelo con la configuración de Lambda de 2304 MB tardó 7 segundos, lo que supone un 85 por ciento menos.

![\[Gráfico que muestra la disminución del tiempo al cambiar del procesamiento secuencial al procesamiento paralelo.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f3dcc44d-ac20-4b75-897d-1d71f0d59781.png)
