概略
処理負担が軽いけれども定期的に動かしておきたいPythonプログラムというのが、ちょこちょこ発生する。
ただ、そのために、手元のPCを起動しっぱなしにしたり、ライブラリの対応可否が厳しいRaspberry Piを使うのは面倒。
そこで、GCPを使うことにより解決した。GCP Compute Engineであればリージョンとマシンタイプ限定で無料枠があり、費用をかけずに解決できた。
手順を以下にまとめておく。
GCP ComputeEngineの立ち上げ
- リージョン: Oregon(us-west1)
- マシンタイプ: e2-micro
- ストレージ: 標準永続ディスク(デフォルト10GB,30GB以内)
- OS: Debian 10 Buster
補足: リージョンの選択
GCPのリージョンごとの応答速度をGCPingというウェブサイトで確認する。
GCP ComputeEngineの無料枠となる以下の3つのリージョンである。これらのうち、応答速度が一番速いところを選択したい。
Oregon(123ms),Iowa(160ms)となっていてOregonのレスポンスのほうが早いとわかる。そのため、今回はOregonのus-west1-bをリージョンとして選択した。
sshの接続ポートを変更
クラウドのマシンにて、sshを22番ポートで待受していると攻撃されやすい。そのため、22番ではない他のポート番号へ変更する。
sshd_configをviで開いて、[Port 22] と記載がある部分を [Port <1024-65535までの好きな番号>] へ変更すればよい。
sudo vi /etc/ssh/sshd_config
sshサーバーを再起動。
sudo service ssh restart
これ以降、ブラウザから接続するときには「ブラウザウィンドウでカスタムポートを開く」から指定したポート番号を入力しないと接続できなくなることに注意。
また、ファイアーウォールの設定にも留意すること。
ブラウザからのssh接続を許可するためには、IAP(35.235.240.0/20)からインスタンスへのsshアクセス(sshd_configで新たに設定したポート番号)を許可するようにファイアーウォールへ設定を追加する。
OSとPythonのバージョンを確認
cat /etc/debian_version # 10.11 python3 -V # Python 3.7.3
pipのインストール
Debian 10 Buster にはpipが入っていなかったため、インストールする。
sudo apt update sudo apt install python3-distutils curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py sudo python3 get-pip.py pip -V # pip 22.0.4 from /usr/local/lib/python3.7/dist-packages/pip (python 3.7)
プログラムファイルの転送
SSHの右横にある三角印を選択。
「ブラウザウィンドウで開く」を選択。
ターミナルが起動したら、設定ボタン(下の図で赤丸の部分)を選択して、「ファイルをアップロード」。
tar圧縮したプログラムファイルを選択してアップロードする。
ホームディレクトリにファイルがアップロードされているので、tarコマンドで展開する。
ライブラリをインストール
pipとrequirement.txt(必要なライブラリを記述したファイル)を使ってインストールする。
pip install -r requirements.txt
sshからログアウトしたあとでもプログラムを動かし続ける
基本パターン
nohup python3 <xxx.py> &
バリエーション
以下のようなシェルスクリプト(例: run.sh)を書いてもよい。
sudo poweroff を加えておくと、処理が完了したときにインスタンスを自動で停止することができる。
python3 test.py sudo poweroff
自動実行のバリエーション1 nohup
nohup bash run.sh &
自動実行のバリエーション2 screen
# screenコマンドをインストール sudo apt install screen # コマンド実行 screen -dm -S test bash run.sh
-dm : デタッチされた状態で仮想端末を作成 -S : セッション名を指定 (任意)
screenコマンドのTIPS
- screen -ls とすれば、セッションの一覧を見ることができる
- screen -r test とすれば、testのセッションにAttachできる
- ctrl + a -> d で今のセッションをDetachできる
まとめ
GCPを使って、一時的なプログラムを動作させるためのLinuxサーバーを構築することができた。
これで、手元のPCを起動しっぱなしにしたり、Raspberry Piを酷使する必要がなくなる。
ただ、pipのインストールを手動で実施したり、プログラムファイルを転送したりするのは、今風なやり方ではない。
1回構築して長年使い回す環境なら今回の方法でいいけれど、使い捨てで何度も構築する環境ならコンテナを用いて自動化したいところ。
その場合は、pipとGCPのCUI入りのdockerイメージをダウンロードし、プログラムはGitHubから取ってきて起動する形が理想的。