Heroku を使った Discord Bot の構築と運用

## はじめに
2022/11 月に無料プランが廃止され、ホスティングサービスの利用には課金が必要になった [Heroku](https://dashboard.heroku.com/apps) ですが、課金してみて使用感や UI などの操作性について、どんな感じなんだろうと気になり、[Discord.py](https://github.com/Rapptz/discord.py) を用いて、Discord Bot の構築と運用についてまとめてみました。結論からすると使いにくいし、課金してまで Discord Bot を運用する価値はないなと思いました。

## Heroku とは
[Heroku](https://dashboard.heroku.com/apps) とは、クラウドホスティングサービスの1つであり、開発者がアプリケーションの構築、デプロイ、管理を簡単に行えるように設計されています。いわゆる PaaS（Platform as a Service）と呼ばれるサービスに分類されます。Heroku は多くのプログラミング言語とフレームワークに対応しており、幅広くアプリケーションの開発を行うことができます。また GitHub と連携することで、クラウド上でアプリケーションを簡単にデプロイすることが可能です。

## 環境
* Raspberry Pi 4 Model B
    * CentOS Stream 8
        * Python 3.11.0
            * discord.py 2.1.1
* [Heroku](https://dashboard.heroku.com/apps)

## 導入

### Bot アカウントの作成
<a href="https://discord.com/developers">Discord Developer Portal</a> より Bot アカウントを作成しましょう。詳細な手順については既にまとまっている記事があるため省きます。以下の記事を参考にして下さい。
実装においてアクセストークンが必要になります。メモしておきましょう。

https://qiita.com/1ntegrale9/items/cb285053f2fa5d0cccdf

### Heroku アカウントの作成
まずは、[こちら](https://signup.heroku.com/login)から Heroku アカウントの作成を行ってください（記入項目が多くて面倒くさいですね）。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/d37325a3-fa58-85de-45e7-2bbece58dd49.png">
入力が完了し、[CREATE AN ACCOUNT] を選択すると、登録したメールアドレスにメールが届くので、URL に飛んで下さい。パスワードの登録が求められるのでパスワードの登録をして下さい。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/61d82a1c-0f1c-2e66-ae9d-fc6044f54e90.png">
次にセキュリティのため、多要素認証（MFA）が求められれます（面倒くさいですね）。[Continue] を選択し、適当な Authenticator アプリをスマートフォンにインストールして下さい（私は　Microsoft Authenticator を使用しました）。[ワンタイムパスワードジェネレータ] を選択すると、QR コードが表示されるので、インストールした Authenticator アプリから QR コードを読み込んで下さい。QR コードを読み込み連携できたら、アプリに表示されている検証コードを入力して下さい。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/581ab0ef-413c-0273-e2bf-1a939fc5ea5a.png">
検証コードを入力すると、利用規約のページに移るのでそのまま、[Accept] を選択して下さい。すると以下のようにダッシュボードに遷移すると思います。無料枠はもう無くなってしまったので、一番左の [Add payment method] を選択して下さい（~~PayPalに対応しろ~~）。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/f4421736-6665-b214-0f02-11e3b4a2582e.png)
検証等がしたいだけなので、`Eco Dynos Plan` を選択しました。

### デプロイ
アカウントの準備ができたのでいよいよデプロイに移っていきます。デプロイの仕方には GUI と CLI でデプロイする2種類の方法がありますが、ここでは面倒くさいので CLI でデプロイする方法については説明しません。CLI でデプロイしたい方は下記記事を参考にして下さい。

https://devcenter.heroku.com/ja/articles/heroku-cli

GUI でデプロイする方法についてですが、まずは必要なファイルを GitHub のリポジトリに追加します。必要なファイルは、`main.py`, `Procfile`, `requirements.txt`, `runtime.txt` ファイルになります。`main.py` は各々動かしたい Bot のソースコードを書いて下さい。
`requirements.txt` ファイルについては `pip freeze` コマンドより必要なライブラリを記載して下さい。

```text:requirements.txt
discord.py==2.1.1
```
`Procfile` と `runtime.txt` は以下の通りになります。

```text:Procfile
worker: python main.py
```

```text:runtime.txt
python-3.11.0
```

必要なファイルを GitHub にプッシュする方法は、記事にまとめているので参考にしてみて下さい。

https://qiita.com/Pumila/items/b90b7647f39ed3ca2069

GitHub にファイルをプッシュできたら [DashBoard](https://dashboard.heroku.com/apps) に移り、[Create new app] を選択して下さい。名前は適当に入力し、リージョンはアメリカと EU しかないのでアメリカを選択、その後、[Create app] を選択して下さい。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/4a614393-2482-8101-9427-1e0f5e016ccb.png)
プロジェクトを作成すると以下のように [Deployment method] を選択できるので GitHub を選択して下さい。GitHub との連携はまだしていないので、[Connect to GitHub] から連携して下さい。選択すると新規ブラウザが立ち上がるので、[Authorize heroku] を選択して下さい。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/435a2950-2d4e-a689-2ed6-cd6ee2230314.png)
GitHub と連携すると以下のように、自分のリポジトリを選択することができます。対象とするリポジトリを選択し、[Connect] を選択して下さい。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/a4f05766-0ca8-63b5-0dcb-c9af3235829b.png)
GitHub と連携すると、リポジトリに変更があったら自動的に再デプロイするかという項目があるので、特に理由がない場合は [Enable Automatic Deploys] を選択していいと思います。デプロイする前に、環境変数の設定に移ります。[Settings] 項目から [Reveal Config Vars] を選択して下さい。環境変数の追加ができたら [Deploy] 項目から [Deploy Branch] を選択してデプロイして下さい。デプロイが完了したら、[Resources] 項目から `Eco Dynos` を有効化して下さい。これで Discord Bot の運用ができるようになりました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/191b0cc6-1b99-a85a-aae8-b1e4745e37b9.png)

## ダウンタイムの検証
続いてダウンタイムの検証に移っていきます。検証期間は約3日間になります。検証に用いたファイル内容については以下記事を参考にして下さい。10秒以上応答しなかったらダウンタイムと見なしています。

https://qiita.com/Pumila/items/29f26fb349d5592046ae

ソースコードは以下になります。

https://github.com/Pumi1a/Downtimetest

結果として、ダウンタイムはほとんどなく、1回のみの16秒という結果になりました（5$ 払っているだけやりますね）。
![sample-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/011e633f-4d46-7423-6c29-17dc27be2670.png)
ダウンタイム検証時の Discord チャンネルの様子は以下の通りです。計18回 "test" の削除が間に合っていないことが分かります。
<details><summary>Discord チャンネルの様子</summary><div>

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/3b324aca-74c9-4417-06b3-0ae0b8895e3e.png)

</div></details>
また、公式でも言及されている通り、Heroku で動かしているアプリは最低一日一回は再起動されます。これがダウンタイムに影響出てくると思ったのですが、プロセスを再起動する時間がとてつもなく速く、10秒もかからない見たいですね。

>また、Heroku で実行されているアプリケーションのヘルスを維持するために、dyno は最低一日一回は再起動されます。

```console:cycling
2023-03-05T11:15:05.112814+00:00 heroku[worker.1]: Cycling
2023-03-05T11:15:05.116524+00:00 heroku[worker.1]: State changed from up to starting
2023-03-05T11:15:05.817516+00:00 heroku[worker.1]: Stopping all processes with SIGTERM
2023-03-05T11:15:05.997086+00:00 heroku[worker.1]: Process exited with status 143
2023-03-05T11:15:06.889450+00:00 heroku[worker.1]: Starting process with command `python main.py`
2023-03-05T11:15:07.580746+00:00 heroku[worker.1]: State changed from starting to up
```

ダウンタイムの検証中、以下のようなエラーが吐かれることがありました。discord サーバにアクセスできないエラーですね。
```console:error
[2023-03-01 11:35:09] [ERROR   ] discord.client: Ignoring exception in on_message
Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.11/site-packages/discord/client.py", line 409, in _run_event
    await coro(*args, **kwargs)
  File "/app/main.py", line 17, in on_message
    await msg.delete()
  File "/app/.heroku/python/lib/python3.11/site-packages/discord/message.py", line 805, in delete
    await self._state.http.delete_message(self.channel.id, self.id)
  File "/app/.heroku/python/lib/python3.11/site-packages/discord/http.py", line 624, in request
    async with self.__session.request(method, url, **kwargs) as response:
  File "/app/.heroku/python/lib/python3.11/site-packages/aiohttp/client.py", line 1141, in __aenter__
    self._resp = await self._coro
                 ^^^^^^^^^^^^^^^^
  File "/app/.heroku/python/lib/python3.11/site-packages/aiohttp/client.py", line 560, in _request
    await resp.start(conn)
  File "/app/.heroku/python/lib/python3.11/site-packages/aiohttp/client_reqrep.py", line 899, in start
    message, payload = await protocol.read()  # type: ignore[union-attr]
                       ^^^^^^^^^^^^^^^^^^^^^
  File "/app/.heroku/python/lib/python3.11/site-packages/aiohttp/streams.py", line 616, in read
    await self._waiter
aiohttp.client_exceptions.ClientOSError: [Errno 104] Connection reset by peer
```

最後に検証で用いた `send.py` と `chk.py` のサービスログを載せておきます。`journalctl -u サービス名`でログの確認ができます。特に問題もなく稼働していることが分かりますね。

<details><summary> サービスのログ </summary><div>

```console:send.py log
Mar 02 16:34:58 localhost.localdomain systemd[1]: Started heroku.
Mar 02 16:34:59 localhost.localdomain send.py[1830772]: [2023-03-02 16:34:59] [INFO    ] discord.client: logging in using static token
Mar 02 16:35:00 localhost.localdomain send.py[1830772]: [2023-03-02 16:35:00] [INFO    ] discord.gateway: Shard ID None has connected to Gateway (Session ID: 85f3cb0d50991c8a8bcc3b72055abcbc).
Mar 02 18:59:37 localhost.localdomain send.py[1830772]: [2023-03-02 18:59:37] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 02 19:03:50 localhost.localdomain send.py[1830772]: [2023-03-02 19:03:50] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 02 21:50:31 localhost.localdomain send.py[1830772]: [2023-03-02 21:50:31] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 00:11:04 localhost.localdomain send.py[1830772]: [2023-03-03 00:11:04] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 01:35:06 localhost.localdomain send.py[1830772]: [2023-03-03 01:35:06] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 05:25:13 localhost.localdomain send.py[1830772]: [2023-03-03 05:25:13] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 06:24:50 localhost.localdomain send.py[1830772]: [2023-03-03 06:24:50] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 07:58:39 localhost.localdomain send.py[1830772]: [2023-03-03 07:58:39] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 09:31:20 localhost.localdomain send.py[1830772]: [2023-03-03 09:31:20] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 10:47:20 localhost.localdomain send.py[1830772]: [2023-03-03 10:47:20] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 13:37:28 localhost.localdomain send.py[1830772]: [2023-03-03 13:37:28] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 16:23:57 localhost.localdomain send.py[1830772]: [2023-03-03 16:23:57] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 17:32:40 localhost.localdomain send.py[1830772]: [2023-03-03 17:32:40] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 19:41:48 localhost.localdomain send.py[1830772]: [2023-03-03 19:41:48] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 21:56:32 localhost.localdomain send.py[1830772]: [2023-03-03 21:56:32] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 22:09:54 localhost.localdomain send.py[1830772]: [2023-03-03 22:09:54] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 03 23:32:40 localhost.localdomain send.py[1830772]: [2023-03-03 23:32:40] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 02:07:54 localhost.localdomain send.py[1830772]: [2023-03-04 02:07:54] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 02:55:46 localhost.localdomain send.py[1830772]: [2023-03-04 02:55:46] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 04:54:24 localhost.localdomain send.py[1830772]: [2023-03-04 04:54:24] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 08:54:26 localhost.localdomain send.py[1830772]: [2023-03-04 08:54:26] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 09:02:44 localhost.localdomain send.py[1830772]: [2023-03-04 09:02:44] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 09:49:35 localhost.localdomain send.py[1830772]: [2023-03-04 09:49:35] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 10:44:33 localhost.localdomain send.py[1830772]: [2023-03-04 10:44:33] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 13:08:20 localhost.localdomain send.py[1830772]: [2023-03-04 13:08:20] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 14:42:09 localhost.localdomain send.py[1830772]: [2023-03-04 14:42:09] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 15:12:45 localhost.localdomain send.py[1830772]: [2023-03-04 15:12:45] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 16:02:42 localhost.localdomain send.py[1830772]: [2023-03-04 16:02:42] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 17:07:24 localhost.localdomain send.py[1830772]: [2023-03-04 17:07:24] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 18:41:22 localhost.localdomain send.py[1830772]: [2023-03-04 18:41:22] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 19:58:01 localhost.localdomain send.py[1830772]: [2023-03-04 19:58:01] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 04 23:32:55 localhost.localdomain send.py[1830772]: [2023-03-04 23:32:55] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 01:23:08 localhost.localdomain send.py[1830772]: [2023-03-05 01:23:08] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 05:14:47 localhost.localdomain send.py[1830772]: [2023-03-05 05:14:47] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 09:01:39 localhost.localdomain send.py[1830772]: [2023-03-05 09:01:39] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 10:41:45 localhost.localdomain send.py[1830772]: [2023-03-05 10:41:45] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 13:14:06 localhost.localdomain send.py[1830772]: [2023-03-05 13:14:06] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 16:34:29 localhost.localdomain send.py[1830772]: [2023-03-05 16:34:29] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 85f3cb0d50991c8a8bcc3b72055abcbc.
Mar 05 17:00:18 localhost.localdomain systemd[1]: Stopping heroku...
Mar 05 17:00:18 localhost.localdomain systemd[1]: heroku.service: Succeeded.
Mar 05 17:00:18 localhost.localdomain systemd[1]: Stopped heroku.
```

```chk.py log
Mar 01 18:24:00 localhost.localdomain systemd[1]: Started heroku2.
Mar 01 18:24:01 localhost.localdomain chk.py[1824466]: [2023-03-01 18:24:01] [INFO    ] discord.client: logging in using static token
Mar 01 18:24:02 localhost.localdomain chk.py[1824466]: [2023-03-01 18:24:02] [INFO    ] discord.gateway: Shard ID None has connected to Gateway (Session ID: 036ac90afad13bea55ac0d00b6bf7bef).
Mar 01 19:07:10 localhost.localdomain chk.py[1824466]: [2023-03-01 19:07:10] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 01 21:45:04 localhost.localdomain chk.py[1824466]: [2023-03-01 21:45:04] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 01 23:29:05 localhost.localdomain chk.py[1824466]: [2023-03-01 23:29:05] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 01:07:34 localhost.localdomain chk.py[1824466]: [2023-03-02 01:07:34] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 01:52:06 localhost.localdomain chk.py[1824466]: [2023-03-02 01:52:06] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 02:47:30 localhost.localdomain chk.py[1824466]: [2023-03-02 02:47:30] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 03:02:41 localhost.localdomain chk.py[1824466]: [2023-03-02 03:02:41] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 03:33:34 localhost.localdomain chk.py[1824466]: [2023-03-02 03:33:34] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 07:32:03 localhost.localdomain chk.py[1824466]: [2023-03-02 07:32:03] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 08:36:31 localhost.localdomain chk.py[1824466]: [2023-03-02 08:36:31] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 09:39:15 localhost.localdomain chk.py[1824466]: [2023-03-02 09:39:15] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 11:43:08 localhost.localdomain chk.py[1824466]: [2023-03-02 11:43:08] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 13:33:22 localhost.localdomain chk.py[1824466]: [2023-03-02 13:33:22] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 16:45:01 localhost.localdomain chk.py[1824466]: [2023-03-02 16:45:01] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 18:11:37 localhost.localdomain chk.py[1824466]: [2023-03-02 18:11:37] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 18:50:22 localhost.localdomain chk.py[1824466]: [2023-03-02 18:50:22] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 19:53:41 localhost.localdomain chk.py[1824466]: [2023-03-02 19:53:41] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 02 22:15:26 localhost.localdomain chk.py[1824466]: [2023-03-02 22:15:26] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 00:16:18 localhost.localdomain chk.py[1824466]: [2023-03-03 00:16:18] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 02:20:36 localhost.localdomain chk.py[1824466]: [2023-03-03 02:20:36] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 04:44:09 localhost.localdomain chk.py[1824466]: [2023-03-03 04:44:09] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 04:59:10 localhost.localdomain chk.py[1824466]: [2023-03-03 04:59:10] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 06:44:44 localhost.localdomain chk.py[1824466]: [2023-03-03 06:44:44] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 07:33:52 localhost.localdomain chk.py[1824466]: [2023-03-03 07:33:52] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 08:29:37 localhost.localdomain chk.py[1824466]: [2023-03-03 08:29:37] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 08:51:12 localhost.localdomain chk.py[1824466]: [2023-03-03 08:51:12] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 09:31:13 localhost.localdomain chk.py[1824466]: [2023-03-03 09:31:13] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 10:42:59 localhost.localdomain chk.py[1824466]: [2023-03-03 10:42:59] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 12:06:24 localhost.localdomain chk.py[1824466]: [2023-03-03 12:06:24] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 12:59:30 localhost.localdomain chk.py[1824466]: [2023-03-03 12:59:30] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 16:27:05 localhost.localdomain chk.py[1824466]: [2023-03-03 16:27:05] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 17:39:45 localhost.localdomain chk.py[1824466]: [2023-03-03 17:39:45] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 18:58:29 localhost.localdomain chk.py[1824466]: [2023-03-03 18:58:29] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 19:45:47 localhost.localdomain chk.py[1824466]: [2023-03-03 19:45:47] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 20:45:21 localhost.localdomain chk.py[1824466]: [2023-03-03 20:45:21] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 22:45:33 localhost.localdomain chk.py[1824466]: [2023-03-03 22:45:33] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 03 23:33:46 localhost.localdomain chk.py[1824466]: [2023-03-03 23:33:46] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 01:23:27 localhost.localdomain chk.py[1824466]: [2023-03-04 01:23:27] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 05:05:19 localhost.localdomain chk.py[1824466]: [2023-03-04 05:05:19] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 06:22:29 localhost.localdomain chk.py[1824466]: [2023-03-04 06:22:29] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 08:37:58 localhost.localdomain chk.py[1824466]: [2023-03-04 08:37:58] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 09:02:25 localhost.localdomain chk.py[1824466]: [2023-03-04 09:02:25] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 11:25:45 localhost.localdomain chk.py[1824466]: [2023-03-04 11:25:45] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 15:01:43 localhost.localdomain chk.py[1824466]: [2023-03-04 15:01:43] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 15:10:12 localhost.localdomain chk.py[1824466]: [2023-03-04 15:10:12] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 16:20:11 localhost.localdomain chk.py[1824466]: [2023-03-04 16:20:11] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 19:25:43 localhost.localdomain chk.py[1824466]: [2023-03-04 19:25:43] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 21:36:40 localhost.localdomain chk.py[1824466]: [2023-03-04 21:36:40] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 04 21:57:38 localhost.localdomain chk.py[1824466]: [2023-03-04 21:57:38] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 00:10:30 localhost.localdomain chk.py[1824466]: [2023-03-05 00:10:30] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 03:17:38 localhost.localdomain chk.py[1824466]: [2023-03-05 03:17:38] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 05:57:58 localhost.localdomain chk.py[1824466]: [2023-03-05 05:57:58] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 07:53:25 localhost.localdomain chk.py[1824466]: [2023-03-05 07:53:25] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 09:59:52 localhost.localdomain chk.py[1824466]: [2023-03-05 09:59:52] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 11:34:22 localhost.localdomain chk.py[1824466]: [2023-03-05 11:34:22] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 12:22:09 localhost.localdomain chk.py[1824466]: [2023-03-05 12:22:09] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 16:08:23 localhost.localdomain chk.py[1824466]: [2023-03-05 16:08:23] [INFO    ] discord.gateway: Shard ID None has successfully RESUMED session 036ac90afad13bea55ac0d00b6bf7bef.
Mar 05 17:00:19 localhost.localdomain systemd[1]: Stopping heroku2...
Mar 05 17:00:19 localhost.localdomain systemd[1]: heroku2.service: Succeeded.
Mar 05 17:00:19 localhost.localdomain systemd[1]: Stopped heroku2.
```

</div></details>



## 最後に
アカウント作成時に、多要素認証を求められた時点で面倒くさくてアカウント作成やめようかと思いました。UI もあまり親切とは言えず、見にくいと思います。また、多要素認証や登録情報などが多く、面倒くさいですね。サーバも日本リージョンがないのでデメリットです。あと、**実行ログがほとんど残らないのがあり得ないと思いました**。総じて無料プランが廃止になったので使わなくてもいいんじゃないかなという結論に至りました。Discord Bot を動かしたいだけであれば、他の無料ホスティングサービスでこと足りますしね。個人的に [Railway](https://railway.app) が使いやすくていいかなと思います。

https://qiita.com/Pumila/items/29f26fb349d5592046ae