

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.

# Estructure un proyecto de Python en una arquitectura hexagonal con AWS Lambda
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda"></a>

*Furkan Oruc, Dominik Goby, Darius Kunce y Michal Ploski, Amazon Web Services*

## Resumen
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-summary"></a>

Este patrón muestra cómo estructurar un proyecto de Python en una arquitectura hexagonal mediante AWS Lambda. El patrón utiliza el AWS Cloud Development Kit (AWS CDK) como herramienta de infraestructura como código (IaC), Amazon API Gateway como REST API y Amazon DynamoDB como capa de persistencia. La arquitectura hexagonal sigue los principios de diseño basados en el dominio. En la arquitectura hexagonal, el software consta de tres componentes: dominio, puertos y adaptadores. Para obtener información detallada sobre las arquitecturas hexagonales y sus ventajas, consulte la guía [Creación de arquitecturas hexagonales en AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/)*.*

## Requisitos previos y limitaciones
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-prereqs"></a>

**Requisitos previos **
+ Una cuenta de AWS activa
+ Experiencia en Python
+ Familiaridad con AWS Lambda, AWS CDK, Amazon API Gateway y DynamoDB
+ Una GitHub cuenta (consulte [las instrucciones para registrarse](https://docs.github.com/en/get-started/signing-up-for-github/signing-up-for-a-new-github-account))
+ Git (consulte las [instrucciones de instalación](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git))
+ Un editor de código para realizar cambios e insertar el código GitHub (por ejemplo, [Visual Studio Code](https://code.visualstudio.com/) o [JetBrains PyCharm](https://www.jetbrains.com/pycharm/))
+ Docker instalado y el daemon de Docker en funcionamiento

**Versiones de producto**
+ Git versión 2.24.3 o posterior
+ Python versión 3.7 o posterior
+ AWS CDK v2
+ Poetry versión 1.1.13 o posterior
+ AWS Lambda Powertools para Python, versión 1.25.6 o posterior
+ pytest versión 7.1.1 o posterior
+ Moto versión 3.1.9 o posterior
+ versión 1.9.0 o posterior de pydantic
+ Boto3 versión 1.22.4 o posterior
+ mypy-boto3-dynamodb versión 1.24.0 o posterior

## Arquitectura
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-architecture"></a>

**Pila de tecnología de destino**

La pila de tecnología de destino consiste en un servicio de Python que utiliza API Gateway, Lambda y DynamoDB. El servicio utiliza un adaptador de DynamoDB para conservar los datos. Proporciona una función que utiliza Lambda como punto de entrada. El servicio usa Amazon API Gateway para exponer una REST API. La API utiliza AWS Identity and Access Management (IAM) para la [autenticación de clientes](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html).

**Arquitectura de destino**

Para ilustrar la implementación, este patrón despliega una arquitectura de destino sin servidor. Los clientes pueden enviar solicitudes a un punto de conexión final de API Gateway. API Gateway reenvía la solicitud a la función de Lambda de destino que implementa el patrón de arquitectura hexagonal. La función de Lambda realiza operaciones de creación, lectura, actualización y eliminación (CRUD) en una tabla de DynamoDB.


| 
| 
| Este patrón se probó en un entorno de PoC. Debe realizar una revisión de seguridad para identificar el modelo de amenaza y crear una base de código segura antes de implementar cualquier arquitectura en un entorno de producción.  | 
| --- |

![\[Arquitectura objetivo para estructurar un proyecto de Python en arquitectura hexagonal\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/25bd7169-ea5e-4a21-a865-c91c30a3c0da/images/de0d4f0d-ad19-43ec-bd10-676b25477b64.png)


La API admite cinco operaciones en una entidad de producto:
+ `GET /products` devuelve todos los productos. 
+ `POST /products` crea un nuevo producto. 
+ `GET /products/{id}` devuelve un producto específico.
+ `PUT /products/{id}` actualiza un producto específico. 
+ `DELETE /products/{id}` elimina un producto específico.

Puede utilizar la siguiente estructura de carpetas para organizar el proyecto de forma que siga el patrón de arquitectura hexagonal:  

```
app/  # application code
|--- adapters/  # implementation of the ports defined in the domain
     |--- tests/  # adapter unit tests
|--- entrypoints/  # primary adapters, entry points
     |--- api/  # api entry point
          |--- model/  # api model
          |--- tests/  # end to end api tests
|--- domain/  # domain to implement business logic using hexagonal architecture
     |--- command_handlers/  # handlers used to execute commands on the domain
     |--- commands/  # commands on the domain
     |--- events/  # events triggered via the domain
     |--- exceptions/  # exceptions defined on the domain
     |--- model/  # domain model
     |--- ports/  # abstractions used for external communication
     |--- tests/  # domain tests
|--- libraries/  # List of 3rd party libraries used by the Lambda function
infra/  # infrastructure code
simple-crud-app.py  # AWS CDK v2 app
```

## Tools (Herramientas)
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-tools"></a>

**Servicios de AWS**
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/) es un servicio totalmente gestionado que facilita a los desarrolladores la creación, publicación, mantenimiento, supervisión y protección APIs a cualquier escala.
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) es una base de datos NoSQL de valor clave, sin servidor y totalmente gestionada que está diseñada para ejecutar aplicaciones de alto rendimiento a cualquier escala.
+ [AWS Lambda](https://aws.amazon.com/lambda/) es un servicio de computación controlado por eventos sin servidor que permite ejecutar código para prácticamente cualquier tipo de aplicación o servicio backend, sin aprovisionar ni administrar servidores. Puede lanzar funciones de Lambda desde más de 200 aplicaciones de software como servicio (SaaS) y pagar solo por lo que utilice.

**Herramientas**
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) se utiliza como sistema de control de versiones para el desarrollo de código en este patrón.
+ [Python](https://www.python.org/) se utiliza como lenguaje de programación para este patrón. Python proporciona estructuras de datos de alto nivel y un enfoque de la programación orientada a objetos. AWS Lambda proporciona un tiempo de ejecución de Python integrado que simplifica el funcionamiento de los servicios de Python.
+ [Visual Studio Code](https://code.visualstudio.com/) se utiliza como IDE para desarrollar y probar este patrón. Puede usar cualquier IDE que soporte el desarrollo de Python (por ejemplo, [PyCharm](https://www.jetbrains.com/pycharm/)).
+ [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/) es un marco de desarrollo de software de código abierto que le permite definir los recursos de su aplicación en la nube utilizando lenguajes de programación conocidos. Este patrón utiliza la CDK para escribir e implementar la infraestructura de la nube como código.
+ [Poetry](https://python-poetry.org/) se utiliza para gestionar las dependencias del patrón.
+ AWS CDK utiliza [Docker](https://www.docker.com/) para crear el paquete y la capa de Lambda.

**Código**

El código de este patrón está disponible en el repositorio de ejemplos de [arquitectura hexagonal GitHub Lambda](https://github.com/aws-samples/lambda-hexagonal-architecture-sample).

## Prácticas recomendadas
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-best-practices"></a>

Para usar este patrón en un entorno de producción, siga estas prácticas recomendadas:
+ Utilice las claves administradas por el cliente en AWS Key Management Service (AWS KMS) para cifrar los [grupos de CloudWatch registros de Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html) y las tablas de [Amazon DynamoDB](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html).
+ Configure [AWS WAF para Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) para permitir el acceso únicamente desde la red de su organización.
+ Considere otras opciones para la autorización de API Gateway si IAM no satisface sus necesidades. Por ejemplo, puede usar [grupos de usuarios de Amazon Cognito](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html) o [autorizadores de Lambda de API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html).
+ Utilice [Copias de seguridad de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BackupRestore.html).
+ Configure las funciones de Lambda con una [implementación de nube privada virtual (VPC)](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html) para mantener el tráfico de red dentro de la nube.
+ Actualice la configuración de origen permitida para la [verificación previa del intercambio de recursos entre orígenes (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) para restringir el acceso únicamente al dominio de origen solicitante.
+ Utilice [cdk-nag](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/check-aws-cdk-applications-or-cloudformation-templates-for-best-practices-by-using-cdk-nag-rule-packs.html) para comprobar las prácticas recomendadas de seguridad en el código de AWS CDK.
+ Considere la posibilidad de utilizar herramientas de escaneo de código para detectar problemas de seguridad comunes en el código. Por ejemplo, [Bandit](https://bandit.readthedocs.io/en/latest/) es una herramienta diseñada para detectar problemas de seguridad comunes en el código Python. [PIP-audit](https://pypi.org/project/pip-audit/) escanea los entornos de Python en busca de paquetes que tengan vulnerabilidades conocidas.

Este patrón utiliza [AWS X-Ray](https://aws.amazon.com/xray/?nc1=h_ls) para rastrear las solicitudes a través del punto de entrada, el dominio y los adaptadores de la aplicación. AWS X-Ray ayuda a los desarrolladores a identificar los cuellos de botella y determinar las latencias altas para mejorar el rendimiento de las aplicaciones.

## Epics
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-epics"></a>

### Inicializar el proyecto
<a name="initialize-the-project"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree su propio repositorio. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Instale las dependencias. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Configure su IDE. | Recomendamos Visual Studio Code, pero puede usar cualquier IDE de su elección que sea compatible con Python. Los siguientes pasos son para Visual Studio Code.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
|  Ejecute pruebas unitarias, opción 1: utilice Visual Studio Code. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Ejecute pruebas unitarias, opción 2: utilice comandos del intérprete de comandos. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 

### Implementar y probar la aplicación
<a name="deploy-and-test-the-application"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Solicite credenciales temporales. | Para tener credenciales de AWS en el intérprete de comandos cuando ejecute `cdk deploy`, cree credenciales temporales mediante AWS IAM Identity Center (sucesor de AWS Single Sign-On). Para obtener instrucciones, consulte la entrada del blog [How to retrieve short-term credentials for CLI use with AWS IAM Identity Center](https://aws.amazon.com/blogs/security/aws-single-sign-on-now-enables-command-line-interface-access-for-aws-accounts-using-corporate-credentials/). | Desarrollador de aplicaciones, AWS DevOps | 
| Implemente la aplicación . | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones, AWS DevOps | 
| Pruebe la API, opción 1: utilice la consola. | Utilice la [consola de API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html) para probar la API. Para obtener más información sobre las operaciones y request/response los mensajes de la [API, consulte la sección de uso de la API del archivo readme](https://github.com/aws-samples/lambda-hexagonal-architecture-sample/blob/main/README.md#api-usage) del GitHub repositorio. | Desarrollador de aplicaciones, AWS DevOps | 
| Pruebe la API, opción 2: utilice Postman. | Si quiere utilizar una herramienta como [Postman](https://www.postman.com/):[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones, AWS DevOps | 

### Desarrolle el servicio
<a name="develop-the-service"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Redacte pruebas unitarias para el dominio empresarial. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Implemente comandos y controladores de comandos. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Escriba pruebas de integración para los adaptadores secundarios. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Implemente adaptadores secundarios. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Escribe end-to-end pruebas. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 
| Implemente los adaptadores principales. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Desarrollador de aplicaciones | 

## Recursos relacionados
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-resources"></a>

**Guía de APG**
+ [Creación de arquitecturas hexagonales en AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/)

**Referencias de AWS**
+ [Documentación de AWS Lambda](https://docs.aws.amazon.com/lambda/)
+ [Documentación de AWS SDK](https://docs.aws.amazon.com/cdk/)
  + [Su primera aplicación de AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)
+ [Documentación de API Gateway](https://docs.aws.amazon.com/apigateway/)
  + [Control del acceso a una API con permisos de IAM](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)
  + [Uso de la consola de API Gateway para probar un método de la API de REST](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html)
+ [Documentación de Amazon DynamoDB](https://docs.aws.amazon.com/dynamodb/)

**Herramientas**
+ [Sitio web git-scm.com](https://git-scm.com/)
+ [Instalación de Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ [Crear un GitHub repositorio nuevo](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository)
+ [Sitio web de Python](https://www.python.org/)
+ [AWS Lambda Powertools para Python](https://docs.powertools.aws.dev/lambda/python/latest/)
+ [Sitio web de Postman](https://www.postman.com/)
+ [Biblioteca de objetos simulados de Python](https://docs.python.org/3/library/unittest.mock.html)
+ [Sitio web de Poetry](https://python-poetry.org/)

**IDEs**
+ [Sitio web de Visual Studio Code](https://code.visualstudio.com/)
+ [PyCharm sitio web](https://www.jetbrains.com/pycharm/)