ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

puppeteer を Azure Web Apps で動かす試み

はじめに

久々の投稿が、半年前のこれの焼き増しで、
結論から言うと、アプローチまで同じです。

きっかけ

f:id:horihiro:20190824175752p:plain

ありませんでした。なので調べました。

調査

と言っても、ライブラリーの動作確認を 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 の話になるのですが) に、「ライブラリーが見つからない」というエラー メッセージが記載されていました。

github.com

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 の記事に、必要なライブラリが書いてあります。

qiita.com

さらに文字化け対策に必要なフォントデータについても書かれています。
ありがたみ溢れます。

結論

現時点では、Web Apps で puppeteer を動かすには、Web App for Containers + カスタム コンテナー イメージの組み合わせしかなさそうです。

前述の Qiita の記事を参考に作成した、Web Apps 用の Docker イメージがこちらです。

hub.docker.com

Dockerfile は下記リポジトリーで公開しています。

github.com

# puppeteer 自体入っていないので、npm でインストール、もしくは package.json に書いてデプロイしてください。

今後、継続的にメンテナンスするかはわかりませんが、READMEくらいは近日中に書こうと思います。