Uso do AWS Lambda com o Amazon SQS - AWS Lambda

Uso do AWS 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 origem de evento 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 sua função de forma síncrona com um evento que contém a fila de mensagens. O Lambda lê mensagens em lotes e invoca sua 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" } ] }

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 uso 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 Functions (Funções) do console do Lambda.

  2. Escolha uma função.

  3. Em Designer, 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.

  • Tamanho do lote – O número de itens a serem lidos da fila em cada lote, até 10. O evento poderá conter menos itens se o lote que o Lambda ler da fila tiver um número menor de itens.

  • 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.

APIs de mapeamento da fonte de eventos

Para gerenciar mapeamentos de origens de eventos com a AWS CLI ou o AWS SDK, use as seguintes açõ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.

$ aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue { "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "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" }