GAミント至上主義

Web Monomaniacal Developer.

ヘッドレスChromeを使ったPDF変換サーバーをGoogle App Engineに対応させた

yagishでも使っているHeadless Chromeを使ったHTML→PDF変換サーバーhcep-pdf-server。

github.com
これまでDockerコンテナだけだったけど、Google App Engineでも同一コードで動くようにいろいろ変えた。
まだ実運用はしてないのでベータ版。
現在テストで使っているapp.yamlも同梱したのでそのままデプロイできる。

詳しくは前回の記事
uyamazak.hatenablog.com

シンプルなアプリケーションだけど、まだJSのコード知識が少なさを感じる。
現状美しくはないけど動いているので、処理には手をつけられていない。

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

Google App Engine standardのNode8 & Python3.7対応で移転祭りはっじまっるよ~!

わぁい!

GCPコスパ最強のアプリ環境App Engineで長年待ち望んだPython3が公開されました。まだβ。

従来のGAEと大きく変わるためSecond generationと呼ばれてます。
App Engine standard environment runtimes  |  App Engine Documentation  |  Google Cloud

これまであった言語のバージョンが古いとかライブラリが限られるとか、大きな欠点がなくなり、GKE+HTTPSロードバランサーを使わざるをえなかった状況がかなり減りそうな予感。

GKEと比較したGAEのメリットはパッと思いつくだけで

Python3.7ということで、DjangoなんかはGAE一択になりそうな予感。

Nodeも8だから、Cloud Functionsの方で肥大化してしまったサービスはGAEに移した方が管理しやすいかも。

Nuxt.jsを使ったSSRのVue.jsアプリなんかもGAEでいけそう。

さすがにヘッドレスChromeは無理かな。。。と思ってググったら公式にあるからいけそう!
Using Headless Chrome with Puppeteer  |  App Engine standard environment for Node.js docs  |  Google Cloud

とはいえ、まだ触ってないので、これからガンガン試してみる。

でもコスト面では一概にGKEよりGAEがいいとか安いとかはいえず、一定のアクセスがくるようなサービスはGKE、波が大きいのはGAEみたいな使い分けが必要なってくるかも。

また小さいサービスをたくさん組み合わせるようなシステムの場合は、GKEでローカルIPで接続した方が、グローバルに出てドメインでアクセスする必要のあるGAEに比べて圧倒的に早いし、GKEの方が効率よくマシンを使えそう。