Usar oAWS Lambda com o Amazon SQS - AWS Lambda

Usar oAWS Lambda com o Amazon SQS

É possível usar uma função do AWS Lambda para processar mensagens em uma fila do Amazon Simple Queue Service (Amazon SQS). Os mapeamentos de fontes de eventos do Lambda oferecem suporte a filas padrão e filas FIFO (primeiro a entrar, primeiro a sair). Com o Amazon SQS, você pode descarregar tarefas de um componente do aplicativo enviando-as a uma fila e processando-as de forma assíncrona.

O Lambda sonda a fila e invoca a função do Lambda de forma síncrona com um evento que contém a fila de mensagens. O Lambda lê mensagens em lotes e invoca a função uma vez para cada lote. Quando sua função processa com êxito um lote, o Lambda exclui suas mensagens da fila. O exemplo a seguir mostra um evento para um lote de duas mensagens.

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 invoca sua função assim que os registros são disponibilizados na fila do SQS. O Lambda pesquisará até 10 mensagens em sua fila de uma só vez e enviará esse lote para a função. Para evitar invocar a função com um número pequeno de registros, você pode instruir à origem dos eventos para fazer o buffer dos registros por até cinco minutos, configurando uma janela de lote. Antes de invocar a função, o Lambda continua a pesquisar mensagens da fila padrão do SQS até a janela do lote expirar, o limite da carga útil ser alcançado ou o tamanho máximo de lote ser alcançado.

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" } ] }

Quando o Lambda lê um lote, as mensagens permanecem na fila, mas são ocultadas durante o tempo limite de visibilidade da fila. Se a função processar com êxito um lote, o Lambda excluirá as mensagens da fila. Se a função for limitada, retornar um erro ou não responder, a mensagem ficará visível novamente. Todas as mensagens em um lote com falha retornam à fila e, portanto, seu código de função deve ser capaz de processar a mesma mensagem várias vezes sem efeitos colaterais.

Escalabilidade e processamento

Para filas padrão, o Lambda usa sondagem longa para sondar uma fila até que ela se torne ativa. Quando as mensagens estão disponíveis, o Lambda lê até 5 lotes e os envia para sua função. Se ainda houver mensagens disponíveis, o Lambda aumentará o número de processos de leitura de lotes em até 60 instâncias a mais por minuto. O número máximo de lotes que podem ser processados simultaneamente por um mapeamento da origem do evento é 1000.

Para filas FIFO, o Lambda envia mensagens para a função na ordem em que as recebe. Ao enviar uma mensagem para uma fila FIFO, você especifica um ID de grupo de mensagens. O Amazon SQS garante que as mensagens no mesmo grupo sejam entregues para o Lambda em ordem. O Lambda organiza as mensagens em grupos e envia somente um lote de cada vez para um grupo. Se a função retornar um erro, serão feitas todas as tentativas nas mensagens afetadas antes que o Lambda receba mensagens adicionais do mesmo grupo.

Sua função pode reduzir a simultaneidade para o número de grupos de mensagens ativos. Para obter mais informações, consulte FIFO do SQS como uma origem de evento no blog de computação da AWS.

Configurar uma fila para usar com o Lambda

Crie uma fila do SQS para servir como uma origem de eventos para sua função do Lambda. Depois, configure a fila para permitir que a sua função do Lambda processe cada lote de eventos — e para o Lambda tentar novamente em resposta a erros de limitação à medida que a escala aumenta.

Para permitir que a função tenha tempo para processar cada lote de registros, defina o tempo limite de visibilidade da fila de origem para pelo menos seis vezes o tempo limite configurado na função. O tempo extra permite que o Lambda repita o processo se a execução da sua função for limitada enquanto sua função está processando um lote anterior.

Se uma mensagem falhar no processamento várias vezes, o Amazon SQS poderá enviá-la para uma fila de mensagens mortas. Quando sua função retorna um erro, o Lambda a deixa na fila. Após o tempo limite de visibilidade, o Lambda recebe a mensagem novamente. Para enviar mensagens para uma segunda fila após vários recebimentos, configure uma fila de mensagens mortas na fila de origem.

nota

Certifique-se de configurar a fila dead-letter na fila de origem, e não na função do Lambda. A fila dead-letter que você configura em uma função é usada para a fila de invocação assíncrona da função, e não para filas de origem de evento.

Se a função retornar um erro ou não puder ser invocada porque está na simultaneidade máxima, o processamento poderá ter êxito com tentativas adicionais. Para que as mensagens tenham maior chance de serem processadas antes de serem enviadas para a fila de mensagens mortas, defina a maxReceiveCount na política de redirecionamento da fila de origem como pelo menos 5.

Permissões da função de execução

O Lambda precisa das seguintes permissões para gerenciar mensagens em sua fila do Amazon SQS. Adicione-as à função de execução da sua função.

Para obter mais informações, consulte Função de execução do AWS Lambda.

Configurar uma fila como uma fonte de eventos

Crie um mapeamento de fonte do evento para orientar o Lambda a enviar itens da sua fila para uma função do Lambda. Você pode criar vários mapeamentos da fonte do evento para processar itens de várias filas com uma única função. Quando o Lambda invoca a função de destino, o evento pode conter vários itens, até um tamanho de lote máximo configurável.

Para configurar sua função para leitura a partir do Amazon SQS no console do Lambda, crie um gatilho SQS.

Para criar um gatilho

  1. Abra a página Funções do console do Lambda.

  2. Escolha uma função.

  3. Em Function overview (Visão geral da função), escolha Add trigger (Adicionar gatilho).

  4. Escolha um tipo de gatinho.

  5. Configure as opções necessárias e, em seguida, escolha Add (Adicionar).

O Lambda oferece suporte às seguintes opções das fontes de evento do Amazon SQS.

Opções de fonte do evento

  • Fila do SQS – A fila do Amazon SQS de onde ler os registros.

  • Batch size (Tamanho do lote) – o número de registros a serem enviados para a função em cada lote. Para uma fila padrão, isso pode ser de até 10.000 registros. Para uma fila FIFO, o máximo é 10. Para um tamanho de lote acima de 10, você também deve definir o parâmetro MaximumBatchingWindowInSeconds para pelo menos 1 segundo. O Lambda transmite todos os registros no lote para a função em uma única chamada, enquanto o tamanho total dos eventos não exceder o limite de carga útil para invocação síncrona (6 MB).

    São gerados metadados pelo Lambda e pelo Amazon SQS para cada registro. Esses metadados adicionais são contabilizados para efeitos do tamanho total da carga útil e podem fazer com que o número total de registros enviados em um lote seja menor do que o tamanho do seu lote configurado. Os campos de metadados enviados pelo Amazon SQS podem variar em comprimento. Para obter mais informações sobre os campos de metadados do Amazon SQS, consulte a documentação ReceiveMessage na Amazon Simple Queue Service Referência da API.

  • Batch window (Janela de lote) – especifique o máximo de tempo para reunir registros antes de invocar a função, em segundos. Aplicável apenas a filas padrão.

    Se você estiver usando uma janela de lote maior que 0 segundo, considere o maior tempo de processamento no tempo limite de visibilidade de sua fila. Defina o tempo limite de visibilidade da fila para seis vezes o tempo limite da função, mais o valor de MaximumBatchingWindowInSeconds. Isso permite que a sua função Lambda tenha tempo para processar cada lote de eventos e tentar novamente caso haja erro de limitação. O Lambda processa até cinco lotes por vez.

  • Habilitado – Defina como verdadeiro para habilitar o mapeamento da origem do evento. Defina como falso para interromper o processamento de registros.

nota

O Amazon SQS tem um nível gratuito vitalício para solicitações. Além do nível gratuito, o Amazon SQS cobra por milhão de solicitações. Enquanto o mapeamento da origem do evento estiver ativo, o Lambda fará solicitações à fila para obter itens. Para obter detalhes de preço, consulte Definição de preço do Amazon Simple Queue Service.

Para gerenciar a configuração da fonte do evento posteriormente, escolha o gatilho no designer.

Configure o tempo limite de sua função para permitir tempo suficiente para processar um lote inteiro de itens. Se os itens levarem muito tempo para serem processados, escolha um tamanho de lote menor. Um tamanho de lote grande pode melhorar a eficiência de cargas de trabalho muito rápidas ou com muita sobrecarga. No entanto, se a sua função retornar um erro, todos os itens no lote retornarão à fila. Se você configurar a simultaneidade reservada em sua função, defina, no mínimo, 5 execuções simultâneas para reduzir a chance de erros de controle de utilização quando o Lambda invocar sua função. Para eliminar a chance de erros de controle de utilização, defina o valor de simultaneidade reservado como 1000, que é o número máximo de execuções simultâneas para uma origem de evento do Amazon SQS.

APIs de mapeamento da fonte de eventos

Para gerenciar uma origem de evento com a AWS CLI ou o AWS SDK, é possível usar as seguintes operações de API:

O exemplo a seguir usa a AWS CLI para mapear uma função chamada my-function para uma fila do Amazon SQS especificada pelo nome de recurso da Amazon (ARN), com um tamanho de lote de 5 e uma janela de lote de 60 segundos.

aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --maximum-batching-window-in-seconds 60 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue

Você deve ver a saída a seguir:

{ "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "MaximumBatchingWindowInSeconds": 60, "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "State": "Creating", "StateTransitionReason": "USER_INITIATED" }