Help us understand the problem. What is going on with this article?

Herokuでバックグラウンドジョブ実行中にDynoが再起動されるのを回避する方法

はじめに

Herokuで構築していたアプリケーションでバックグラウンドジョブを設定していた時にたまたまDynoの再起動タイミングと重なってしまい処理がコケてしまったので、それを防ぐ方法について書いておこうと思います。

Dynoのライフサイクルについてはこちらに少し記載があります。

アプリとシステム全体の健全性を維持するため 1 日に 1 回以上再起動されます(再起動の時点で残っているリクエストは、問題なく処理されます)。複数の dyno を実行するアプリの場合、各 dyno は異なる間隔で再起動されます。

dyno の再起動は Dyno Manager によって自動的かつ透過的に行われ、ログに記録されます。スケジュールにもとづく再起動だけでなく、新しいコードがリリースされたり、アドオンが変更されたり、設定変数が変更されたりした場合も dyno は自動的に再起動されます。また、手動で dyno を再起動することもできます。

buildpackの追加

Heroku CLIを拡張するbuildpackを追加します。

$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-cli -a アプリ名

CLI用認証トークンの設定

$ heroku authorizations:create

// 上記のコマンドで返却されたトークンを以下でアプリに設定する
$ heroku config:set HEROKU_API_KEY=トークン -a アプリ名

Heroku Schedulerアドオンを追加する

// アドオン追加
$ heroku addons:create scheduler:standard -a アプリ名

// アドオンのページを開く
$ heroku addons:open scheduler -a アプリ名

Heroku Schedulerの設定

例えば以下のような構成のDynoを毎日指定時刻に再起動させたいとする
Image 2019-10-21 at 1.03.24 PM.png

アドオンページの 「Add Job」から新しいジョブを追加
すると以下のようなページが表示されるので、設定を行っていく
Image 2019-10-21 at 1.07.18 PM.png

  1. どのタイミングか
  2. コマンド
  3. Dyno size
  4. Save

を設定する。

再起動を行うコマンドですが、アプリによって設定が異なる可能性があるので、以下は参考程度に

/app/.heroku/bin/heroku restart -a アプリ名 指定のDyno

となるので、webとworkerをで一つずつジョブを作成し、それぞれのコマンド設定の項目へ以下のように設定しました。

web dyno:

/app/.heroku/bin/heroku restart -a アプリ名 web.1

worker dyno:

/app/.heroku/bin/heroku restart -a アプリ名 worker.1

以下が設定した画面です。
Image 2019-10-21 at 1.13.52 PM.png

設定する時間がUTCとなっているので、その点に注意して再起動タイミングを設定してください。

以上となります。

sayama0402
Javascript(Riot.js / Vue / React / Nodejs) / PHP(Wordpress, cakePHP, Laravel) / Ruby(Ruby on Rails) / Python(Django) / SQL / Linux / Swift / Docker / AWS / Serverless
http://ken-sayama.hateblo.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした