Filtrado de mensajes de SQS e integración de SNS + SQS
Aplique políticas de filtrado de suscripciones de SNS para que cada consumidor de SQS reciba solo los mensajes que necesita, reduciendo el procesamiento innecesario.
Filtrado de mensajes de SQS e integración de SNS + SQS es una lección gratuita de AWS Solutions Architect en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AWS Solutions Architect, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AWS Solutions Architect incluye 4 lecciones en total.
El problema de no utilizar filtrado
En una arquitectura fan-out sin filtrado, cada suscriptor de SQS recibe todos los mensajes de SNS. Si su topic publica eventos de pedidos para 10 categorías de productos diferentes, pero un suscriptor solo procesa pedidos de electrónica, aun así recibe y debe descartar los mensajes de alimentación y ropa. Esto desperdicia recursos de cómputo, aumenta los costes y añade carga innecesaria a los consumidores. Las políticas de filtrado de suscripciones de SNS resuelven este problema haciendo que el propio SNS enrute los mensajes únicamente a los suscriptores adecuados.
Cómo funcionan las políticas de filtrado de SNS
Una política de filtrado es un objeto JSON aplicado a una suscripción de SQS o Lambda. SNS evalúa la política con respecto a los atributos del mensaje antes de realizar la entrega. Si los atributos del mensaje coinciden con la política de filtrado, el mensaje se entrega; si no, SNS omite silenciosamente ese suscriptor. Las políticas de filtrado admiten coincidencia de cadenas, rangos numéricos, coincidencia por prefijo y el operador exists para comprobar si un atributo está presente o ausente.
# Filter policy: only deliver ELECTRONICS orders from US or EU
{
'category': ['ELECTRONICS'],
'region': ['US', 'EU'],
'amount': [{'numeric': ['>=', 100]}]
}Ámbito de la política de filtrado: atributos del mensaje frente al cuerpo
De forma predeterminada, las políticas de filtrado coinciden con los atributos del mensaje (metadatos). Desde 2023, SNS también admite el filtrado basado en la carga útil (cuerpo) si se establece el ámbito de la política de filtrado en MessageBody. Esto permite filtrar directamente el cuerpo del mensaje mediante rutas JSON, sin que los publicadores tengan que añadir atributos. El filtrado del cuerpo es más flexible, pero requiere que el cuerpo del mensaje sea un JSON válido. Confirme siempre qué ámbito coincide con el formato de salida del publicador.
# Set filter scope to MessageBody
aws sns set-subscription-attributes \
--subscription-arn 'arn:aws:sns:...' \
--attribute-name FilterPolicyScope \
--attribute-value MessageBody
aws sns set-subscription-attributes \
--subscription-arn 'arn:aws:sns:...' \
--attribute-name FilterPolicy \
--attribute-value '{"category": ["ELECTRONICS"]}'Condiciones de filtrado numéricas y por prefijo
Las políticas de filtrado admiten varios operadores de coincidencia además de la simple igualdad de cadenas:
- Numeric:
{"numeric": ["=", 100]},{"numeric": [">", 50, "<=", 200]} - Prefix:
{"prefix": "order-"}coincide con cualquier cadena que comience por ese prefijo - Anything-but:
{"anything-but": ["CANCELLED"]}coincide con cualquier valor excepto los indicados - Exists:
{"exists": true}coincide si el atributo está presente;falsesi está ausente
Publicación de mensajes con atributos para el filtrado
Para que el filtrado funcione, el publicador debe incluir atributos del mensaje al publicar en SNS. Los atributos son pares clave-valor con un tipo de datos (String, Number, Binary). El publicador no necesita saber qué políticas de filtrado tienen los suscriptores; solo debe enriquecer el mensaje con atributos que describan el evento. SNS se encarga de enrutarlo automáticamente. Esto mantiene a los publicadores completamente desacoplados de la lógica específica de los suscriptores.
aws sns publish \
--topic-arn 'arn:aws:sns:us-east-1:123456789012:OrderTopic' \
--message '{"orderId": "789", "total": 250.00}' \
--message-attributes '{
"category": {"DataType": "String", "StringValue": "ELECTRONICS"},
"region": {"DataType": "String", "StringValue": "US"},
"amount": {"DataType": "Number", "StringValue": "250"}
}'Fan-out multinivel: SNS + varias colas de SQS
Una topología fan-out avanzada puede tener SNS enroutando mensajes a colas de SQS con distintos niveles de especificidad: una cola recibe todos los pedidos (sin filtro) para auditoría, otra recibe únicamente pedidos HIGH_VALUE (amount >= 1000) para la revisión de fraudes y una tercera recibe solo pedidos ELECTRONICS para el almacén de productos electrónicos. Cada cola de SQS tiene su propio consumidor de Lambda. Este patrón permite escalar cada nivel de procesamiento de forma independiente y añadir nuevos consumidores sin modificar los existentes ni el publicador.
Entrega de SNS a SQS entre cuentas
SNS puede entregar mensajes a colas de SQS de una cuenta de AWS diferente. La política basada en recursos de la cola de SQS debe permitir que la entidad principal de servicio de SNS llame a sqs:SendMessage desde el ARN del topic de SNS de la cuenta publicadora. Esto permite centralizar la publicación de eventos (una cuenta publica y varios equipos de cuentas se suscriben) sin compartir credenciales. El fan-out entre cuentas es un patrón habitual en configuraciones de AWS Organizations con varias cuentas.
# SQS queue policy to allow cross-account SNS delivery
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Principal': {'Service': 'sns.amazonaws.com'},
'Action': 'sqs:SendMessage',
'Resource': 'arn:aws:sqs:us-east-1:CONSUMER_ACCOUNT:MyQueue',
'Condition': {
'ArnEquals': {'aws:SourceArn': 'arn:aws:sns:us-east-1:PUBLISHER_ACCOUNT:MyTopic'}
}
}]
}SQS como búfer antes de Lambda
Cuando el volumen de eventos aumenta repentinamente, las invocaciones directas de SNS a Lambda escalan Lambda de inmediato, lo que puede sobrecargar las bases de datos o las API posteriores. Añadir SQS entre SNS y Lambda crea un búfer: SNS entrega los mensajes a SQS y Lambda sondea SQS con un tamaño de lote controlado. Esto permite que Lambda procese los mensajes a un ritmo sostenible mientras SQS absorbe los picos de tráfico. La profundidad de la cola actúa como mecanismo de retropresión: puede supervisarla y generar una alerta cuando supere un umbral que indique retraso del consumidor.
Comparación entre Lambda directa y fan-out con búfer de SQS
SNS → Lambda (directo): latencia mínima, sin búfer y escalado inmediato de Lambda. Es la mejor opción para alertas en tiempo real o notificaciones urgentes en las que importa una latencia inferior a un segundo. SNS → SQS → Lambda: añade compatibilidad con DLQ, rendimiento controlado, reintentos con tiempo de espera de visibilidad y supervisión de la profundidad de la cola. Es la mejor opción para el procesamiento de transacciones, las actualizaciones de inventario y cualquier escenario en el que deban respetarse los límites de los sistemas posteriores. En las preguntas del examen, elija el búfer de SQS siempre que se mencionen la durabilidad y el control de la tasa.
Prueba de las políticas de filtrado
Utilice el editor de políticas de filtrado de la consola de SNS para comprobar si un mensaje de ejemplo coincidiría con su política de filtrado antes de implementarla. También puede utilizar SNS Sandbox para simular la entrega de mensajes y verificar el enrutamiento. En el código, valide las políticas de filtrado mediante la publicación de mensajes de prueba con atributos conocidos y compruebe las métricas de CloudWatch de cada suscripción: la métrica NumberOfMessagesFiltered muestra cuántos mensajes bloqueó el filtro, lo que le ayuda a ajustar las políticas sin tener que esperar a eventos en producción.
Resumen de la integración de extremo a extremo
Una integración completa de SNS + SQS funciona de la siguiente manera: (1) la aplicación publica un evento en un tema estándar de SNS con atributos de mensaje; (2) SNS evalúa la política de filtrado de cada suscripción y entrega únicamente los mensajes coincidentes a cada cola de SQS; (3) Lambda sondea cada cola de SQS con un tamaño de lote configurado y procesa los mensajes; (4) los mensajes fallidos llegan a la DLQ de la cola después de alcanzar maxReceiveCount; (5) una alarma de CloudWatch sobre la profundidad de la DLQ alerta al equipo. Este patrón totalmente desacoplado y resistente es un modelo de arquitectura SAA-C03.
Comprobación rápida
Compruebe sus conocimientos sobre los conceptos de AWS Solutions Architect (SAA-C03) de esta lección.
Repaso de la lección
En esta lección ha aprendido que las políticas de filtrado de SNS enrutan los mensajes en función de sus atributos o del contenido del cuerpo en el nivel de SNS, lo que elimina el procesamiento innecesario por parte de los consumidores posteriores; el patrón SNS→SQS→Lambda añade almacenamiento en búfer duradero y control de la velocidad entre la difusión a múltiples destinos y el procesamiento; y la entrega de SQS entre cuentas permite implementar una arquitectura pub/sub centralizada en entornos con varias cuentas mediante políticas de recursos de cola. A continuación, exploraremos las API REST, HTTP y WebSocket de Amazon API Gateway.
Preguntas frecuentes
¿La lección «Filtrado de mensajes de SQS e integración de SNS + SQS» es gratis?
Sí — el texto completo de «Filtrado de mensajes de SQS e integración de SNS + SQS» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AWS Solutions Architect, actualiza a CoddyKit PRO. El curso de AWS Solutions Architect incluye 4 lecciones en total.
¿Qué aprenderé en «Filtrado de mensajes de SQS e integración de SNS + SQS»?
Aplique políticas de filtrado de suscripciones de SNS para que cada consumidor de SQS reciba solo los mensajes que necesita, reduciendo el procesamiento innecesario. Practicas AWS Solutions Architect con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AWS Solutions Architect?
No se requiere experiencia previa. AWS Solutions Architect en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Filtrado de mensajes de SQS e integración de SNS + SQS»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AWS Solutions Architect?
Sí. Cada lección de AWS Solutions Architect incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Colas SQS Standard frente a FIFO
- Tiempo de espera de visibilidad, DLQ y long polling
- Temas de SNS y arquitectura fan-out
- Filtrado de mensajes de SQS e integración de SNS + SQS