En este tutorial aprenderás a construir un sistema que detecta de forma automática información de identificación personal (PII) en documentos almacenados en Amazon S3. El objetivo es entender la arquitectura general: en un entorno real, podrías sustituir la lógica de detección por una llamada a Amazon Comprehend para obtener resultados mucho más precisos.
¿Qué vamos a construir?
El flujo es el siguiente: cuando se sube un archivo al bucket S3 de entrada, una función Lambda se activa automáticamente, analiza el contenido con Amazon Rekognition y decide si el archivo contiene datos sensibles. Si los contiene, lo elimina y envía una notificación por correo electrónico vía SNS. Si está limpio, lo mueve al bucket de destino.
1. Crear los buckets de S3
Necesitamos dos buckets. Los sufijos numéricos son para garantizar nombres únicos en AWS:
s3-input-documents-25326— bucket de entrada (acceso público bloqueado, cifrado activado)s3-clean-documents-25326— bucket de destino para archivos limpios (acceso público bloqueado, cifrado activado)
2. Crear la función Lambda
Crea una función Lambda llamada analizar con el runtime Python 3.12. Esta función se disparará cada vez que se suba un archivo al bucket de entrada.
Permisos IAM necesarios
Si usas AWS Academy, puedes asignar el rol LabRole. Si tienes capacidad de crear roles propios, asegúrate de incluir los siguientes permisos:
s3:GetObjects3:DeleteObjects3:PutObjectsns:Publish
Código de la función
Sustituye el código por defecto por el siguiente. Está escrito con ayuda de Claude (IA de Anthropic) como punto de partida:
import boto3
import os
import re
s3 = boto3.client('s3')
sns = boto3.client('sns')
rekognition = boto3.client('rekognition')
SNS_TOPIC_ARN = os.environ['SNS_TOPIC_ARN']
DEST_BUCKET = os.environ['DEST_BUCKET']
SOURCE_BUCKET = os.environ['SOURCE_BUCKET']
def is_valid_key(key):
return bool(re.match(r'^[\w\-. /]+$', key)) and '..' not in key
def lambda_handler(event, context):
try:
record = event['Records'][0]
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
except (KeyError, IndexError) as e:
print(f"Evento malformado: {e}")
return {'statusCode': 400, 'body': 'Evento inválido'}
if bucket != SOURCE_BUCKET:
print(f"Bucket inesperado: {bucket}")
return {'statusCode': 403, 'body': 'Bucket no autorizado'}
if not is_valid_key(key):
print(f"Clave inválida o sospechosa: {key}")
return {'statusCode': 400, 'body': 'Clave de objeto inválida'}
try:
res = rekognition.detect_text(Image={'S3Object': {'Bucket': bucket, 'Name': key}})
content = str(res['TextDetections'])
if "@" in content or "password" in content.lower():
# PII detectado — eliminar y notificar
s3.delete_object(Bucket=bucket, Key=key)
sns.publish(
TopicArn=SNS_TOPIC_ARN,
Subject="PII detectado en Imagen",
Message=f"La imagen {key} contenía datos sensibles y fue eliminada."
)
print(f"PII detectado y eliminado: {key}")
else:
s3.copy_object(
Bucket=DEST_BUCKET,
CopySource={'Bucket': bucket, 'Key': key},
Key=key
)
s3.delete_object(Bucket=bucket, Key=key)
print(f"Archivo limpio movido a {DEST_BUCKET}: {key}")
except rekognition.exceptions.InvalidImageException as e:
print(f"Formato de imagen no soportado por Rekognition: {e}")
return {'statusCode': 422, 'body': 'Imagen no procesable'}
except Exception as e:
print(f"Error inesperado procesando {key}: {e}")
raise
return {'statusCode': 200, 'body': 'Procesado correctamente'}
Configuración adicional
En la pestaña de configuración de la función, sube el Timeout a 10 segundos para asegurarte de que Rekognition tenga tiempo de procesar la imagen antes de que Lambda finalice. Opcionalmente, puedes subir la memoria de 128 MB a 256 MB para acelerar la ejecución (no es necesario para este tutorial).
3. Configurar el trigger de S3
Añade un trigger a la función Lambda para que se active automáticamente cuando se suba cualquier objeto al bucket s3-input-documents-25326. Esto conecta el almacenamiento con la lógica de procesamiento.
4. Crear el topic de SNS
Crea un topic de tipo Standard con el nombre Mensaje-email-archivos. A continuación, crea una suscripción al topic usando tu dirección de correo electrónico. Recibirás un email de confirmación que debes aceptar para activar la suscripción.
Limitaciones y próximos pasos
La detección de PII en este tutorial es intencionadamente simple: busca el símbolo @ o la palabra password en el texto extraído. Esto no es realista en producción, pero sirve para entender el flujo completo.
Rekognition actúa como un OCR: extrae texto de imágenes pero no comprende su significado. Para una detección real de PII necesitas una IA que entienda el contexto. La solución natural en el ecosistema AWS es encadenar ambos servicios:
- Usar Rekognition para extraer el texto de la imagen
- Pasar ese texto a Amazon Comprehend, que sí es capaz de identificar entidades como nombres, números de documento, direcciones o datos bancarios
Este tutorial sienta las bases de esa arquitectura. La sustitución del paso de detección es el siguiente paso lógico si quieres llevarlo a un entorno real.
No hay comentarios:
Publicar un comentario