首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >兰布达木偶师

兰布达木偶师
EN

Stack Overflow用户
提问于 2022-07-16 11:13:06
回答 1查看 784关注 0票数 2

我想使用puppeteer在Lambda转换为PDF。

对于chrome-aws-lambda模块或puppeteer模块,我试图运行一个调用puppeteer.launch()的函数(sam local invoke),但该函数返回一个错误。

如果有人在Lambda上运行puppeteer,请告诉我您是如何配置它的!

CDK堆栈

代码语言:javascript
运行
复制
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函数代码(lambda/export/index.ts)

代码语言:javascript
运行
复制
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)
  }
}

我尝试过几种编写导入的不同方法,但每次调用puppeteer.launch()时都会给出不同的错误。

代码语言:javascript
运行
复制
// Error: Cannot find module '/var/task/puppeteer/lib/Browser'
const chromium = require('chrome-aws-lambda')
代码语言:javascript
运行
复制
// Error: _projectRoot is undefined. Unable to create a BrowserFetcher.
const puppeteer = require('puppeteer')
代码语言:javascript
运行
复制
// The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received undefined
import * as puppeteer from 'puppeteer'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-19 15:50:03

我经历了你提到的同样的错误,这就是我是如何成功的。

首先,我使用一个Docker容器来运行它。这对我来说是最简单的解决办法。

Dockerfile

代码语言:javascript
运行
复制
FROM amazon/aws-lambda-nodejs:16

# Install Chrome to get all of the dependencies installed
ADD https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm chrome.rpm
RUN yum install -y ./chrome.rpm

COPY . ${LAMBDA_TASK_ROOT}/

RUN npm install
RUN npm run build-prod

# Handler of the lambda function (file out.js, function handler)
CMD [ "out.handler" ]

package.json

注意build-prod脚本,我已经将puppeteer排除在绑定之外。

代码语言:javascript
运行
复制
{
  "name": "test",
  "private": true,
  "version": "1.0.0",
  "source": "index.js",
  "scripts": {
    "build-prod": "esbuild index.js --bundle --platform=node --external:puppeteer --target=node16 --outfile=out.js"
  },
  "dependencies": {
    "puppeteer": "^15.4.0",
  },
  "devDependencies": {
    "esbuild": "^0.14.49"
  },
  "engines": {
    "node": ">= 16"
  }
}

index.js

代码语言:javascript
运行
复制
import puppeteer from 'puppeteer';

export async function handler(event) {
    const browser = await puppeteer.launch({
        headless: true,
        executablePath: '/usr/bin/google-chrome',
        args: ['--no-sandbox', '--disable-setuid-sandbox', '--no-zygote'],
    })

    // Some stuff

    // Important!
    await browser.close()
}

希望这能帮到你!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73003702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档