Closed3
Lambda上でPuppeteer(chrome-aws-lambda)を実行するとspawn ETXTBSYエラーが返されて、ブラウザ起動ができない
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);
};
こういうことがダメらしい。
複数回処理をしたい時は事前に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);
};
上記の仮説で解決した。
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にクローズされました