Por que o gatilho do Kinesis Data Streams não consegue invocar minha função do Lambda?

6 minuto de leitura
0

Integrei o AWS Lambda ao Amazon Kinesis Data Streams como fonte de eventos para processar meu fluxo de dados do Amazon Kinesis. No entanto, a função do Lambda não é invocada. Por que isso está acontecendo e como faço para resolver isso?

Breve descrição

Os erros de função do Lambda geralmente são causados pelo seguinte:

  • Permissões insuficientes no perfil de execução da função do Lambda.
  • Não há entrada de dados no fluxo de dados do Kinesis.
  • Mapeamento da origem do evento inativo, causado pela recriação de um fluxo de dados do Kinesis, função do Lambda ou perfil de execução do Lambda.
  • Uma função do Lambda que excede o tempo máximo de execução, causando um erro de limite de tempo.
  • O Lambda viola seus limites de execuções simultâneas. Para mais informações sobre a violação de limites pelo Lambda, consulte Limites do AWS Lambda.

Se houver um erro na função do Lambda, sua função não será invocada, nem processará registros do lote. Um erro pode fazer com que o Lambda tente novamente o lote de registros até que o processamento seja bem-sucedido ou o lote expire. Para mais informações sobre a função do Lambda e os erros do Kinesis, consulte Using AWS Lambda with Amazon Kinesis (Como usar o AWS Lambda com o Amazon Kinesis).

Resolução

Solucionar problemas de sua função do Lambda

Para identificar por que sua função do Lambda não é invocada, execute as seguintes etapas:

1.    Verifique a métrica Invocations no Amazon CloudWatch com estatísticas definidas como Sum para a função do Lambda. A métrica Invocations pode ajudar você a verificar se a função do Lambda foi invocada.

2.    Verifique a métrica IteratorAge para ver a idade do último registro no lote ou quando o processamento foi concluído. Quando seu consumidor do Lambda não consegue invocar, a idade do iterador do seu fluxo aumenta.

3.    Verifique os registros do CloudWatch da função do Lambda. Eles são nomeados no formato .../aws/lambda/function_name. Procure todas as entradas correspondentes ao erro da função. Por exemplo, se o erro ocorrer devido às permissões do perfil de execução do Lambda, modifique a política de perfil do AWS Identity and Access Management (IAM).

4.    Confirme se seu perfil de execução do IAM tem as permissões adequadas para acessar o CloudWatch:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

5.    (Opcional) Em caso de erro de permissão, atualize sua política de funções do Lambda, concedendo a ela acesso ao Kinesis Data Streams:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStream",
                "kinesis:DescribeStreamSummary",
                "kinesis:GetRecords",
                "kinesis:GetShardIterator",
                "kinesis:ListShards",
                "kinesis:ListStreams",
                "kinesis:SubscribeToShard",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

Observação: a política AWSLambdaKinesisExecutionRole inclui essas permissões.

Solucionar problemas adicionais

  • Se o erro estiver relacionado ao limite de tempo de um perfil de execução do Lambda, aumente o valor do limite de tempo para acomodar um processamento mais rápido.
  • Se o fluxo de dados do Kinesis for criptografado usando o AWS Key Management Service (AWS KMS), o consumidor e o produtor devem ter acesso adequado. O fluxo de dados do Kinesis deve ser capaz de acessar as chaves do AWS KMS que são usadas para criptografia e decodificação. O perfil de execução da função Lambda também deve ter acesso de leitura à chave KMS para ler com êxito os dados do fluxo de dados do Kinesis.
  • Se o erro for causado por um erro interno da função do Lambda, esse erro indica um problema com o processamento do fluxo. Para evitar o controle de utilização da API do ambiente de gerenciamento, restrinja cada fluxo a 4 a 5 mapeamentos de origem de eventos.
  • Se o erro for causado por um erro interno da função do Lambda, esse erro indica um problema com o processamento do fluxo. Restrinja cada fluxo a 4 a 5 mapeamentos de origem de eventos para evitar muitos mapeamentos de origem de eventos com o mesmo fluxo de dados. Vários mapeamentos de origem de eventos com o mesmo fluxo podem resultar em uma violação dos limites do ambiente de gerenciamento do Kinesis e do Amazon DynamoDB.
  • Se você estiver recebendo um erro de limite de tempo de conexão, adicione instruções de log antes e depois das chamadas de API feitas em seu código. Em seguida, você pode identificar a linha exata do código em que o perfil começa a falhar.
  • Se você estiver enfrentando fragmentos lentos ou paralisados, configure o mapeamento da origem do evento para tentar novamente com um tamanho de lote menor. Você também pode limitar o número de tentativas ou descartar registros antigos.
  • Se aparecer uma mensagem de erro de "memória usada" em seus logs do CloudWatch, aumente a memória da sua função do Lambda.
  • Se você excedeu o limite de tempo máximo para sua função do Lambda, modifique a biblioteca do cliente e os limites de tempo do cliente. Para modificar a sessão de limite de tempo com base no tempo restante no contêiner do Lambda, use a função context.GetRemainingTimeInMillis. A função context.GetRemainingTimeInMillis retorna a quantidade de tempo restante no contêiner do Lambda antes que ele atinja o limite de tempo.
  • Se você receber erros do código da função do Lambda, sua função do Lambda poderá ficar paralisada ao tentar o mesmo registro. Use um bloco try-catch para capturar os dados que falharam e, em seguida, registre-os usando uma fila do Amazon SQS ou um tópico do Amazon SNS. Você também pode adicionar um gatilho do Lambda à fila do Amazon SQS com a lógica de processamento para repetir as solicitações que falharam separadamente.
  • Configure uma fila de mensagens não entregues (DLQ) do Amazon SQS para invocar manualmente a função do Lambda. Configure a propriedade DeadLetterConfig ao criar ou atualizar sua função do Lambda. Você pode fornecer uma fila do Amazon Simple Queue Service (Amazon SQS) ou um tópico do Amazon Simple Notification Service (Amazon SNS) como TargetArn de sua DLQ. Em seguida, o Lambda grava o objeto de evento, invocando a função do Lambda para o endpoint especificado após o esgotamento da política de repetição padrão.
  • Use o AWS Lambda com o AWS X-Ray para detectar, analisar e otimizar problemas de desempenho com aplicativos Lambda. O AWS X-Ray coleta metadados do serviço Lambda e gera gráficos que descrevem problemas que afetam o desempenho do aplicativo Lambda. Por exemplo, se houver uma chamada que esteja demorando muito para ser executada, você poderá usar o AWS X-Ray para confirmar o problema.

AWS OFICIAL
AWS OFICIALAtualizada há 3 anos