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'
質問済み 2年前533ビュー
1回答
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
回答済み 8ヶ月前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン

関連するコンテンツ