1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Discordの自作botを無料で一生動かしたい

Posted at

Google Cloud Platform(GCP)でVMインスタンスを立ち上げ、Pythonファイルを常時稼働させる方法についてまとめました。半分以上は先輩から教えてもらったことの受け売りです。

状況

Discord上で動作するbotをPythonで作成しました。Jockey Musicなどと同様に、コマンドを入力するたびに何かしらのアクションを実行するタイプのbotなので、常時稼働させておく必要があります。ローカル環境で実行し続けるのは電気代が勿体ないので、以前はHerokuのような分かりやすいホスティングサービスを利用していました。そのHerokuが少し前に有料化してしまったので、今回はGoogle Cloud Platform(GCP)を使ってbotを動かすことにしました。

Google Cloud Platformで仮想マシンを作成する

まずは上のリンクからGoogle Cloudのアカウント登録を行います。
諸々同意して、「無料で利用開始」のところからクレジットカード情報を登録します(請求されないので大丈夫です)。
スクリーンショット 2024-10-15 033813.png

登録が終わると、MyFirstProjectというプロジェクトが勝手に作成されていると思います。もしなければ適当な名前のプロジェクトを作成します。
「VMを作成」からVMインスタンスの作成に入ります。
スクリーンショット 2024-10-15 033935.png

ここから仮想マシンの構成を決めていきます。(あまり無いと思いますが)無料枠の条件が変わってしまうこともあるかもしれないので、以下リンクから一応チェックしておくと良いかもしれません。

仮想マシンの名前は何でも良いです。リージョンをus-west1 (オレゴン)に設定し、マシンタイプシリーズはE2、マシンタイプはe2-microにします。us-central1 (アイオワ)us-east1 (サウスカロライナ)も無料枠の対象ですが、日本に近いオレゴンを選ぶのが一般的なようです。ゾーンは何でも良いです。

スクリーンショット 2024-10-15 004335.png

ブートディスクの「変更」から、OS等の設定を行います。OSはUbuntu、バージョンはLTS(長期サポート)のもののうち最新のものを選びます。2024年10月現在はUbuntu 24.04 LTSです。Arm64よりはx86/64の方が良いと思います。ブートディスクの種類は標準永続ディスク、サイズは30GBとします。10GBのままでも良いですが、折角30GBまで無料なので。
スクリーンショット 2024-10-15 004902.png

HTTPトラフィック、HTTPSトラフィックを許可しておきます。これを許可しておくと、WEBサーバーとしての活用ができるようになります。その予定が無ければ許可しなくても大丈夫です。また、詳細オプションのネットワーキングからネットワークインターフェースの編集を行います。
スクリーンショット 2024-10-15 010102.png
スクリーンショット 2024-10-15 010725.png

外部IPv4アドレスはデフォルトでエフェメラルになっていますが、静的外部IPアドレスを予約しておきます。名前・説明は適当で良いです。
スクリーンショット 2024-10-15 011241.png

ここまで設定できたら、作成を押下して完了です。
月間予測が$7.31となっていますが、無料枠を利用していれば課金されることはありません。
スクリーンショット 2024-10-15 015356.png

なお、予約した外部IPアドレスは後で接続する際に使います。
スクリーンショット 2024-10-15 015120.png

公開鍵と秘密鍵を作る

PuTTYgenを使って、RSA暗号の公開鍵・秘密鍵の生成を行います。インストールは以下リンクから。

PuTTY Key Generatorを立ち上げてGenerateを押します。
スクリーンショット 2024-10-15 012502.png

この画面になったら、マウスカーソルを適当に動かしまくります。その軌道を使って暗号を作っているらしいです。
image.png

生成が終わるとこの画面になるので、Public Keyをコピーします。
スクリーンショット 2024-10-15 032844.png

以下リンクから、メタデータの設定に移ります。

SSH認証鍵1にペーストし、Enterを押下します。これで、MyFirstProject内のすべての仮想マシンがこの公開鍵を持つようになります。ユーザー名がKey commentの内容になっていることに注意(rsa-key-yyyymmddの形式)。
スクリーンショット 2024-10-15 013544.png

RSA暗号の仕組み上、公開鍵は外に漏れても問題ありません。仮想マシンに接続するためには、PuTTY Key Generatorで公開鍵と一緒に生成された秘密鍵が必要になります。
Save private keyを押して、ローカルに秘密鍵を保存します。
スクリーンショット 2024-10-15 032844.png

SSH接続する

WinSCPを使って接続します。インストールは以下リンクから。

ホスト名に先ほど立ち上げたVMインスタンスの外部IPを、ユーザー名にrsa-ssh-yyyymmdd形式のKey commentを入力します。入力したら「設定」を押します。
スクリーンショット 2024-10-15 015608.png

設定を色々いじります。シェルはsudo su -とします。
スクリーンショット 2024-10-15 015824.png

SSH -> 認証で、秘密鍵をセットします。拡張子は.ppkです。セットしたらOKを押し、ログインします。
スクリーンショット 2024-10-15 020041.png

左がローカル、右が仮想マシンのディレクトリとなっています。Pythonファイルを動かすためには、まず左から所望のPythonファイルを探してきて右にドラッグ&ドロップする必要があります。ただし、所有者がrootとなっているディレクトリは触れません。パーミッションがrwxr-xr-xとなっていて、我々はオーナーとしてではなくグループメンバとしてアクセスしているからです。
スクリーンショット 2024-10-15 020351.png

homeディレクトリの中に、ユーザー名のフォルダがあると思います。そこには書き込み可能(rwxrwxr-x)なので、discordという名前でディレクトリを作成し中にPythonファイルを放り込みます。

スクリーンショット 2024-10-15 021758.png

コマンドを打つ

あとはコマンドを打ってPythonファイルを動かすだけです。WinSCPでもコンソールが使えるのですが、永続的に動かすための必須コマンドnohupがうまく動作しません(何故か接続を切られてしまいます)。そこで今回はPuTTY.exeを使います。インストールは以下リンクから。

やることはWinSCPとほぼ同じです。Host Nameには仮想マシンの外部IPアドレスを入力します。
スクリーンショット 2024-10-15 024712.png

Connection -> DataのLogin detailsでAuto-login usernameを設定します。
スクリーンショット 2024-10-15 025551.png

Connection -> SSH -> AuthのPrivate key file for authenticationに秘密鍵をセットします。
スクリーンショット 2024-10-15 025309.png

以上の設定が終わったらOpenを押します。コマンドラインが起動します。
まず、以下のコマンドを実行してpythonが入っていることを確認します。Ubuntuの最新版をイメージに設定していれば入っているはずですが、万が一なければ$ sudo apt install python3を実行します。

$ python3 --version

Pythonファイルを実行するためには、色々モジュールをインストールしておく必要があります。特にDiscordのbotを動かす際には$ pip install discord.pyが必須です。
以下のコマンドを実行して、pipを使えるようにします。

$ sudo apt update
$ sudo apt install python3-pip

しかしおそらく、そのまま$ pip install discord.pyとしても失敗します。これはroot権限でないと実行できないからです。システム全体にパッケージをインストールするのは何かと危ないので、それを阻止する設定になっています。
システム全体に影響を与えたくない場合は、Pythonの仮想環境を使ってパッケージをインストールできます。
以下は仮想環境を作成して有効化するコマンドです。

$ python3 -m venv venv
$ source venv/bin/activate

満を持して$ pip install discord.pyを実行します。私の場合は以下のモジュールをインストールしました。

$ pip install discord.py
$ pip install aiohttp

さて、あとはnohupコマンドを打つだけです。プロセスは通常、仮想端末を閉じたりログアウトした瞬間にHUPシグナルを受け取って終了するようにできています。nohupはそのHUPシグナルを無視するように命令するものです。すなわち、指定したプロセスがシェルを閉じた後も継続して動作するようになるのです。
Pythonファイルが置かれてあるディレクトリに移動して、nohupコマンドを実行します。

$ cd discord
$ nohup python3 hogehoge.py &

最後に、実行できているかどうかを確かめてみます。以下は、python3で動いているプロセスを全て表示するコマンドです。

$ ps -ef | grep python3

以下のように目的のPythonファイルが動作していれば成功です。

rsa-key+    6794    6319  1 18:11 pts/0    00:00:00 python3 hogehoge.py

この結果から、プロセス識別子(PID)が6794であることも分かります。もうシェルを閉じようがPCを閉じようがPythonファイルは動き続けますが、実行を止めたいとなったら$kill 6794とします。

ちなみに

こういうbotです。
スクリーンショット 2024-10-15 035410.png
Nitroユーザーが他サーバーの絵文字を手軽にサーバーに追加できます。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?