はじめに
久々の投稿が、半年前のこれの焼き増しで、
結論から言うと、アプローチまで同じです。
きっかけ
ありませんでした。なので調べました。
調査
と言っても、ライブラリーの動作確認を Web Apps 側でやっていないでしょうが、GitHub や StackOverFlow 、 Qiita には何か情報があるかも。
Web Apps ではないですが、Function App (ベースは Web Apps と一緒です) の issue にありました。 github.com
We had to block some of the APIs that headless browsers rely on in our Windows environments(https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#win32ksys-user32gdi32-restrictions).
リンク先にはこのように。
Win32k.sys (User32/GDI32) Restrictions
For the sake of radical attack surface area reduction, the sandbox prevents almost all of the Win32k.sys APIs from being called, which practically means that most of User32/GDI32 system calls are blocked. For most applications this is not an issue since most Azure Web Apps do not require access to Windows UI functionality (they are web applications after all).
「画面系のシステム コールは Web アプリケーションには不要だから、実行を制限しているよ」といったところでしょうか(雑訳)。
どうやら、Windows 版の puppeteer は、上記システム コールを使っている様子。
なので、Windows ベースの Web Apps では、puppeteer の実行は無理っぽいです。
では、Linux ベースならどうか。
同じ issue (なので、Function App の話になるのですが) に、「ライブラリーが見つからない」というエラー メッセージが記載されていました。
libXtst.so.6 => not found
libnss3.so => not found
libnssutil3.so => not found
libsmime3.so => not found
libnspr4.so => not found
libXss.so.1 => not found
libasound.so.2 => not found
libatk-bridge-2.0.so.0 => not found
libgtk-3.so.0 => not found
libgdk-3.so.0 => not found
カスタム コンテナー イメージが必要な雰囲気です。
こちらの Qiita の記事に、必要なライブラリが書いてあります。
さらに文字化け対策に必要なフォントデータについても書かれています。
ありがたみ溢れます。
結論
現時点では、Web Apps で puppeteer を動かすには、Web App for Containers + カスタム コンテナー イメージの組み合わせしかなさそうです。
前述の Qiita の記事を参考に作成した、Web Apps 用の Docker イメージがこちらです。
Dockerfile は下記リポジトリーで公開しています。
# puppeteer 自体入っていないので、npm でインストール、もしくは package.json に書いてデプロイしてください。
今後、継続的にメンテナンスするかはわかりませんが、READMEくらいは近日中に書こうと思います。