記録するほどのことでもないのですが、少しだけ工夫があったので残しておきます。
Heroku便利で無料枠がありがたいのですが、20分アクセスが無いとスリープ(終了)してしまって次のアクセス時にはDyno起動に掛かるオーバーヘッドが地味に気になります。ただでさえ少し遅く感じるので、デモ用途にせよPOC用途にせよ少しでもキビキビ動いてほしいものです。
そこで、integromatを使って定期的にアクセスしてDynoを起こしたままにする方法を考えました。
20分おきにHerokuで起動しているWAS(web Dyno)にアクセスして上げれば良いのだと思いますが、これですと今度はintegromatの無料枠を超えてしまいます。
integromatの無料枠を超えるのが大体3倍程度のステップ数に達しますので、3つのアカウントを使い分けてスケジュール起動させれば一応技術的には対応可能なのですが、素直に既存のintegromatにシナリオを追加して対応すると課金は発生してしまいます。
今度はDynoが起動されたままになると、worker DynoなどにHerokuの無料枠を割り当てられなくなってきますので、今度は逆にintegromatに夜の使わない時間帯はアクセスさせないようにします。これを1ステップだけで行うのに若干試行錯誤がありましたので記しておきます。
{{if(((timestamp + "+9*60*60") % ("24*60*60")) + " > 9*60*60"; "https://test.com/login?ts=" + timestamp; "https://www.google.com?ts=" + timestamp)}}
この例では、0時〜9時まではwww.google.comにアクセスすることにして、Herokuにはアクセスしないようにします。
if制御文を使って、稼働時のUnix時間により判定しています。
また、日本ですと+9*60*60とするところが正しく時刻判定するためのコツになります。
出来れば、指定時間帯はintegromat自体動作しないようにさせたいのですが、素のスケジュール設定では出来ないようです。integromatはステップ数に応じて無料カウンターを消費してしまうのでなるべくブロック(ステップ)を減らすのがポイントです。
一方、GASの場合は1アカウントで十分機能します。
function execHerokuAccess() {
var response = UrlFetchApp.fetch("https://access.to.heroku.mysite.com");
Logger.log(response);
}
// 定期的にonMyEditを呼び出すタイマーの登録処理
function starter() {
var current = SpreadsheetApp.getActiveSpreadsheet();
ScriptApp.newTrigger('execHerokuAccess').timeBased().everyMinutes(15).create();
}
まず、starter()を手動で実行し、必要な権限付与等の手順を実施するとトリガーの設定が自動的に作成されます。設定を変更することで15分おきから頻度を変えられるのですが、次に指定できる値は30分おきになってしまいます。
これで、15分おきにweb.dynoを活性化してくれます。