puppeteer: puppeteer screenshot running on aws lambda crashes when encountering large image on site
Steps to reproduce
Tell us about your environment:
- Puppeteer version: 1.12.2
 - Platform / OS version: aws lambda
 - URLs (if applicable):
 - Node.js version: 8.10
 - Lambda memory size: 3gb (with 30 sec timeout)
 
What steps will reproduce the problem?
const chromium = require('chrome-aws-lambda');
const puppeteer = require('puppeteer-core');
const SCREENSHOT_WIDTH = 1200;
const SCREENSHOT_HEIGHT = 808;
exports.handler = async (event, context, callback) => {
  let url = '';
  let tokenHash = '';
  if (event.queryStringParameters) {
    if (event.queryStringParameters.url) {
      url = event.queryStringParameters.url;
    }
    if (event.queryStringParameters.t) {
      tokenHash = event.queryStringParameters.t;
    }
  }
  let browser = null;
  let rawScreenshot = null;
  try {
    browser = await puppeteer.launch({
      args: chromium.args,
      executablePath: await chromium.executablePath,
      headless: chromium.headless,
    });
    
    const page = await browser.newPage();
    await page.setViewport({ width: SCREENSHOT_WIDTH, height: SCREENSHOT_HEIGHT });
    await page.goto(url, {});
  
    rawScreenshot = await page.screenshot({});
    await page.close();
  } catch (e) {
    console.log('token hash: ' + tokenHash);
    console.log(e);
    callback(null, {
      statusCode: 500,
      body: e.message,
      headers: {
        'Content-Type': 'text/plain',
      },
    });
  } finally {
    if (browser !== null) {
      await browser.close();
    }
  }
  callback(null, {
    statusCode: 200,
    isBase64Encoded: true,
    body: rawScreenshot.toString('base64'),
    headers: {
      'Content-Type': 'image/png',
    },
  });
};
- I deploy my function to AWS lambda and I invoke it with the url param
 - sample site I’m using https://bluelitephotography.myportfolio.com
 
What is the expected result? A screenshot being returned
What happens instead? I consistently get the following error:
Protocol error (Page.captureScreenshot): Target closed.
Notice the 4.5 mb image being loaded on that page. The same code return screenshot successfully with most other websites.
About this issue
- Original URL
 - State: closed
 - Created 5 years ago
 - Comments: 15 (1 by maintainers)
 
To add more information: We’ve been running Puppeteer on Lambda (Node 10.x runtime) using
chrome-aws-lambdawith the default settings (and others while debugging, nothing worked).When rendering HTML with an image with the following information, the browser process dies.
With
dumpio: true, we get:What’s odd is the Lambda is configured to the maximum 3008MB. The ~155MB mentioned above is significantly less than that, and I don’t believe our Node service is using up the rest of it.
Any ideas of limits that may be not allowing Chromium to use all of the Lambda memory?
@amazd Tab crashes, most likely running out of memory. I don’t think we can do much about it on the puppeteer side; running chrome in a constrained environment is an art by itself.
I’d start with https://github.com/alixaxel/chrome-aws-lambda - a well-maintained and actually used by folks in production. There are also many more articles on the Web that might be helpful.
Hope this helps.
OP here, I was never able to fix the issue. In our case we came up with a hack, since we had access to the sites we were taking a screenshot of, we just made the photos load in lower resolution when the site detected puppeteer was taking a screenshot 😃
Was hoping this was something the puppeteer team could look more into