2018年版、無料でWebサイトの定期操作スクリプトを動かす
古来よりある「Webサイトを定期的にポチポチしたい」というニーズ。私も昔herokuで作った記憶がありますが、最近また需要がゴキのように湧いて出てきました。奴らは忘れた頃にやってきます。
以前ツールを作った時からかなり時間が経ち、より便利なサービスが出ているはずです。そこで、2018年現在の「できるだけ安くWebサイトを定期的にポチポチするスクリプトを動かす」方法を調べてみました。
要件の洗い出し
まずは要件を整理します。
- 一日一回、Webサイトにログインしてクリックなどの単純な操作をする
- 操作は長くとも5分で終わる
- クレデンシャルはデプロイ時に設定できれば十分
- ユーザー認証を付けてスクリプト側で管理する必要はない
- 他人が勝手に実行できない
- ランニングコストをなるべく安くしたい
非常にシンプルですね。お金がかからず、簡単な方法があれば最適です。
技術選定
ボトムアップでの選定
以下の理由から、インフラから考えるのが妥当でしょう。
- プログラムの規模が極めて小さい
- → インフラに合わせて言語を決めればよい
- Seleniumは多くの言語で簡単に使える
- → 同じく
- 1日に5分しか走らないため、常時実行させなくて良い
- → 常時実行で安いか、5分だけ実行で定期実行に対応しているか、に絞って探せる
2018年現在、このような要件を満たすインフラは多くあります。その中でも無料で使えそうなサービスをいくつか考えてみます。
無料インフラの候補たち
AppEngine Standard Environment
簡単にcronが設定でき、デプロイも簡単です。また、バックグラウンド実行は9時間/月まで無料なので、お金も掛からなさそうです。
AWS Lambda
CloudWatchと組み合わせてcronのような定期実行が可能です。また、100万回/月の呼び出しまで無料です。が、実行の制限時間が5分ちょうどなので、少し怪しそうです。
heroku
古参ですが、未だに極めて実用的です(すごい)。最低でも550-1,000時間/月は無料で動かせ、cron add-onもタダです。
ピタゴラスイッチ
これは特定のサービスではなく、様々な小さな処理を組み合わせてピタゴラスイッチ的に目的を達成する闇の手法を指します。例えば、家の扉が開いたのをトリガーとしてIFTTTを経由しcurlを叩く……などなど。遊びでやるには楽しいですが、3日経つとメンテ出来なくなりそうなので今回は却下です。
選択肢はいくつかありますが、枯れ具合はherokuが一番良さそうですし、無料枠も十分にあります。今回の目的に一番適っていると考え、結局またherokuにしました。
言語
herokuが対応している言語はいくつかありますが、herokuの対応、Seleniumの扱いと書きやすさのバランスを取ってrubyに決定しました。
インフラ環境構築・コーディング
と、大層な見出しを付けましたが、herokuなので一瞬です。また、heroku上でヘッドレスブラウザ(Headless Chrome)を使うのにいくつか追加で設定が必要ですが、下記記事にまとまっている通りなので従えば完了です。
これだけだとあまりに寂しいので、コーディングの小ネタを少しだけ書いておきます。
ローカル環境で動作確認したい
本番はHeadlessモードですが、開発中は実際に動いているところを確認したいです。これは簡単に実現でき、テスト用の環境変数が設定されていればただのChromeで、されていなければHeadlessで起動するようにするだけでOKです。
def selenium_driver
if ENV.key?('TEST')
Selenium::WebDriver.for :chrome
else
caps = Selenium::WebDriver::Remote::Capabilities.chrome('chromeOptions' => { binary: '/app/.apt/usr/bin/google-chrome', args: ['--headless'] })
Selenium::WebDriver.for :chrome, desired_capabilities: caps
end
end
新しいタブで開きたい
Seleniumが提供していない機能なので、無理やり書き換える必要があります。下記StackOverflowの投稿を参考にすると実現できます。
Herokuのセットアップ
gitリポジトリを今回のHeroku環境に対応させるのは、以下のようなコマンド列で簡単にできます。
cd <repository-path>
heroku login
heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-chromedriver.git
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-chrome.git
heroku config:set SECRET=<XXXX>
heroku addons:create scheduler:standard
heroku git:remote -a <name-of-project>
git push heroku master
heroku addons:open scheduler
Rubocop
かけよう。
まとめ
未だにherokuが目的に適うことに驚きました。GCPやAWSで同じことができても、「オッさすが大企業だな」と思うだけですが、こう長く無料のままだと不安になってきます。
さして知見はありませんが、何かの参考になれば幸いです。