puppeteer on Lambda

0

I want to use puppeteer on Lambda to convert HTML to PDF.
With the chrome-aws-lambda module or the puppeteer module, I'm trying to run (sam local invoke) a function that calls puppeteer.launch(), but the function returns an error.
If anyone is running puppeteer on Lambda, please let me know how you configured it!

CDK Stack

const pdfExportFunction = new lambda.NodejsFunction(this, 'ExportPDF', {
  runtime: Runtime.NODEJS_14_X,
  entry: 'lambda/export-pdf/index.ts',
  timeout: Duration.seconds(10),
  memorySize: 1024,
  // https://github.com/shelfio/chrome-aws-lambda-layer
  layers: [
    LayerVersion.fromLayerVersionArn(this, 'layer:chrome-aws-lambda', 'arn:aws:lambda:ap-northeast-1:764866452798:layer:chrome-aws-lambda:31')
  ]
})

Lambda Function Code (lambda/export-pdf/index.ts)

const chromium = require('@sparticuz/chrome-aws-lambda')

export const handler = async () => {
  try {
    const browser = await chromium.puppeteer.launch()
  } catch (error) {
    // Error: Cannot find module '/var/task/puppeteer/lib/Browser'
    console.log(error)
  }
}

I've tried several different ways to write imports, but each one gives me different errors when call puppeteer.launch().

// Error: Cannot find module '/var/task/puppeteer/lib/Browser'
const chromium = require('chrome-aws-lambda')
// Error: _projectRoot is undefined. Unable to create a BrowserFetcher.
const puppeteer = require('puppeteer')
// The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received undefined
import * as puppeteer from 'puppeteer'
gefragt vor 2 Jahren836 Aufrufe
1 Antwort
0

The chrome-aws-lambda module is now deprecated and has been replaced with the chromium package (https://www.npmjs.com/package/@sparticuz/chromium).

Here is an example that works with sam local invoke

  1. Ensure you have SAM and required pre-reqs installed: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html
  2. Initialize a "hello world" project using the sam CLI. Select node version 18.x for this project
  3. In the newly created directory for the project, install puppateer npm install puppeteer-core@19.8.0
  4. Install chromium npm install @sparticuz/chromium@112.0.2
  5. Copy the below sample into app.mjs, replacing the original hello world code
  6. Sometimes this function will take more than 10 seconds to run. Update the timeout in template.yaml Timeout: 13
  7. Run sam build sam build
  8. Run locally sam local invoke

Sample Code for app.mjs:


import chromium from "@sparticuz/chromium";
import puppeteer from "puppeteer-core";

export const lambdaHandler = async (event, context) => {
  console.log("starting...");
  try {
    const browser = await puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath(),
      headless: chromium.headless,
    });

    const page = await browser.newPage();
    await page.goto("https://example.com");
    const pageTitle = await page.title();
    console.log(pageTitle);
  } catch (error) {
    console.log(error);
  }
};

The Chromium package provides an example for running with a Lambda Layer: https://github.com/Sparticuz/chromium/tree/master/examples/serverless-with-lambda-layer

profile pictureAWS
beantwortet vor 9 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen