我想使用puppeteer
在Lambda转换为PDF。
对于chrome-aws-lambda
模块或puppeteer
模块,我试图运行一个调用puppeteer.launch()
的函数(sam local invoke
),但该函数返回一个错误。
如果有人在Lambda上运行puppeteer
,请告诉我您是如何配置它的!
CDK堆栈
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)
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()
时都会给出不同的错误。
// 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'
发布于 2022-07-19 15:50:03
我经历了你提到的同样的错误,这就是我是如何成功的。
首先,我使用一个Docker容器来运行它。这对我来说是最简单的解决办法。
Dockerfile
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
排除在绑定之外。
{
"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
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()
}
希望这能帮到你!
https://stackoverflow.com/questions/73003702
复制相似问题