Amazon Web Services (AWS) es la plataforma de computación en la nube más robusta del mercado, encargada de proveer almacenamiento, bases de datos y orquestación de mensajería a nivel global. Desarrollar directamente en la nube pública puede resultar costoso e ineficiente durante las fases tempranas del desarrollo. Sin embargo, AWS permite realizar complejas pruebas de resiliencia, simulando caídas del sistema e interrupciones de red para verificar la capacidad de recuperación automática de las aplicaciones.
LocalStack es una herramienta de código abierto que emula los servicios de AWS directamente en tu máquina local. Permite a los desarrolladores y QAs probar integraciones sin necesidad de conectarse a internet, eliminando la latencia de red y evitando cargos económicos imprevistos en las facturas de la nube.
Para levantar LocalStack de forma rápida y compartir el entorno de manera idéntica con otros equipos de
desarrollo, se utiliza el siguiente archivo estructurado docker-compose.yml:
version: '3.8'
services:
localstack:
image: localstack/localstack:latest
container_name: aws_localstack_emulation
ports:
- "4566:4566" # Puerto universal para todas las APIs de AWS
- "4510-4559:4510-4559" # Puertos externos para funciones internas
environment:
- SERVICES=s3,dynamodb,sqs,sns,lambda
- DEBUG=1
volumes:
- "./localstack_data:/var/lib/localstack"
networks:
- network-cloud-local
networks:
network-cloud-local:
driver: bridge
En el almacenamiento de objetos S3, la suite de pruebas debe validar el ciclo de vida completo de un archivo dentro de un contenedor o Bucket:
Para evaluar la persistencia de datos en bases de datos relacionales (RDS) o no relacionales (DynamoDB), los ingenieros de calidad automatizan las transacciones básicas de control:
[ Create ] ➔ Insertar registros y validar índices de clave. [ Read ] ➔ Consultar elementos evaluando la latencia de respuesta. [ Update ] ➔ Modificar atributos asegurando la consistencia del dato. [ Delete ] ➔ Remover registros comprobando que no afecte la integridad referencial.
El desacoplamiento de microservicios se audita inyectando mensajes en las colas de Amazon SQS (Simple Queue Service) y canales de SNS (Simple Notification Service). Las pruebas aseguran que las transmisiones de datos asíncronas no sufran pérdidas de paquetes, respeten el orden de llegada en colas de tipo FIFO y toleren picos extremos de tráfico de datos.
AWS Lambda ejecuta porciones de código bajo demanda sin necesidad de administrar o aprovisionar servidores físicos.
Desencadenador (Evento S3 / API Gateway) ➔ Invocación de Lambda ➔ Ejecución de Lógica de Negocio ➔ Respuesta/Salida
Boto3 es el SDK oficial de AWS para Python. Permite crear, configurar y gestionar servicios programáticamente. A continuación, se detallan ejemplos listos para producción:
import boto3
# Instanciar el recurso apuntando al endpoint de LocalStack
sqs = boto3.resource('sqs', endpoint_url='http://localhost:4566', region_name='us-east-1')
# Obtener la cola preconfigurada
queue = sqs.get_queue_by_name(QueueName='test')
# Despachar el mensaje
response = queue.send_message(MessageBody='world')
print("ID del Mensaje Enviado:", response.get('MessageId'))
print("Suma de Verificación MD5:", response.get('MD5OfMessageBody'))
queue.send_message(
MessageBody='boto3_custom_payload',
MessageAttributes={
'Author': {
'StringValue': 'Daniel',
'DataType': 'String'
}
}
)
response = queue.send_messages(Entries=[
{
'Id': '1',
'MessageBody': 'primer_mensaje_lote'
},
{
'Id': '2',
'MessageBody': 'segundo_mensaje_lote',
'MessageAttributes': {
'Author': {'StringValue': 'Daniel', 'DataType': 'String'}
}
}
])
if response.get('Failed'):
print("Mensajes fallidos en el lote:", response.get('Failed'))
import boto3
sqs = boto3.resource('sqs', endpoint_url='http://localhost:4566', region_name='us-east-1')
queue = sqs.get_queue_by_name(QueueName='test')
# Polling de mensajes activos en la cola
for message in queue.receive_messages(MessageAttributeNames=['Author']):
author_text = ''
if message.message_attributes is not None:
author_meta = message.message_attributes.get('Author')
if author_meta:
author_text = author_meta.get('StringValue')
print(f"Cuerpo del Mensaje: {message.body} | Autor: {author_text}")
# IMPORTANTE: Confirmar al servicio la remoción del mensaje tras procesarlo de forma exitosa
message.delete()