Como integrar validação de CPF em AWS Lambda com Node.js e API Gateway

Aprenda a criar uma função AWS Lambda com Node.js que consome a API de CPF, exposta via API Gateway com autenticação e tratamento de erros.

Redação CPFHub.io
Redação CPFHub.io
··8 min de leitura
Como integrar validação de CPF em AWS Lambda com Node.js e API Gateway

Para integrar validação de CPF em AWS Lambda com Node.js, crie uma função que recebe o CPF via path parameter, consulta a API da CPFHub.io com o header x-api-key e retorna os dados do titular. Combinada ao API Gateway, essa arquitetura serverless escala automaticamente de zero a milhares de requisições sem custo fixo de infraestrutura. A chave de API deve ser armazenada no AWS Secrets Manager e cacheada em memória para evitar chamadas desnecessárias entre invocações. A documentação oficial da AWS Lambda detalha as opções de configuração de runtime e permissões IAM necessárias.


Arquitetura da solução

A arquitetura serverless para validação de CPF segue o padrão:

  1. O cliente envia uma requisição HTTP para o API Gateway.
  2. O API Gateway roteia a requisição para a função Lambda.
  3. A Lambda recupera a chave de API do Secrets Manager.
  4. A Lambda consulta a API da CPFHub.io.
  5. A resposta e retornada ao cliente via API Gateway.

Essa arquitetura escala automaticamente de zero a milhares de requisições simultaneas, sem necessidade de gerenciar infraestrutura.


Implementação da função Lambda

Veja a implementação completa da função Lambda em Node.js 20:

// handler.js
const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager");

const secretsClient = new SecretsManagerClient({ region: "sa-east-1" });
let cachedApiKey = null;

async function getApiKey() {
    if (cachedApiKey) return cachedApiKey;

    const command = new GetSecretValueCommand({
    SecretId: "cpfhub/api-key",
    });

    const response = await secretsClient.send(command);
    cachedApiKey = response.SecretString;
    return cachedApiKey;
}

async function consultarCPF(cpfNumero, apiKey) {
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 10000);

    try {
    const response = await fetch(
    `https://api.cpfhub.io/cpf/${cpfNumero}`,
    {
    method: "GET",
    headers: {
    "x-api-key": apiKey,
    "Accept": "application/json",
    },
    signal: controller.signal,
    }
    );

    clearTimeout(timeoutId);

    if (!response.ok) {
    throw new Error(`API retornou status ${response.status}`);
    }

    return await response.json();
    } catch (error) {
    clearTimeout(timeoutId);

    if (error.name === "AbortError") {
    throw new Error("Timeout na consulta de CPF");
    }
    throw error;
    }
}

function criarResposta(statusCode, body) {
    return {
    statusCode,
    headers: {
    "Content-Type": "application/json",
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET,OPTIONS",
    },
    body: JSON.stringify(body),
    };
}

exports.handler = async (event) => {
    // Tratar preflight CORS
    if (event.httpMethod === "OPTIONS") {
    return criarResposta(200, {});
    }

    const cpf = event.pathParameters?.cpf;

    if (!cpf) {
    return criarResposta(400, { erro: "CPF e obrigatorio" });
    }

    const cpfLimpo = cpf.replace(/\D/g, "");

    if (cpfLimpo.length !== 11) {
    return criarResposta(400, { erro: "CPF deve conter 11 digitos" });
    }

    // Rejeitar CPFs com todos os digitos iguais
    if (/^(\d)\1+$/.test(cpfLimpo)) {
    return criarResposta(400, { erro: "CPF invalido" });
    }

    try {
    const apiKey = await getApiKey();
    const resultado = await consultarCPF(cpfLimpo, apiKey);

    if (!resultado.success || !resultado.data) {
    return criarResposta(404, { erro: "CPF nao encontrado" });
    }

    return criarResposta(200, {
    valido: true,
    dados: {
    nome: resultado.data.name,
    cpf: resultado.data.cpf,
    genero: resultado.data.gender,
    dataNascimento: resultado.data.birthDate,
    },
    });
    } catch (error) {
    console.error("Erro na consulta:", error.message);
    return criarResposta(500, {
    erro: "Falha na consulta de CPF",
    detalhe: error.message,
    });
    }
};

O segredo da chave de API e recuperado do AWS Secrets Manager e cacheado em memoria entre invocacoes da Lambda -- uma otimizacao que evita chamadas desnecessarias ao Secrets Manager em ambientes com alta concorrencia.


Template AWS SAM para deploy

O AWS SAM (Serverless Application Model) simplifica o deploy da infraestrutura. Crie o arquivo template.yaml:

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: API de validacao de CPF com CPFHub.io

Globals:
    Function:
    Timeout: 15
    Runtime: nodejs20.x
    MemorySize: 256
    Environment:
    Variables:
    NODE_ENV: production

Resources:
    ValidarCPFFunction:
    Type: AWS::Serverless::Function
    Properties:
    Handler: handler.handler
    CodeUri: ./src
    Description: Consulta e valida CPF via API CPFHub.io
    Policies:
    - Statement:
    - Effect: Allow
    Action: secretsmanager:GetSecretValue
    Resource: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:cpfhub/api-key-*"
    Events:
    ValidarCPF:
    Type: Api
    Properties:
    Path: /cpf/{cpf}
    Method: GET
    ValidarCPFOptions:
    Type: Api
    Properties:
    Path: /cpf/{cpf}
    Method: OPTIONS

Outputs:
    ApiUrl:
    Description: URL da API de validacao de CPF
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/cpf/"

Deploy com:

sam build && sam deploy --guided

Configuração do API Gateway

O API Gateway oferece recursos adicionais de seguranca e controle:

Rate limiting

Configure um Usage Plan no API Gateway para limitar requisições:

# Adicionar ao template.yaml
ApiUsagePlan:
    Type: AWS::ApiGateway::UsagePlan
    Properties:
    UsagePlanName: cpf-validation-plan
    Throttle:
    BurstLimit: 10
    RateLimit: 5
    Quota:
    Limit: 1000
    Period: MONTH

Validação de request

O API Gateway pode validar o formato do CPF antes de invocar a Lambda, economizando execucoes desnecessarias:

# Model de validacao no API Gateway
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
    "cpf": {
    "type": "string",
    "pattern": "^\\d{11}$"
    }
    },
    "required": ["cpf"]
}

Monitoramento com CloudWatch

A Lambda envia metricas automaticamente para o CloudWatch. Configure alarmes para monitorar a integração:

// Adicionar metricas customizadas no handler
const { CloudWatchClient, PutMetricDataCommand } = require("@aws-sdk/client-cloudwatch");

const cwClient = new CloudWatchClient({ region: "sa-east-1" });

async function registrarMetrica(nome, valor, unidade = "Count") {
    await cwClient.send(new PutMetricDataCommand({
    Namespace: "CPFValidation",
    MetricData: [{
    MetricName: nome,
    Value: valor,
    Unit: unidade,
    Timestamp: new Date(),
    }],
    }));
}

// No handler, apos a consulta:
await registrarMetrica("ConsultasSucesso", 1);
// Ou em caso de falha:
await registrarMetrica("ConsultasFalha", 1);

Otimizacao de cold start

O cold start e o principal desafio de funções Lambda. Para minimiza-lo na integração com a API de CPF:

  • Provisioned Concurrency -- Mantem instancias quentes para rotas críticas. Configure pelo menos 1 instancia para evitar cold starts em horarios de pico.
  • Minimizar dependências -- Use o fetch nativo do Node.js 20 em vez de bibliotecas como Axios. Menos código significa menos tempo de inicializacao.
  • Cache do Secrets Manager -- O cache da chave de API em variavel global (como implementado acima) evita chamadas extras ao Secrets Manager em invocacoes quentes.
  • Tamanho de memoria -- Aumentar a memoria da Lambda também aumenta a CPU alocada, acelerando a inicializacao.
Memoria (MB)Cold start medioCusto por 1M invocacoes
128~800ms~$0.21
256~450ms~$0.42
512~250ms~$0.84

Testes locais com SAM CLI

O SAM CLI permite testar a Lambda localmente antes do deploy:

# Criar evento de teste
echo '{"httpMethod":"GET","pathParameters":{"cpf":"12345678901"}}' > event.json

# Executar localmente
sam local invoke ValidarCPFFunction -e event.json

# Subir API local
sam local start-api --port 3000

Com a API local rodando, teste com curl:

curl http://localhost:3000/cpf/12345678901

Custos estimados

A combinação Lambda + API Gateway e extremamente econômica para volumes moderados:

ComponenteCusto1.000 consultas/mes
Lambda$0.20 por 1M requisições~$0.00
API Gateway$3.50 por 1M requisições~$0.004
Secrets Manager$0.40/segredo/mes$0.40
CPFHub.io ProR$149/mes (1.000 consultas)R$149.00

O custo de infraestrutura AWS para 1.000 consultas mensais e praticamente zero, tornando o plano Pro da CPFHub.io


Perguntas frequentes

O que é necessário para integrar validação de CPF em AWS Lambda?

A integração exige uma função Lambda em Node.js configurada para receber o CPF via path parameter, um API Gateway expondo a rota HTTP e a chave de API da CPFHub.io armazenada no Secrets Manager. A Lambda faz uma chamada GET para https://api.cpfhub.io/cpf/{CPF} com o header x-api-key e retorna nome, gênero e data de nascimento do titular.

Qual é a latência esperada da API CPFHub.io dentro de uma Lambda?

A API CPFHub.io tem latência média de ~900ms. Somado ao tempo de execução da Lambda (especialmente em cold starts com 128MB de memória, que podem chegar a ~800ms), o tempo total de resposta gira em torno de 1,5 a 2 segundos. Configure o timeout da Lambda em pelo menos 15 segundos para absorver variações.

A API CPFHub.io bloqueia quando o limite de consultas é atingido?

Não. Quando o limite mensal do plano é ultrapassado, a API não bloqueia nem retorna erro 429 — ela continua respondendo e cobra R$0,15 por consulta adicional. O plano gratuito inclui 50 consultas/mês e o plano Pro oferece 1.000 consultas por R$149/mês.

Como armazenar a chave de API da CPFHub.io de forma segura na Lambda?

Use o AWS Secrets Manager para armazenar a chave e recuperá-la na inicialização da função, cacheando-a em uma variável global. Essa abordagem evita chamadas repetidas ao Secrets Manager em invocações quentes e mantém a chave fora de variáveis de ambiente em texto plano, reduzindo o risco de exposição em logs.


Conclusão

AWS Lambda com API Gateway e a combinação classica para APIs serverless, e a integração com a API de CPF da CPFHub.io

Cadastre-se em cpfhub.io

CPFHub.io

Pronto para integrar a API?

50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.

Redação CPFHub.io

Sobre a redação

Redação CPFHub.io

Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.

WhatsAppFale conosco via WhatsApp