背景
Lambda上でPuppeteerを動かして,
指定したWebページをスクショする機能がある.
Webページの中にはものすごく長いページ(ロングスクロール)が存在する.
このようなページをスクショしようとすると下記のエラーが発生して処理が終わる.
今回, Lambda上で動くPuppeteerにおいて,
これを乗り越えてものすごく長いページでもスクショができる方法がわかったので,
同じように長いページをスクショしたい勢に向けて贈る.
対応方法
Lambdaのエフェメラルストレージを増やす
最近更新されたコメントによってエラーの詳細が明らかになった.
つまるところ, /tmpディレクトリの容量が足りてないらしい.
https://github.com/puppeteer/puppeteer/issues/5341#issuecomment-1118387787
Lambdaは最近, /tmpディレクトリの容量増やせるようになったので下記を参考にしながら増やしましょう.
https://aws.amazon.com/jp/blogs/news/aws-lambda-now-supports-up-to-10-gb-ephemeral-storage/
launchのargsにオプションを設定
実はエフェメラルストレージを増やしただけだと取れなかった.
下記のエラーが出る.
[0524/103738.281035:ERROR:tile_manager.cc(821)] WARNING: tile memory limits exceeded, some content may not draw
タイルメモリの制限を超えているらしい.
これはコメントにある通り,
launchのargsに --force-gpu-mem-available-mb
を設定すると良い.
我々は下記のように設定.
module.exports = async (args) => {
const browser = await chromium.puppeteer.launch({
args: chromium.args.concat(['--force-gpu-mem-available-mb=4096']),
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless,
});
...以下略
これで取れるようになった.
※ オプションは下記に一覧がまとまってます
https://peter.sh/experiments/chromium-command-line-switches/
最後に
あまり需要がないケースかもしれませんが,
もし困っている人がいたら参考にしていただければと.