Uso del filtrado de eventos con una fuente de eventos de Amazon SQS - AWS Lambda

Uso del filtrado de eventos con una fuente de eventos de Amazon SQS

Puede utilizar el filtrado de eventos para controlar qué registros de un flujo o una cola envía Lambda a su función. Para obtener información general sobre cómo funciona el filtrado de eventos, consulte Controle qué eventos envía Lambda a la función.

Esta sección se centra en el filtrado de eventos para las fuentes de eventos de Amazon MSK.

Conceptos básicos de filtrado de eventos de Amazon SQS

Supongamos que su cola de Amazon SQS contiene mensajes en el siguiente formato JSON.

{ "RecordNumber": 1234, "TimeStamp": "yyyy-mm-ddThh:mm:ss", "RequestCode": "AAAA" }

Un registro de ejemplo para esta cola tendría el siguiente aspecto.

{ "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" }

Para filtrar en función del contenido de los mensajes de Amazon SQS, utilice la clave body del registro de mensajes de Amazon SQS. Supongamos que desea procesar solo los registros en los que el RequestCode del mensaje de Amazon SQS sea “BBBB”. El objeto FilterCriteria sería el siguiente.

{ "Filters": [ { "Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }" } ] }

Para mayor claridad, este es el valor del Pattern del filtro ampliado en JSON no cifrado.

{ "body": { "RequestCode": [ "BBBB" ] } }

Puede agregar el filtro mediante la consola, la AWS CLI o una plantilla de AWS SAM.

Console

Para agregar este filtro mediante la consola, siga las instrucciones que se indican en Adjuntar criterios de filtro a una asignación de origen de eventos (consola) e ingrese la siguiente cadena para los Criterios de filtro.

{ "body" : { "RequestCode" : [ "BBBB" ] } }
AWS CLI

Para crear una nueva asignación de orígenes de eventos con estos criterios de filtro mediante la AWS Command Line Interface (AWS CLI), ejecute el siguiente comando.

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'

Para agregar estos criterios de filtro a una asignación de orígenes de eventos existente, ejecute el siguiente comando.

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
AWS SAM

Para agregar este filtro mediante AWS SAM, agregue el siguiente fragmento a la plantilla YAML de su origen de eventos.

FilterCriteria: Filters: - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'

Supongamos que desea que su función procese solo los registros en los que RecordNumber sea un valor superior a 9999. El objeto FilterCriteria sería el siguiente.

{ "Filters": [ { "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }" } ] }

Para mayor claridad, este es el valor del Pattern del filtro ampliado en JSON no cifrado.

{ "body": { "RecordNumber": [ { "numeric": [ ">", 9999 ] } ] } }

Puede agregar el filtro mediante la consola, la AWS CLI o una plantilla de AWS SAM.

Console

Para agregar este filtro mediante la consola, siga las instrucciones que se indican en Adjuntar criterios de filtro a una asignación de origen de eventos (consola) e ingrese la siguiente cadena para los Criterios de filtro.

{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
AWS CLI

Para crear una nueva asignación de orígenes de eventos con estos criterios de filtro mediante la AWS Command Line Interface (AWS CLI), ejecute el siguiente comando.

aws lambda create-event-source-mapping \ --function-name my-function \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'

Para agregar estos criterios de filtro a una asignación de orígenes de eventos existente, ejecute el siguiente comando.

aws lambda update-event-source-mapping \ --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \ --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
AWS SAM

Para agregar este filtro mediante AWS SAM, agregue el siguiente fragmento a la plantilla YAML de su origen de eventos.

FilterCriteria: Filters: - Pattern: '{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }'

Para Amazon SQS, el cuerpo del mensaje puede ser cualquier cadena. No obstante, esto puede ser problemático si los FilterCriteria esperan que el formato JSON del body sea válido. La situación inversa también es problemática: si el cuerpo del mensaje entrante está en formato JSON, pero los criterios de filtro esperan que el body sea una cadena sin formato, puede producirse un comportamiento no deseado.

Para evitar este problema, asegúrese de que el formato del cuerpo de los FilterCriteria coincida con el formato esperado del body de los mensajes que recibe de la cola. Antes de filtrar los mensajes, Lambda evalúa automáticamente el formato del cuerpo del mensaje entrante y del patrón de filtro del body. Si no coincide, Lambda elimina el mensaje. En la siguiente tabla se resume esta evaluación:

Formato del body del mensaje entrante Formato del body del patrón de filtro Acción resultante

Cadena sin formato

Cadena sin formato

Lambda filtra en función de los criterios de filtro.

Cadena sin formato

Sin patrón de filtro para las propiedades de datos

Lambda filtra (solo en las demás propiedades de metadatos) en función de los criterios de filtro.

Cadena sin formato

JSON válido

Lambda elimina el mensaje.

JSON válido

Cadena sin formato

Lambda elimina el mensaje.

JSON válido

Sin patrón de filtro para las propiedades de datos

Lambda filtra (solo en las demás propiedades de metadatos) en función de los criterios de filtro.

JSON válido

JSON válido

Lambda filtra en función de los criterios de filtro.