Closed3

Lambda上でPuppeteer(chrome-aws-lambda)を実行するとspawn ETXTBSYエラーが返されて、ブラウザ起動ができない

yuyake0084yuyake0084

chrome-aws-lambdaのREADMEに明記されている以下のコードは動くが、handler直下のブロック以外のところで実行しようとすると動かない?🤔

const chromium = require('chrome-aws-lambda');

exports.handler = async (event, context, callback) => {
  let result = null;
  let browser = null;

  try {
    browser = await chromium.puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath,
      headless: chromium.headless,
      ignoreHTTPSErrors: true,
    });

    let page = await browser.newPage();

    await page.goto(event.url || 'https://example.com');

    result = await page.title();
  } catch (error) {
    return callback(error);
  } finally {
    if (browser !== null) {
      await browser.close();
    }
  }

  return callback(null, result);
};
yuyake0084yuyake0084

こういうことがダメらしい。
複数回処理をしたい時は事前にlaunchを一回だけ起動しておいて、都度newPageをすればいける?🤔

const chromium = require('chrome-aws-lambda');

exports.handler = async (event, context, callback) => {

  // 繰り返し処理の中で並列でPuppeteerを起動する
  await Promise.all(
    [...new Array(10)].map(async () => {
      let result = null;
      let browser = null;

      try {
        browser = await chromium.puppeteer.launch({
          args: chromium.args,
          defaultViewport: chromium.defaultViewport,
          executablePath: await chromium.executablePath,
          headless: chromium.headless,
          ignoreHTTPSErrors: true,
        });

        let page = await browser.newPage();

        await page.goto(event.url || 'https://example.com');

        result = await page.title();
      } catch (error) {
        return callback(error);
      } finally {
        if (browser !== null) {
          await browser.close();
        }
      }
    })
  )

  return callback(null, result);
};
yuyake0084yuyake0084

上記の仮説で解決した。

const chromium = require('chrome-aws-lambda');

exports.handler = async (event, context, callback) => {
  // launchは繰り返し処理のスコープ外で実行する
  const browser = await chromium.puppeteer.launch({
      args: chromium.args,
      defaultViewport: chromium.defaultViewport,
      executablePath: await chromium.executablePath,
      headless: chromium.headless,
      ignoreHTTPSErrors: true,
  });

  // 繰り返し処理の中で並列でPuppeteerを起動する
  await Promise.all(
    [...new Array(10)].map(async () => {
      let result = null;

      try {
        let page = await browser.newPage();

        await page.goto(event.url || 'https://example.com');

        result = await page.title();
      } catch (error) {
        return callback(error);
      } finally {
        if (browser !== null) {
          await browser.close();
        }
      }
    })
  )

  return callback(null, result);
};
このスクラップは2021/02/21にクローズされました