続 puppeteer を Azure Web Apps で動かす試み

# こんなタイトルばっかり。

はじめに

Dockerfile の README を書く、といって早 4,5ヶ月、完全に忘れていたら書く必要がなくなってました。

uncaughtexception.hatenablog.com

本編

下記の App Service on Linux で Deno を動かした記事で使った方法と同様に、スタートアップ スクリプトでの必須ライブラリー/フォントのインストールを試してみました。

uncaughtexception.hatenablog.com

スタートアップ スクリプトに関しては、こちらの記事に雑に書いてあります。

qiita.com

スタートアップ スクリプトに記載した Puppeteer に必要なライブラリーをインストールする部分は、下記のものです。

#!/bin/sh

apt update \
    && apt install -y \
      ca-certificates \
      fonts-liberation \
      gconf-service \
      libappindicator1 \
      libasound2 \
      libatk1.0-0 \
      libatk-bridge2.0-0 \
      libc6 \
      libcairo2 \
      libcups2 \
      libdbus-1-3 \
      libexpat1 \
      libfontconfig1 \
      libgcc1 \
      libgconf-2-4 \
      libgdk-pixbuf2.0-0 \
      libglib2.0-0 \
      libgtk-3-0 \
      libnspr4 \
      libnss3 \
      libpango-1.0-0 \
      libpangocairo-1.0-0 \
      libstdc++6 \
      libx11-6 \
      libx11-xcb1 \
      libxcb1 \
      libxcomposite1 \
      libxcursor1 \
      libxdamage1 \
      libxext6 \
      libxfixes3 \
      libxi6 \
      libxrandr2 \
      libxrender1 \
      libxss1 \
      libxtst6 \
      lsb-release \
      unzip \
      wget \
      xdg-utils \
    && mkdir /noto && cd /noto \
    && wget https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
    && unzip NotoSansCJKjp-hinted.zip \
    && mkdir -p /usr/share/fonts/noto \
    && cp *.otf /usr/share/fonts/noto \
    && chmod 644 -R /usr/share/fonts/noto/ \
    && fc-cache -fv \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /noto

Puppeteer の動作確認は、下記の JS ファイルを使用し、ProtoOut Studio のトップ画面のスクリーンショットを取得してみました。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
  const page = await browser.newPage();
  await page.goto('https://protoout.studio/');
  await page.waitFor(10000);
  await page.screenshot({path: 'example.png'});
  await browser.close();
})();

結果はこちら。 f:id:horihiro:20200105123409p:plain # テストに使ってすみません🙇‍♂️
# 3 期生、募集中だそうです。

問題なく取得できていますね。
カスタム コンテナーではなく、Node.js の Blessed Image 上で Puppeteer が動作することを確認できました。

なお、実際の Web アプリケーションのスタートアップ スクリプトに上記スクリプトを組み込んだ場合、この必須ライブラリーのインストールが起動処理の一部として実行されます。
インストールするライブラリーが多く、結構時間がかかるので、App Service のアプリケーション設定 WEBSITES_CONTAINER_START_TIME_LIMIT にこのインストール時間を見込んだ値を指定する必要があります。

docs.microsoft.com

カスタム コンテナーの起動に時間がかかり、起動が終了する前にプラットフォームがコンテナーを再起動します。 プラットフォームがコンテナーを再起動する前の待機時間を構成できます。 これを行うには、WEBSITES_CONTAINER_START_TIME_LIMIT アプリ設定を目的の値に設定します。 既定値は 230 秒であり、最大値は 1800 秒です。

カスタム コンテナーにした場合も、コンテナー イメージのサイズが大きくなるとダウンロードがかかるので、どちらを使うのがよいかはケース バイ ケースです。

余談

上記のシェル スクリプトなどは、ローカル環境で作成した App Service の FTP からアップロードしていたのですが、当初は改行コードを気を付けて作成した (<LF> のみにした) にもかかわらず、App Service on Linux 上で正常に動作しませんでした。

調べてみると、FTP でのアップロードの際には binary モードにしないと、アップロードされたファイルの改行コードが <CR><LF> へと置き換えられているようでした。

App Service on Linux は、Web アプリケーションは Linux 環境ですが、FTP サーバーは Windows なので、その影響かもしれません。たぶん。

超余談

リング フィット アドベンチャー、始めました。
運動不足を解消したいです。 f:id:horihiro:20200105171815p:plain