Use o SDK de Node.js no AWS Lambda

Por solvethree4 min de leitura

Use Node.js 22 ou posterior e inclua o SDK oficial no pacote do seu handler. Defina o prazo limite do SDK abaixo do tempo de execução restante do Lambda para que a função tenha tempo de retornar os IDs da tarefa e do erro.

Nesta página

Empacote o SDK e configure o destino

  1. 1.

    Instale a dependência

    Inicialize um pacote npm em um diretório de build limpo. Use npm para instalar o tarball oficial em https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. Ele fornece a importação @solvethree/sdk; não suponha que exista uma versão publicada no registro npm.

  2. 2.

    Configure o workspace e o destino

    Defina variáveis de ambiente privadas do Lambda chamadas SOLVETHREE_API_KEY, CAPTCHA_SITE e SOLVETHREE_PROXY. Use uma chave de API do workspace, o hostname de destino em vez de uma URL completa e o proxy para esta tarefa. O workspace já deve ter um perfil ativo para esse site; consulte a configuração do perfil do site.

  3. 3.

    Salve e empacote o handler

    Salve o exemplo abaixo como index.mjs. Crie um ZIP com index.mjs, os metadados do pacote e o diretório node_modules instalado na raiz do arquivo — não dentro de um diretório de projeto que os contenha. Não inclua credenciais no ZIP.

  4. 4.

    Implante pelo seu processo existente do Lambda

    Use o runtime Node.js 22 e defina o handler como index.handler. Invoque-o pelo seu backend autorizado ou fluxo IAM, fornecendo um requestId estável para o trabalho lógico. Mantenha privados os dados da solução retornados.

O exemplo usa a ação login; altere-a para a ação esperada pelo destino antes de implantar. Ele envia um proxy e usa o tipo de requisição padrão enterprise-v3. Não adicione os campos reCAPTCHA type nem url.

Limite a espera do SDK ao tempo disponível da invocação

Lambda index.mjs · limitar o SDK ao tempo disponível da invocação
import { Solvethree, SolvethreeError, TaskFailedError, ApiError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
export const handler = async (event, context) => {
  const timeoutMs = Math.min(180000, context.getRemainingTimeInMillis() - 1500);
  if (timeoutMs < 1000) throw new Error('Not enough execution time to start a task');
  // The caller supplies one stable ID for this logical job; Lambda retries must
  // reuse it. awsRequestId changes with invocations and is not that logical ID.
  if (!event.requestId) throw new Error('Provide a stable requestId');
  try {
    return await client.solve({
      site: process.env.CAPTCHA_SITE, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
      requestId: event.requestId,
    }, { timeoutMs, signal: AbortSignal.timeout(timeoutMs) });
  } catch (error) {
    if (error instanceof TaskFailedError) return { status: 'failed', id: error.taskId, errorCode: error.errorCode };
    if (error instanceof ApiError) return { apiError: error.status, requestId: error.requestId };
    if (error instanceof SolvethreeError) return { interrupted: true, requestId: error.requestId, taskId: error.taskId };
    throw error;
  }
};
// Invoke through your authorized backend/IAM flow. The return value is private
// solution data; do not attach this handler to an unauthenticated public URL.

O handler lê o tempo de execução restante do Lambda, reserva 1,500 milissegundos e limita a espera do SDK a 180,000 milissegundos. Esse limite pertence a este exemplo; não é um limite universal de execução do Lambda. Com menos de um segundo restante após a reserva, o handler se recusa a iniciar.

Tanto o tempo limite do SDK quanto o sinal de cancelamento usam o prazo calculado. solve cria a tarefa uma única vez e a consulta até que esteja pronta ou ocorra um erro. A reserva dá tempo ao tratamento de erros para retornar informações de recuperação, mas um encerramento forçado do Lambda ainda pode impedir qualquer resposta.

O chamador deve manter event.requestId nas novas tentativas de invocação. Use 1–64 letras ASCII, números, sublinhados ou hífens. Não use awsRequestId: ele identifica uma invocação, não a requisição lógica de resolução.

Trate falhas sem iniciar outra resolução às cegas

Como interpretar o valor retornado pelo handler
Como interpretar o valor retornado pelo handler
ResultadoO que fazer
Uma tarefa com status readyUse a solução dela. Apenas a criação da tarefa ou uma resposta HTTP bem-sucedida não basta.
status: failedRegistre id e errorCode. Consulte a tarefa se precisar da mensagem de erro, mas pare de consultar periodicamente essa tarefa com falha.
apiErrorRegistre o status HTTP e o ID de requisição retornado. Isso é um erro de requisição da API, não uma falha final da tarefa; inspecione a causa antes de tentar novamente com os mesmos dados de entrada.
interrupted: trueGuarde qualquer taskId e requestId retornado, junto com o ID original da requisição lógica do chamador, para recuperação.

Erros de validação e erros inesperados são relançados. O handler não transforma toda exceção em uma resposta de interrupção.

  1. 1.

    Recupere pelo ID da tarefa quando disponível

    Consulte a tarefa existente com getTask. pending e solving significam que ela ainda está em execução; apenas ready contém uma solução utilizável. Mantenha qualquer espera adicional dentro do tempo restante da nova invocação.

  2. 2.

    Caso contrário, recupere pelo ID da requisição lógica

    Repita a mesma solicitação de tarefa com o requestId original de quem fez a chamada. Entradas idênticas retornam a tarefa existente; entradas diferentes geram conflito. Mantenha o site, a ação e o proxy inalterados durante a recuperação, inclusive após mudanças de configuração.

Um tempo limite de conexão não comprova que a criação da tarefa falhou. Recupere a tarefa existente antes de atribuir um novo ID de solicitação lógica. Consulte consulta periódica de tarefas e tratamento de erros da API para entender os contratos envolvidos.

Envie usando o mesmo proxy e a identidade de navegador retornada

O SDK retorna os dados da solução; ele não os aplica ao destino. Quando sua aplicação os enviar, use o proxy configurado e os valores de userAgent e secChUa retornados. Não os substitua por uma identidade de navegador ou URL de destino sem relação com a tarefa. Uma tarefa pronta significa que uma solução foi gerada — não que o destino aceitou a solicitação subsequente.

Execute sua primeira tarefa.

Comece com $5 em créditos no espaço de trabalho.

Criar um espaço de trabalho
Use o SDK de Node.js no AWS Lambda · solvethree