Posted at

Herokuのアプリケーションの停止 / 再開

More than 1 year has passed since last update.


はじめに

久しぶりに勉強がてらHerokuコマンドを打っていたのですが、すっかり忘れてしまっている...。

ということで、今回は、本当に覚え書き程度になります。

Herokuのデータのバックアップやリストアについては、以下に書いていますので、よかったらご覧いただけると幸いです。


やりたいこと / やらないこと

表題の通りで、練習用に作ってHerokuにデプロイしたアプリケーションがあるのですが、こちらについて。


  • そもそも動いてるんだっけ?

  • Herokuのリポジトリには反映させておきたいけど、アプリケーションは停止しておきたい...

  • 逆に、停止したアプリケーション再起動したいんだけど

日々ちゃんと確認していればいいのですが、Freeプランでお世話になっていると、うっかりと状況を忘れてしまうことが。

ということで、最低限の処理のためのコマンドをメモします。


状況を確認する

起動しているかどうかは、アプリケーションのURLにアクセスすればもちろん分かりますが、「そもそもどういうURLだったっけ?」という所から始めたりもしまして...。

まずはHerokuにログインして確認するのが確実です。

次に、コマンドラインから確かめてみる場合は、こんな感じです。

コマンド
内容
備考

heroku ps
アプリケーションのプロセスを確認、起動停止もこちらを利用

heroku releases
リリース(デプロイ)の記録を表示

heroku logs
アプリケーションのログを表示

heroku container
今回は扱いませんがDocker imageをpushできる..!

heroku config
環境変数設定や、Basic認証をかけたい時に

heroku maintenance
停止はしないけどメンテ画面にするとか


heroku ps

まずは起動中の場合はこのような感じです。

toy_app $ heroku ps

Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2018/08/26 21:26:26 +0900 (~ 7m ago)

web用のプロセスが1つ起動していますね。

Heroku側の管理画面をみると、こちらに相当します。

curlを使ってヘッダをチェックしてみると、軽量Webサーバの Cowboy がリクエストを受け付けているのが分かります。

また、Via: 1.1 vegur とありますが、これはHerokuで提供しているHTTP Proxyのライブラリとのこと。1

toy_app $ curl -vvv -I https://my-test-herokuapp.example.jp/

--- [ 中略 」---

< HTTP/1.1 200 OK
HTTP/1.1 200 OK
Server: Cowboy
Date: Sun, 26 Aug 2018 12:29:35 GMT
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
X-Runtime: 0.022990
Via: 1.1 vegur

* Connection #0 to https://my-test-herokuapp.example.jp/
left intact


heroku ps:scale

さて、次にプロセスを停止(アプリケーションを停止)させてみます。

上記のキャプチャの通り、Herokuの管理画面から停止ができます。

さらに、コマンドラインからは heroku ps:scale を使います。

toy_app $ heroku ps:scale web=0

Scaling dynos... done, now running web at 0:Free

停止できたかどうか、再度 heroku psコマンドを確認。

toy_app $ heroku ps

Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

No dynos on ⬢ xxx-xxxx-26113

toy_app $ heroku logs

--- [ 中略 」---

2018-08-26T13:01:31.397608+00:00 heroku[web.1]: Idling
2018-08-26T13:01:31.398183+00:00 heroku[web.1]: State changed from up to down
2018-08-26T13:01:32.320168+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2018-08-26T13:01:32.349083+00:00 app[web.1]: - Gracefully stopping, waiting for requests to finish
2018-08-26T13:01:32.359140+00:00 app[web.1]: === puma shutdown: 2018-08-26 22:01:32 +0900 ===
2018-08-26T13:01:32.359190+00:00 app[web.1]: - Goodbye!
2018-08-26T13:01:32.359339+00:00 app[web.1]: Exiting
2018-08-26T13:01:32.493240+00:00 heroku[web.1]: Process exited with status 143
2018-08-26T13:07:50.975839+00:00 app[api]: Scaled to console@0:Free rake@0:Free web@0:Free worker@0:Free by user xxx@example.com

ログを確認すると、プロセスの停止が確認できます。

同様に、Herokuの管理画面からも、プロセスが停止していることが分かります。


停止した上でcurlで叩いてみる

アプリケーションを停止させた上で、curlで再度アクセスしてみます。

Status Code: 503が返ってきていますね。

< HTTP/1.1 503 Service Unavailable

HTTP/1.1 503 Service Unavailable
< Connection: keep-alive
Connection: keep-alive
< Server: Cowboy
Server: Cowboy
< Date: Sun, 26 Aug 2018 13:13:00 GMT
Date: Sun, 26 Aug 2018 13:13:00 GMT
< Content-Length: 506
Content-Length: 506
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
< Cache-Control: no-cache, no-store
Cache-Control: no-cache, no-store


heroku ps:scaleで再起動

503ではありますが。アプリケーションを停止させることが出来ました。

では、次に再起動させてみます。

toy_app $ heroku ps:scale web=1

Scaling dynos... done, now running web at 1:Free

toy_app $ heroku ps

=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2018/08/26 22:18:42 +0900 (~ 1m ago)

heroku psコマンドでの起動も確認出来ました。


停止させずにアクセスを制御しておくには?

さて、「アプリケーションをバツン」と切る以外でなにかアクセスを制限できないか...という辺りですが、他に使えるものを載せてみます。


heroku maintenance

Herokuにはメンテナンスに切り替える機能があります。

こちらも、コマンドラインから切り替えが可能です。

まずは、heroku maintenance:on で、メンテナンスモードにしてみます。

このあと、heroku psをしてみますと、プロセスは起動しています。

toy_app $ heroku maintenance:on

Enabling maintenance mode for ⬢ xxx-xxxx-26113... done
toy_app $ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bin/rails server -p $PORT -e $RAILS_ENV (1)
web.1: up 2018/08/26 22:18:42 +0900 (~ 23m ago)

curlで確認してみます。

503が返ってきていますが、ブラウザから確認してみると、メンテナンス画面(という趣旨)のレスポンスが返ります。

< HTTP/1.1 503 Service Unavailable

HTTP/1.1 503 Service Unavailable
< Connection: keep-alive
Connection: keep-alive
< Server: Cowboy
Server: Cowboy
< Date: Sun, 26 Aug 2018 13:44:42 GMT
Date: Sun, 26 Aug 2018 13:44:42 GMT
< Content-Length: 511
Content-Length: 511
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
< Cache-Control: no-cache, no-store
Cache-Control: no-cache, no-store

手っ取り早くだと、こちらのほうがいいかもしれません。

メンテナンスモードのoffは、heroku maintenance:off でOKです。

toy_app $ heroku maintenance:off

Disabling maintenance mode for ⬢ xxx-xxxx-26113... done
toy_app $ curl -I https://xxx-xxxx-26113.herokuapp.com/
HTTP/1.1 200 OK
--- [ 中略 ] ---
Server: Cowboy
Via: 1.1 vegur


Basic認証は?

さて、メンテナンスモードは簡単ですが、自分もアクセスできなくなります。

可能なら、なにか認証をかけておきたい...。

こういう場合は、Basic認証を使うと良いのですが、アプリケーション&アプリケーションサーバごとに方法がことなるようなので、省略いたします。


まとめ

以上、簡単ですが起動停止のコマンドについてのメモでした。

今回1年ぶりくらいにHerokuのCLIを眺めたのですが、heroku containerというコマンドに気が付いてビックリ。

Dockerを使ったアプリケーションの公開もできるのですね。

この次は、heroku containerやCowboy、vegurについて調べてメモしておこうと思います。





  1. こちらも、また別途調べてメモしておきたいと思います。「ベーグル」と読むようです。( https://github.com/heroku/vegur