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

## はじめに

久しぶりに勉強がてらHerokuコマンドを打っていたのですが、**すっかり忘れてしまっている**...。
ということで、今回は、本当に覚え書き程度になります。

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

- [HerokuのDBにローカルPCからアクセスしたいんだけど...](https://qiita.com/akiko-pusu/items/305e291465d6aac04bf3)
- [HerokuのDBをバックアップ / 別DBにリストアしたいんだけど...](https://qiita.com/akiko-pusu/items/3847deb103c9e8346c89)

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

表題の通りで、練習用に作って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側の管理画面をみると、こちらに相当します。

![heroku-admin-screen.png](https://qiita-image-store.s3.amazonaws.com/0/27976/573496e2-ea13-5476-c1ec-ac391888c46c.png)


curlを使ってヘッダをチェックしてみると、軽量Webサーバの [Cowboy](https://github.com/ninenines/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にはメンテナンスに切り替える機能があります。

- [Maintenance Mode](https://devcenter.heroku.com/articles/maintenance-mode)

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

まずは、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
```

![maintenance-mode.png](https://qiita-image-store.s3.amazonaws.com/0/27976/d2ef322d-672f-ca68-357e-521cfc8aa5a2.png)

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

メンテナンスモードの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 )