GAミント至上主義

Web Monomaniacal Developer.

Google App Engine Node.js Standard EnvironmentでPuppeteerを使ったPDF変換サーバーを動かす

yagish履歴書でも裏で使っているHTML→PDFの変換サーバー。
GitHubでも公開してます。
github.com

これがGoogle App Engineでも動きそうなので試してみた。
さすがにChromeはインストールできないのでPuppeteer付属のChroniumを使う点と、日本語フォントでちょっとはまったけど問題なく動いた。
でも現時点ではβなのでいろいろ注意。

Puppeteerを動かすのは下記に公式ドキュメントあり。PDF、スクリーンショットの他、テストもはかどりそう。

Using Headless Chrome with Puppeteer  |  App Engine standard environment for Node.js docs  |  Google Cloud

基本的なことは公式を読んでおく。
Google App Engine Node.js Standard Environment Documentation  |  App Engine standard environment for Node.js docs  |  Google Cloud


アプリケーションのコードはGitHubとほぼ同じなので省略。
ファイル構成はこんな感じ。
fontsディレクトリに必要な日本語ファイルを置いておく。無駄に置くとアップロードに時間がかかるのとお金もかかるので最低限にした方がよさげ。

% tree
.
└── app
    ├── app.js
    ├── app.yaml
    ├── fonts
    │   ├── fonts.conf
    │   ├── google
    │   │   ├── NotoSansJP-Medium.otf
    │   │   └── NotoSansJP-Regular.otf
    ├── package-lock.json
    └── package.json

app.yaml

runtime: nodejs8
instance_class: F4_1G
env_variables:
  FONTCONFIG_PATH: "/srv/fonts/"

デプロイ設定はこんな感じ。
FONTCONFIG_PATHで上記フォントのディレクトリを指定する。
/srvはアプリケーションでカレントディレクトリをログに出して見て調べた。
何かで変わってしまうかもしれない。

フォントの設定ファイル
fonts.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/srv/fonts</dir>
</fontconfig>

フォントの設定は下記記事を参考にさせていただきました。
LambdaよりGAEの方が楽そう。

LambdaでPuppeteer/Headless Chrome | scratchpad

これで無事動いたのだけれど、既存のプロジェクトはリージョンがusになってしまっていて変えられない。そのため結構遅い。
新しくプロジェクトを作り直して日本においてみて、速度を試してみる。
もし問題がなかったら現在GKEで動いているものをGAEにしようと思う。

コードとファイルも整理してGAE用としてGitHubに上げる。

GAEもSecondで最新版の言語ランタイムや自由にパッケージが使えるようになってくるので、GKE、GAE、Cloud Functionsを使い分けるのがはかどりそう。

今度はPython3のDjangoかな
uyamazak.hatenablog.com