3
Help us understand the problem. What are the problem?

posted at

updated at

Organization

[AWS Puppeteer on Lambda ] ロングスクロールページをスクショする

背景

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/

最後に

あまり需要がないケースかもしれませんが,
もし困っている人がいたら参考にしていただければと.

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
3
Help us understand the problem. What are the problem?