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.
Estructura un proyecto de Python en una arquitectura hexagonal usando Lambda AWS
Creada por Furkan Oruc (AWS), Dominik Goby (), Darius Kunce (AWS) y Michal Ploski () AWS AWS
Entorno: PoC o piloto | Tecnologías: aplicaciones web y móviles; contenedores y microservicios; tecnología sin servidor; modernización | AWSservicios: Amazon DynamoDBAWS; Lambda; Amazon Gateway API |
Resumen
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 (AWSCDK) como herramienta de infraestructura como código (IaC), Amazon API Gateway como capa de persistencia 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 Construir arquitecturas hexagonales sobre ellas. AWS
Requisitos previos y limitaciones
Requisitos previos
Una cuenta activa AWS
Experiencia en Python
Familiaridad con AWS Lambda AWSCDK, API Amazon Gateway y DynamoDB
Una GitHub cuenta (consulte las instrucciones
para registrarse) Git (consulte las instrucciones de instalación
) Un editor de código para realizar cambios y enviar el código a él GitHub (por ejemplo, Visual Studio Code
o JetBrains 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
AWSCDKv2
Poetry versión 1.1.13 o posterior
AWSLambda 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
Pila de tecnología de destino
La pila tecnológica 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 utiliza Amazon API Gateway para exponer un RESTAPI. APIUtiliza AWS Identity and Access Management (IAM) para la autenticación de los clientes.
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 final de API Gateway. APIGateway reenvía la solicitud a la función Lambda de destino que implementa el patrón de arquitectura hexagonal. La función Lambda realiza operaciones de creación, lectura, actualización y eliminación (CRUD) en una tabla de DynamoDB.
Importante: este patrón se probó en un entorno 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. |
---|
APIAdmite 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
Herramientas
AWSservicios
Amazon 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
es una base de datos sin valor clave totalmente gestionada, sin servidores y diseñada para ejecutar SQL aplicaciones de alto rendimiento a cualquier escala. AWSLambda
es un servicio informático sin servidor y basado en eventos que le permite ejecutar código para prácticamente cualquier tipo de aplicación o servicio de backend sin aprovisionar ni administrar servidores. Puede lanzar funciones Lambda desde más de 200 AWS servicios y aplicaciones de software como servicio (SaaS) y pagar solo por lo que utilice.
Herramientas
Git
se utiliza como sistema de control de versiones para el desarrollo de código en este patrón. Python
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. AWSLambda proporciona un motor de ejecución de Python integrado que simplifica el funcionamiento de los servicios de Python. Se utiliza Visual Studio Code
IDE para el desarrollo y las pruebas de este patrón. Puede usar cualquiera IDE que soporte el desarrollo de Python (por ejemplo, PyCharm ). AWSCloud Development Kit (AWSCDK
) es un marco de desarrollo de software de código abierto que le permite definir los recursos de sus aplicaciones en la nube mediante lenguajes de programación conocidos. Este patrón lo utiliza CDK para escribir e implementar la infraestructura de la nube como código. Poetry
se utiliza para gestionar las dependencias del patrón. El utiliza Docker
AWS CDK para crear el paquete y la capa Lambda.
Código
El código de este patrón está disponible en el repositorio de ejemplos de arquitectura hexagonal GitHub Lambda
Prácticas recomendadas
Para usar este patrón en un entorno de producción, siga estas prácticas recomendadas:
Utilice las claves gestionadas por el cliente en AWS Key Management Service (AWSKMS) para cifrar los grupos de CloudWatch registros de Amazon y las tablas de Amazon DynamoDB.
Configure AWSWAFAmazon API Gateway para permitir el acceso solo desde la red de su organización.
Considere otras opciones para la autorización de API Gateway si IAM no se ajustan a sus necesidades. Por ejemplo, puede usar grupos de usuarios de Amazon Cognito o autorizadores de Gateway API Lambda.
Utilice Copias de seguridad de DynamoDB.
Configure las funciones de Lambda con una implementación de nube privada virtual (VPC) 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) para
restringir el acceso únicamente al dominio de origen solicitante. Usa cdk-nag para comprobar las mejores prácticas de seguridad en el AWS CDK código.
Considere la posibilidad de utilizar herramientas de escaneo de código para detectar problemas de seguridad comunes en el código. Por ejemplo, Bandit
es una herramienta diseñada para detectar problemas de seguridad comunes en el código Python. PIP-audit escanea los entornos de Python en busca de paquetes que tengan vulnerabilidades conocidas.
Este patrón utiliza AWSX-Ray
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree su propio repositorio. |
| Desarrollador de aplicaciones |
Instale las dependencias. |
| Desarrollador de aplicaciones |
Configure su. IDE | Recomendamos Visual Studio Code, pero puede usar cualquiera IDE de sus preferencias que sea compatible con Python. Los siguientes pasos son para Visual Studio Code.
| Desarrollador de aplicaciones |
Ejecute pruebas unitarias, opción 1: utilice Visual Studio Code. |
| Desarrollador de aplicaciones |
Ejecute pruebas unitarias, opción 2: utilice comandos del intérprete de comandos. |
| Desarrollador de aplicaciones |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Solicite credenciales temporales. | Para tener AWS credenciales en el shell al ejecutar | Desarrollador de aplicaciones, AWS DevOps |
Implemente la aplicación . |
| Desarrollador de aplicaciones, AWS DevOps |
Pruebe la API opción 1: utilice la consola. | Utilice la consola API Gateway para probar elAPI. Para obtener más información sobre API las operaciones y los mensajes de solicitud/respuesta, consulte la sección de API uso del archivo readme | Desarrollador de aplicaciones, AWS DevOps |
Pruebe la API opción 2: utilice Postman. | Si quiere utilizar una herramienta como Postman
| Desarrollador de aplicaciones, AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Redacte pruebas unitarias para el dominio empresarial. |
| Desarrollador de aplicaciones |
Implemente comandos y controladores de comandos. |
| Desarrollador de aplicaciones |
Escriba pruebas de integración para los adaptadores secundarios. |
| Desarrollador de aplicaciones |
Implemente adaptadores secundarios. |
| Desarrollador de aplicaciones |
Escribe end-to-end pruebas. |
| Desarrollador de aplicaciones |
Implemente los adaptadores principales. |
| Desarrollador de aplicaciones |
Recursos relacionados
APGguía
AWSReferencias
Herramientas
IDEs