最近話題の CloudRun で Firefox ヘッドレスブラウザを実行して、スクリーンショットを返すサーバレスを試してみます。なぜ Chrome ではなく Firefox かというと、Web フォント(日本語)の unicode-range がうまく動かないので仕方なく Firefox にしています。Firefox はちゃんと動く。最高。
Docker
FROM selenium/standalone-firefox
WORKDIR /app
ADD /app .
EXPOSE 8000
CMD ["python", "server.py"]
selenium/standalone-firefox
という Firefox が入っている良い感じのコンテナがあるので、これを使います。このコンテナには Python2.7 が入っているので、Python で Web サーバを構築します。僕は Python は初心者です。
Web サーバ
server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import SimpleHTTPServer as s
import BaseHTTPServer as b
import subprocess
class MyHandler(s.SimpleHTTPRequestHandler):
def do_GET(self):
self.make_screenshot()
def make_screenshot(self):
subprocess.call(['firefox', '-screenshot', '/tmp/screenshot.png', 'http://example.com/'])
self.send_response(200)
self.send_header('Content-type', 'image/png')
self.end_headers()
self.wfile.write(open('/tmp/screenshot.png', 'rb').read())
host = '0.0.0.0'
port = int(os.environ.get('PORT', 8000))
httpd = b.HTTPServer((host, port), MyHandler)
print('ポート:%s' % port)
httpd.serve_forever()
firefox
に screenshot
オプションを渡すとスクリーンショットを保存してくれます。便利。あとは CloudRun 実行時に環境変数で提供されるポート番号を利用して Web サーバを起動するだけ。
CloudRun へデプロイ
gcloud components install beta
gcloud components update
gcloud auth login
gcloud config set project [PROJECT_NAME]
gcloud builds submit --tag gcr.io/[PROJECT_NAME]/firefox-headless-container
gcloud beta run deploy --image gcr.io/[PROJECT_NAME]/firefox-headless-container
これだけで OK 。非常に簡単。正常にデプロイできれば URL が発行されるので、そこにアクセスするとスクリーンショットの画像が返ってきます。