Open JaredAAT opened 3 years ago
@JaredAAT did you ever figure this out? I'm working with the same package chrome-aws-lambda
and struggling to include all its dependencies.
If anyone else runs into this, the solution is to cd
into your node_modules
in the root of your project and run the install command. This way all the dependencies are included when the external
packages are copied over to the optimized build. I added a postinstall
command to my package.json
so I didn't have to think about running this anytime the repo was cloned or my packages were re-installed.
Note: I also needed to include puppeteer-core
in the external packages, and do a similar production install for that package.
serverless.yml
functionName:
handler: functions/index.handler
optimize:
external: ['chrome-aws-lambda', 'puppeteer-core']
package.json
"scripts": {
...
"postinstall": "yarn run install:chrome-aws-lambda && yarn run install:puppeteer",
"install:chrome-aws-lambda": "cd node_modules/chrome-aws-lambda && npm i --production",
"install:puppeteer": "cd node_modules/puppeteer-core && npm i --production",
},
Hey @alecmcgovern I've attempted this solution and when I run it locally (npm exec serverless offline start
) I get
Warning: Invalid configuration encountered
at 'functions.GeneratePdf': unrecognized property 'optimize'
Learn more about configuration validation here: http://slss.io/configuration-validation
I'm not certain the solution you're suggesting is the answer to my own issue, but it seems related. I'm getting the following error when I actually run the lambda:
Error: Error: Could not find expected browser (chrome) locally. Run `npm install` to download the correct Chromium revision (901912).
Relevant part of the code in question:
import chromeAwsLambda from 'chrome-aws-lambda';
import { PDFOptions } from 'puppeteer-core';
export class PDFGenerator {
static genPdf = async (url: string, options: PDFOptions ): Promise<Buffer> => {
console.log(`Offline: ${process.env.IS_OFFLINE}`)
const executablePath = process.env.IS_OFFLINE == 'true'
? './node_modules/puppeteer/.local-chromium/mac-1011831/chrome-mac/Chromium.app/Contents/MacOS/Chromium'
: await chromeAwsLambda.executablePath;
console.log(`Exec Path: ${executablePath}`)
const browser = await chromeAwsLambda.puppeteer.launch({
args: chromeAwsLambda.args,
executablePath
});
const page = await browser.newPage();
Using node16 fwiw.
@wcpines The first error you're seeing is probably because you're using serverless 2/3 and this package isn't actively maintained anymore: https://github.com/FidelLimited/serverless-plugin-optimize/issues/133#issuecomment-1170138648
when looking at this part of the documentation:
given a serverless.yml of:
how do you go about running
cd external_modules/chrome-aws-lambda && npm i --prod
?