Usar o Lambda com o Amazon SQS
nota
Se você deseja enviar dados para um destino que não seja uma função do Lambda ou enriquecer os dados antes de enviá-los, consulte Amazon EventBridge Pipes (Pipes do Amazon EventBridge).
É possível usar uma função do Lambda para processar mensagens em uma fila do Amazon Simple Queue Service (Amazon SQS). O Lambda oferece suporte a filas padrão e filas FIFO (primeiro a entrar, primeiro a sair) para mapeamentos de origem de eventos. A função do Lambda e a fila do Amazon SQS devem estar na mesma Região da AWS, embora possam estar em diferentes Contas da AWS.
Tópicos
- Entender o comportamento de sondagens e lotes para mapeamentos de origem de eventos do Amazon SQS
- Exemplo de evento de mensagem de fila padrão
- Exemplo de evento de mensagem de fila FIFO
- Criar e configurar um mapeamento de origem de evento do Amazon SQS
- Configurar o comportamento de escalabilidade para mapeamentos de origem de eventos do SQS
- Tratamento de erros para uma origem de eventos do SQS no Lambda
- Parâmetros do Lambda para mapeamentos de origem de eventos do Amazon SQS
- Usar a filtragem de eventos com uma origem de eventos do Amazon SQS
- Tutorial: usar o Lambda com o Amazon SQS
- Tutorial: Uso de uma fila do Amazon SQS entre contas como a origem de um evento
Entender o comportamento de sondagens e lotes para mapeamentos de origem de eventos do Amazon SQS
Com os mapeamentos de origem de eventos do Amazon SQS, o Lambda sonda a fila e invoca sua função de forma síncrona com um evento. Cada evento pode conter um lote de várias mensagens da fila. O Lambda recebe esses eventos um lote por vez e invoca sua função uma vez para cada lote. Quando sua função processa um lote com êxito, o Lambda exclui suas mensagens da fila.
Quando o Lambda recebe um lote, as mensagens permanecem na fila, mas permanecem ocultas durante o tempo limite de visibilidade da fila. Se a função processar com êxito todas as mensagens no lote, o Lambda excluirá as mensagens da fila. Por padrão, se a sua função encontrar um erro durante o processamento de um lote, todas as mensagens naquele lote se tornarão visíveis na fila novamente após o tempo limite de visibilidade expirar. Por conta disso, o código da função deve ter a capacidade de processar a mesma mensagem várias vezes sem causar efeitos colaterais não intencionais.
Atenção
Os mapeamentos da origem do evento do Lambda processam cada evento ao menos uma vez, podendo haver o processamento duplicado de registros. Para evitar possíveis problemas relacionados a eventos duplicados, é altamente recomendável tornar o código da função idempotente. Para saber mais, consulte Como tornar minha função do Lambda idempotente
Para evitar que o Lambda processe uma mensagem diversas vezes, é possível configurar o mapeamento de origem de eventos para incluir falhas de itens de lote na resposta da função ou usar a API DeleteMessage para remover mensagens da fila à medida que a função do Lambda as processa com êxito.
Para obter informações sobre os parâmetros de configuração aceitos pelo Lambda para mapeamentos de origem de eventos do SQS, consulte Criar um mapeamento de origem de evento do SQS.
Exemplo de evento de mensagem de fila padrão
exemplo Evento de mensagem do Amazon SQS (fila padrão)
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }
Por padrão, o Lambda pesquisará até 10 mensagens em sua fila de uma só vez e envia esse lote para sua função. Para evitar a invocação da função com poucos registros, você pode configurar a origem de eventos para armazenar os registros em buffer por até cinco minutos, configurando uma janela de lote. Antes de invocar a função, o Lambda continuará a sondar as mensagens da fila padrão até a janela de lote expirar, a cota de tamanho da carga útil de invocação ser atingida ou o tamanho de lote máximo configurado ser atingido.
Se você estiver usando uma janela em lote e sua fila do SQS contiver um volume de tráfego muito baixo, o Lambda poderá esperar até 20 segundos antes de invocar sua função. Isso será válido mesmo se você definir uma janela de lote inferior a 20 segundos.
nota
Em Java, talvez você observe erros de ponteiro nulo ao desserializar o JSON. Isso pode ser causado por como a caixa de “Records” e “EventSourceArn” é convertida pelo mapeador de objetos JSON.
Exemplo de evento de mensagem de fila FIFO
Para as filas FIFO, os registros contêm atributos adicionais relacionados a desduplicação e sequenciamento.
exemplo Evento de mensagem do Amazon SQS (fila FIFO)
{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774",
"SequenceNumber": "18849496460467696128", "MessageGroupId": "1",
"SenderId": "AIDAIO23YVJENQZJOL4VO","MessageDeduplicationId": "1",
"ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }