Usar a filtragem de eventos com uma origem de eventos do Amazon SQS - AWS Lambda

Usar a filtragem de eventos com uma origem de eventos do Amazon SQS

É possível usar filtragem de eventos para controlar quais registros de um stream ou fila que o Lambda enviará para a função. Para obter informações gerais sobre como a filtragem de eventos funciona, consulte Controlar quais eventos o Lambda envia para a função.

Esta seção tem como foco a filtragem de eventos para as origens de eventos do Amazon MSK.

Conceitos básicos de filtragem de eventos do Amazon SQS

Suponha que sua fila do Amazon SQS contenha mensagens no formato JSON a seguir.

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

Um exemplo de registro para essa fila seria como a seguir.

{ "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 com base no conteúdo de suas mensagens do Amazon SQS, use a chave body no registro de mensagens do Amazon SQS. Suponha que você queira processar somente os registros onde o RequestCode na sua mensagem do Amazon SQS seja “BBBB”. O objeto FilterCriteria seria como a seguir.

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

Para maior clareza, aqui está o valor de Pattern do filtro expandido em JSON simples.

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

É possível adicionar seu filtro usando o console, a AWS CLI ou um modelo do AWS SAM.

Console

Para adicionar esse filtro usando o console, siga as instruções em Anexar critérios de filtro a um mapeamento de fonte de eventos (console) e insira a string a seguir em Critérios do filtro.

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

Para criar um novo mapeamento da origem do evento com esses critérios de filtro usando a AWS Command Line Interface (AWS CLI), execute o comando a seguir.

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 adicionar esses critérios de filtro a um mapeamento da origem do evento existente, execute o comando a seguir.

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

Para adicionar esse filtro usando o AWS SAM, adicione o trecho a seguir ao modelo YAML da origem do evento.

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

Suponha que você queira que sua função processe somente os registros onde RecordNumber seja maior que 9999. O objeto FilterCriteria seria como a seguir.

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

Para maior clareza, aqui está o valor de Pattern do filtro expandido em JSON simples.

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

É possível adicionar seu filtro usando o console, a AWS CLI ou um modelo do AWS SAM.

Console

Para adicionar esse filtro usando o console, siga as instruções em Anexar critérios de filtro a um mapeamento de fonte de eventos (console) e insira a string a seguir em Critérios do filtro.

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

Para criar um novo mapeamento da origem do evento com esses critérios de filtro usando a AWS Command Line Interface (AWS CLI), execute o comando a seguir.

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 adicionar esses critérios de filtro a um mapeamento da origem do evento existente, execute o comando a seguir.

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

Para adicionar esse filtro usando o AWS SAM, adicione o trecho a seguir ao modelo YAML da origem do evento.

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

No Amazon SQS, o corpo da mensagem pode ser qualquer string. Porém, isso pode ser problemático se os FilterCriteria esperarem que o body esteja em um formato JSON válido. O cenário oposto também é verdadeiro: se o corpo da mensagem recebida estiver em formato JSON, mas seus critérios de filtragem esperarem que o body seja uma string simples, isso poderá levar um comportamento não pretendido.

Para evitar esse problema, certifique-se de que o formato do corpo nos seus FilterCriteria corresponda ao formato esperado do body nas mensagens que você receber da fila. Antes de filtrar suas mensagens, o Lambda avalia automaticamente o formato do corpo da mensagem recebida e do seu padrão de filtro para o body. Se houver incompatibilidade, o Lambda descartará a mensagem. A tabela a seguir resume essa avaliação:

Formato do body da mensagem recebida Formato do body do padrão de filtro Ação resultante

String simples

String simples

Filtros do Lambda com base em seus critérios de filtro.

String simples

Nenhum padrão de filtro para propriedades de dados

Filtros do Lambda (somente nas outras propriedades de metadados) com base nos seus critérios de filtro.

String simples

JSON válido

O Lambda descarta a mensagem.

JSON válido

String simples

O Lambda descarta a mensagem.

JSON válido

Nenhum padrão de filtro para propriedades de dados

Filtros do Lambda (somente nas outras propriedades de metadados) com base nos seus critérios de filtro.

JSON válido

JSON válido

Filtros do Lambda com base em seus critérios de filtro.