AWS Lambda
Guia do desenvolvedor

Uso do AWS Lambda com o Amazon Kinesis

Você pode usar uma função do AWS Lambda para processar registros em um streaming de dados do Amazon Kinesis. Com o Kinesis, você pode coletar dados de várias fontes e processá-los com vários consumidores. O Lambda oferece suporte a iteradores de streaming de dados padrão e consumidores de fluxo HTTP/2.

O Lambda lê registros do streaming de dados e invoca sua função de forma síncrona com um evento que contém registros de fluxo. O Lambda lê registros em lotes e invoca sua função para processar registros do lote.

exemplo Evento do registro do Kinesis

{ "Records": [ { "kinesis": { "kinesisSchemaVersion": "1.0", "partitionKey": "1", "sequenceNumber": "49590338271490256608559692538361571095921575989136588898", "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==", "approximateArrivalTimestamp": 1545084650.987 }, "eventSource": "aws:kinesis", "eventVersion": "1.0", "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898", "eventName": "aws:kinesis:record", "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", "awsRegion": "us-east-2", "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" }, { "kinesis": { "kinesisSchemaVersion": "1.0", "partitionKey": "1", "sequenceNumber": "49590338271490256608559692540925702759324208523137515618", "data": "VGhpcyBpcyBvbmx5IGEgdGVzdC4=", "approximateArrivalTimestamp": 1545084711.166 }, "eventSource": "aws:kinesis", "eventVersion": "1.0", "eventID": "shardId-000000000006:49590338271490256608559692540925702759324208523137515618", "eventName": "aws:kinesis:record", "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", "awsRegion": "us-east-2", "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" } ] }

Se você tiver vários aplicativos que estão lendo registros do mesmo fluxo, pode usar os consumidores de fluxo do Kinesis em vez de iteradores padrão. Os consumidores têm taxa de transferência dedicada de leitura para que não seja necessário competir com outros consumidores dos mesmos dados. Com os consumidores, o Kinesis envia registros para o Lambda por meio de uma conexão HTTP/2, que também pode reduzir a latência entre a adição de um registro e invocação da função.

Por padrão, o Lambda invoca sua função assim que os registros estão disponíveis no fluxo. Se o lote que ele ler do fluxo tiver somente um registro, o Lambda enviará apenas um registro à função. Para evitar invocar a função com um número pequeno de registros, você pode dizer à 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 lendo os registros do fluxo até reunir um lote completo ou até a janela do lote expirar.

Se a sua função retornar um erro, o Lambda tentará executar novamente o lote até que o processamento seja bem-sucedido ou os dados expirem. Até que o problema seja resolvido, nenhum dado no estilhaço será processado. Para evitar estilhaços paralisados e possíveis perdas de dados, certifique-se de gerenciar e gravar erros de processamento no seu código.

Como configurar seu streaming de dados e função

Sua função do Lambda é um aplicativo de consumidor para seu streaming de dados. Ele processa um lote de registros por vez de cada estilhaço. Você pode mapear uma função do Lambda para um streaming de dados (iterador padrão) ou para um consumidor de um fluxo (distribuição avançada).

Para os iteradores padrão, o Lambda sonda cada estilhaço em seu fluxo do Kinesis para identificar registros a uma taxa básica de uma vez por segundo. Quando mais registros estão disponíveis, o Lambda mantém lotes de processamento até receber um lote inferior ao tamanho máximo de lote configurado. A função compartilha taxa de transferência de leitura com outros consumidores do estilhaço.

Para minimizar a latência e maximizar a taxa de transferência de leitura, crie um consumidor de streaming de dados. Os consumidores de fluxo obtêm uma conexão dedicada para cada estilhaço que não afeta outros aplicativos que fazem leitura do fluxo. A taxa de transferência dedicada pode ajudar se você tiver muitos aplicativos lendo os mesmos dados, ou se você estiver reprocessando um fluxo com grandes registros.

Os consumidores de fluxo usam HTTP/2 para reduzir a latência, enviando os registros para o Lambda por meio de uma conexão de longa duração e compactando cabeçalhos de solicitação. Você pode criar um consumidor de fluxo com a APIRegisterStreamConsumer do Kinesis.

$ aws kinesis register-stream-consumer --consumer-name con1 \ --stream-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream { "Consumer": { "ConsumerName": "con1", "ConsumerARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream/consumer/con1:1540591608", "ConsumerStatus": "CREATING", "ConsumerCreationTimestamp": 1540591608.0 } }

Para aumentar a velocidade na qual sua função processa os registros, adicione estilhaços ao seu streaming de dados. O Lambda processa os registros em cada estilhaço em ordem e interrompe o processamento de registros adicionais em um estilhaço, se a função retornar um erro. Com mais estilhaços, há mais lotes sendo processados de uma só vez, o que diminui o impacto de erros na simultaneidade.

Se a sua função não puder ser dimensionada para lidar com uma execução simultânea por estilhaço, solicite um aumento de limite ou reserve simultaneidade para sua função. A simultaneidade disponível para sua função deve corresponder ou exceder o número de estilhaços em seu streaming de dados do Kinesis.

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

O Lambda precisa das permissões a seguir para gerenciar recursos relacionados ao seu streaming de dados do Kinesis. Adicione-as à função de execução da sua função.

A política gerenciada AWSLambdaKinesisExecutionRole inclui essas permissões. Para obter mais informações, consulte Função de execução do AWS Lambda.

Configuração de um stream como fonte de eventos

Crie um mapeamento de fonte de eventos para orientar o Lambda a enviar registros de seu streaming de dados para uma função do Lambda. Você pode criar vários mapeamentos de fonte do evento para processar os mesmos dados com várias funções do Lambda ou processar itens de vários streamings de dados com uma única função.

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

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 do evento do Kinesis.

Opções de fonte do evento

  • Kinesis stream (Fluxo do Kinesis) – O fluxo do Kinesis a partir do qual a leitura de registros é realizada.

  • Consumer (Consumidor) (opcional) – Use um consumidor de fluxo para ler o fluxo em uma conexão dedicada.

  • Batch size (Tamanho do lote) – O número de registros para ler a partir de um estilhaço em cada lote, até 10.000. O Lambda passa todos os registros no lote para a função em uma única chamada, desde que o tamanho total dos eventos não exceda o limite de carga para a invocação síncrona (6 MB).

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

  • Starting position (Posição inicial) – Processe apenas novos registros, todos os registros existentes ou registros criados após uma determinada data.

    • Latest (Mais recente) – Processe novos registros adicionados ao fluxo.

    • Trim horizon (Redução horizontal) – Processe todos os registros no fluxo.

    • At timestamp (Na data e hora) – Processe registros a partir de uma hora específica.

    Depois de processar todos os registros existentes, a função é capturada e continua a processar novos registros.

  • Enabled (Habilitado) – Desative a fonte do evento para interromper o processamento de registros. O Lambda monitora o último registro processado e retoma o processamento a partir desse ponto quando habilitado novamente.

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

APIs do mapeamento da fonte de eventos

Para criar o mapeamento da fonte do evento com a AWS CLI, use a API CreateEventSourceMapping. O exemplo a seguir usa a AWS CLI para mapear uma função chamada my-function para um streaming de dados do Kinesis. O streaming de dados é especificado por um nome de recurso da Amazon (ARN), com um tamanho de lote de 500, a partir do time stamp no horário do Unix.

$ aws lambda create-event-source-mapping --function-name my-function \ --batch-size 500 --starting-position AT_TIMESTAMP --starting-position-timestamp 1541139109 \ --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream { "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 500, "MaximumBatchingWindowInSeconds": 0, "EventSourceArn": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "LastProcessingResult": "No records processed", "State": "Creating", "StateTransitionReason": "User action" }

Para usar um consumidor, especifique o ARN do consumidor em vez do ARN do fluxo.

Métricas do Amazon CloudWatch

O Lambda emite a métrica IteratorAge quando a sua função termina de processar um lote de registros. A métrica indica a idade do último registro no lote quando o processamento foi concluído. Se sua função estiver processando novos eventos, você poderá usar a idade do iterador para estimar a latência entre quando um registro é adicionado e quando a função o processa.

Uma tendência crescente na idade do iterador pode indicar problemas com sua função. Para mais informações, consulte Monitoramento e solução de problemas de aplicativos baseados no Lambda.