首页 > 解决方案 > Puppeteer + AWS Lambda - 找不到浏览器修订版

问题描述

我一直试图让 puppeteer 在 AWS Lambda 上工作,但遇到了错误。我收到的消息是:

“错误”:“找不到浏览器修订版 782078。运行“PUPPETEER_PRODUCT=firefox npm install”或“PUPPETEER_PRODUCT=firefox yarn install”以下载支持的 Firefox 浏览器二进制文件。”

我有足够的内存分配给这个特定的 lambda 以在 11 秒左右运行该函数。

该错误仅在冷启动时显示

该功能离线运行良好,100% 成功。LOCAL=true 是离线运行的时候设置的,所以这里有代码可以区分这两者。

这是我的代码中关于这个 lambda 的重要部分。

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,
  });
}

标签: browseraws-lambdapuppeteerrevision

解决方案


您似乎自己正在对铬文件进行放气,这不是chrome-aws-lambda应有的使用方式。

这是一个非常简单的片段,展示了如何在 lambda 环境中启动 puppeteer:

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,您可以在源代码中看到这一点


推荐阅读