

# Uso del filtrado de eventos con una fuente de eventos de Amazon SQS
<a name="with-sqs-filtering"></a>

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](invocation-eventfiltering.md).

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

**nota**  
Las asignaciones de orígenes de eventos de Amazon SQS solo admiten el filtrado en la clave `body`.

**Topics**
+ [Conceptos básicos de filtrado de eventos de Amazon SQS](#filtering-SQS)

## Conceptos básicos de filtrado de eventos de Amazon SQS
<a name="filtering-SQS"></a>

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)](invocation-eventfiltering.md#filtering-console) 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)](invocation-eventfiltering.md#filtering-console) 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.  | 