Puppeteer + AWS Lambda - Не удалось найти версию браузера - PullRequest
0 голосов
/ 05 августа 2020

Я пытался заставить кукловода работать с AWS Lambda, но у меня возникла ошибка. Я получаю следующее сообщение:

«error»: «Не удалось найти версию браузера 782078. Запустите« PUPPETEER_PRODUCT = firefox npm install »или« PUPPETEER_PRODUCT = firefox yarn install », чтобы загрузите поддерживаемый Firefox двоичный файл браузера. "

У меня достаточно памяти, выделенной для этой c лямбды, чтобы запустить функцию около 11 секунд.

Только ошибка отображается при холодном запуске

Функция работает в автономном режиме со 100% успехом. LOCAL = true устанавливается при работе в автономном режиме, поэтому здесь есть код для различия guish между двумя запеченными здесь.

Вот важные части моего кода, касающиеся этой лямбды.

import chromium from "chrome-aws-lambda";
import { inflate } from "lambdafs";
import path from "path";

const isLocal = !!process.env.LOCAL;

process.env.HOME = "/tmp";
if (process.env.FONTCONFIG_PATH === undefined) {
  process.env.FONTCONFIG_PATH = "/tmp/aws";
}

if (process.env.LD_LIBRARY_PATH === undefined) {
  process.env.LD_LIBRARY_PATH = "/tmp/aws/lib";
} else if (process.env.LD_LIBRARY_PATH.startsWith("/tmp/aws/lib") !== true) {
  process.env.LD_LIBRARY_PATH = [...new Set(["/tmp/aws/lib", ...process.env.LD_LIBRARY_PATH.split(":")])].join(":");
}

let input;
if (!isLocal) {
  input = "/opt/nodejs/node_modules/chrome-aws-lambda/bin";
} else {
  input = path.resolve(__dirname, "../node_modules/chrome-aws-lambda/bin");
}

const blockedResourceTypes = ["image", "media", "font", "texttrack", "object", "beacon", "csp_report", "imageset"];

const skippedResources = [
  "quantserve",
  "adzerk",
  "doubleclick",
  "adition",
  "exelator",
  "sharethrough",
  "cdn.api.twitter",
  "google-analytics",
  "googletagmanager",
  "fontawesome",
  "facebook",
  "analytics",
  "optimizely",
  "clicktale",
  "mixpanel",
  "zedo",
  "clicksor",
  "tiqcdn",
];

export async function handler(event) {
  const credentials = {
    userName: event.userName,
    password: event.password,
    site_login_id: event.site_login_id,
    user_id: event.juice_userid,
  };

  let chrome, aws, shader;

  (async () => {
    chrome = await inflate(`${input}/chromium.br`);
    shader = await inflate(`${input}/swiftshader.tar.br`);
    aws = await inflate(`${input}/aws.tar.br`);
  })();

  const chromePath = isLocal ? undefined : chrome;

  const puppeteer = chromium.puppeteer;

  const browser = await puppeteer.launch({
    args: chromium.args,
    defaultViewport: chromium.defaultViewport,
    executablePath: chromePath,
    ignoreDefaultArgs: ["--disable-extensions"],
    headless: true,
  });
}

1 Ответ

1 голос
/ 13 августа 2020

похоже, вы сами сдуваете файлы хрома, а chrome-aws-lambda не предназначен для использования.

Вот очень простой фрагмент, который показывает, как вы можете запустить кукольника в среде лямбда:

const chromium = require('chrome-aws-lambda');

const handler = async () => {
  let result = null;
  let browser = null;

  try {
    browser = await chromium.puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath,
      headless: chromium.headless,
      ignoreHTTPSErrors: true,
    });

    let page = await browser.newPage();

    await page.goto(event.url || 'https://example.com');

    result = await page.title();
  } catch (error) {
    // handle error
  } finally {
    if (browser !== null) {
      await browser.close();
    }
  }
};

module.exports = { handler };

chrome-aws-lambda обрабатывает выкачивание необходимых ресурсов, когда вы выполняете await chromium.executablePath, вы можете увидеть это в исходном коде .

...