Использование Node.js SDK в AWS Lambda

Автор: solvethree4 мин на чтение

Используйте Node.js 22 или новее и включите официальный SDK в пакет вместе с обработчиком. Установите предельное время ожидания SDK меньше оставшегося времени выполнения Lambda, чтобы функция успела вернуть ID задачи и ошибок.

На этой странице

Упакуйте SDK и настройте целевой сайт

  1. 1.

    Установите зависимость

    Инициализируйте npm-пакет в чистом каталоге сборки. С помощью npm установите официальный tarball по адресу https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. Он предоставляет импорт @solvethree/sdk; не предполагайте, что пакет опубликован в реестре npm.

  2. 2.

    Настройте рабочее пространство и целевой сайт

    Задайте приватные переменные окружения Lambda с именами SOLVETHREE_API_KEY, CAPTCHA_SITE и SOLVETHREE_PROXY. Укажите API-ключ рабочего пространства, имя целевого хоста вместо полного URL и прокси для этой задачи. В рабочем пространстве уже должен быть активный профиль этого сайта; см. настройку профиля сайта.

  3. 3.

    Сохраните и упакуйте обработчик

    Сохраните приведённый ниже пример как index.mjs. Создайте ZIP-архив, поместив index.mjs, метаданные пакета и установленный каталог node_modules в корень архива, а не во вложенный каталог проекта. Не включайте учётные данные в ZIP.

  4. 4.

    Разверните через существующий процесс Lambda

    Используйте среду выполнения Node.js 22 и задайте обработчик index.handler. Вызывайте его через авторизованный бэкенд или механизм IAM, передавая стабильный requestId для логической операции. Не раскрывайте возвращённые данные решения.

В примере используется действие login; перед развёртыванием замените его действием, которое ожидает целевой сайт. Пример отправляет один proxy и использует тип запроса по умолчанию — enterprise-v3. Не добавляйте поля reCAPTCHA type или url.

Ограничьте ожидание SDK временем, доступным вызову

Lambda index.mjs · ограничение работы SDK доступным временем вызова
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.

Обработчик считывает оставшееся время выполнения Lambda, резервирует 1,500 миллисекунд и ограничивает ожидание SDK значением 180,000 миллисекунд. Это ограничение относится к данному примеру, а не является универсальным лимитом выполнения Lambda. Если после вычета резерва остаётся менее одной секунды, обработчик отказывается запускаться.

И тайм-аут SDK, и сигнал отмены используют рассчитанный предельный срок. solve создаёт задачу один раз и опрашивает её, пока она не будет готова или не возникнет ошибка. Резерв оставляет обработчику ошибок время для возврата данных восстановления, но принудительное завершение Lambda всё равно может помешать возврату любого ответа.

Вызывающая сторона должна сохранять event.requestId при повторных попытках вызова. Используйте 1–64 буквы ASCII, цифры, символы подчёркивания или дефисы. Не используйте awsRequestId: он идентифицирует вызов, а не логический запрос на решение.

Обрабатывайте ошибки, не запуская новое решение вслепую

Как интерпретировать возвращаемое значение обработчика
Как интерпретировать возвращаемое значение обработчика
РезультатЧто делать
Задача со статусом readyИспользуйте её решение. Одного создания задачи или успешного HTTP-ответа недостаточно.
status: failedЗапишите id и errorCode. Запросите данные задачи, если нужно сообщение об ошибке, но прекратите опрос этой неудачной задачи.
apiErrorЗапишите HTTP-статус и возвращённый ID запроса. Это ошибка запроса к API, а не конечный сбой задачи; выясните причину, прежде чем повторять попытку с теми же входными данными.
interrupted: trueСохраните все возвращённые taskId и requestId вместе с исходным ID логического запроса вызывающей стороны для восстановления.

Ошибки валидации и непредвиденные ошибки выбрасываются повторно. Обработчик не превращает каждое исключение в ответ о прерывании.

  1. 1.

    Восстановите по ID задачи, если он доступен

    Получите существующую задачу с помощью getTask. pending и solving означают, что она ещё выполняется; только ready содержит готовое к использованию решение. Любое дальнейшее ожидание должно укладываться в оставшееся время нового вызова.

  2. 2.

    В противном случае восстановите по ID логического запроса

    Повторите тот же запрос на создание задачи с исходным requestId вызывающей стороны. При совпадении входных данных возвращается существующая задача; при различии возникает конфликт. Во время восстановления не меняйте сайт, действие и прокси, в том числе при изменении конфигурации.

Тайм-аут соединения не означает, что создать задачу не удалось. Восстановите существующую задачу, прежде чем назначать новый идентификатор логического запроса. Базовые контракты описаны в разделах опрос задачи и обработка ошибок API.

Отправьте решение с тем же прокси и возвращёнными данными браузера

SDK возвращает данные решения, но не применяет их на целевом сайте. При отправке решения из приложения используйте настроенный прокси и возвращённые userAgent и secChUa. Не подставляйте посторонние данные браузера или другой целевой URL. Готовая задача означает, что решение сгенерировано, а не что целевой сайт принял последующий запрос.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Использование Node.js SDK в AWS Lambda · solvethree