serverless-plugin-optimize icon indicating copy to clipboard operation
serverless-plugin-optimize copied to clipboard

how do you install external dependencies?

Open JaredAAT opened this issue 4 years ago • 4 comments

when looking at this part of the documentation:

external Array of modules to be copied into node_modules instead of being loaded into browserify bundle. Note that external modules will require it's dependencies within it's directory. (cd external_modules/some-module && npm i --prod)

given a serverless.yml of:

functions:
  resultpdf:
      handler: handler.resultPDF
      runtime: nodejs12.x
      timeout: 20
      memorySize: 1600
      optimize:
        external: ["chrome-aws-lambda"]

how do you go about running cd external_modules/chrome-aws-lambda && npm i --prod?

JaredAAT avatar Apr 30 '21 13:04 JaredAAT

@JaredAAT did you ever figure this out? I'm working with the same package chrome-aws-lambda and struggling to include all its dependencies.

alecmcgovern avatar Nov 18 '21 17:11 alecmcgovern

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",
  },

alecmcgovern avatar Nov 22 '21 15:11 alecmcgovern

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 avatar Jul 22 '22 21:07 wcpines

@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

JaredAAT avatar Jul 25 '22 08:07 JaredAAT