Python Webアプリケーション Web技術 プログラミング

Python製プログラムを「Heroku scheduler」を使って無料で定期実行する

この記事は約16分で読めます。

 

 

こんにちは、ミナピピン(@python_mllover)です。今回はローカルで作ったPythonとかで書いたスクリプトを定期的に実行する方法について紹介していきたいと思います。

 

自作のスクリプトを定期実行する環境

 

自作のスクリプト、例えば私の場合であれば各取引所のビットコインの価格データを1分ごとにスクレイピングしてデータベースに保存するプログラムや、ビットコインの価格にシグナルが出たらをビットコインを購入するプログラムなどを定期的に実行しています。

 

こういう定期的に実行したいプログラムがある時、Mac・Linuxならcron、Windowsだとタスクスケジューラーを使えば可能ですが、それにはパソコンをスリープやシャットダウンせずにずっと立ち上げておく必要があります。

 

自宅にサーバー立ててたりそれができる人はまあそれでやってくださいという感じなのですが、基本的に電気代とか異常があった時のことなど諸々のことを考えると自宅のPCでプログラムを定期実行するというのはあまり一般的な手法ではないと思います。

 

基本はレンタルサーバを使う

 

こういった自作のプログラムなどを定期実行したい場合、これまではさくらやロリポップなどのレンタルサーバ会社が提供しているVPSを月額で契約してそこで定期実行するのが一般的で月々ある程度のお金がかかります。(安くて大体1000円くらい)

 

関連記事:XserverにPythonのライブラリ(Anaconda)をインストールした方法

 

ですが最近はインターネットコストの低下により、クラウドや無料サーバサービスが増えてきました。その中で最近存在感が出てきているのが「Heroku」というサービスで簡単なプログラムを定期実行したい時に便利なのがHerokuの無料枠でschedulerというアドオンを使えば、無料で自作のプログラムを定期実行することが可能です。

 

つまりこの「Heroku scheduler」を使えばパソコンを立ち上げておく必要もなく、無料で指定した時間にpythonなどで書いた自作のプログラムを定期実行できます

 

Herokuとは

 

Herokuとは、Webアプリケーションの開発から公開までを簡単にできるプラットフォームです。
プログラムが動作可能な環境を提供してあげますよ!ということですね。Pythonの場合であれば、FlaskやDjangoなどのフレームワークで作成したサイトなどもHerokuで無料でデプロイすることが可能になります。

 

サイトの規模が大きくなれば有料版に登録する必要が出てきますが、基本的にはよっぽどバズらない限りその枠になることはないので、まあ気にしなくていいです笑

 

Herokuの使い方

 

それでは、Herokuのschedulerを設定する方法について解説していきます。Herokuのアカウントをお持ちでない方は、あらかじめHeroku登録画面からアカウントを作成しておきましょう。

 

 

 

 

上から順にささっと入力していきます。

【Company name】は不要です
【Select a Language】は【Python】にします。

 

そして、【Create Free Account】をクリックすると入力したアドレスに確認メールが飛んで来るので、メール内のリンクをクリックして、パスワード設定画面へ。

 

パスワードを入力して、【Set password and log in】をクリック。
この画面が表示されればOKです!

 

 

 

heroku toolbeltをインストールする

 

 

Herokuのユーザ登録が完了したら、gitとtoolbelt(Heroku-CLI)をぞそれぞれインストールしてください。このツールでHerokuをコマンドラインでから操作できます。今回はWindowsで進めていきますがあ、以下のリンクから各環境に合わせたものをインストールしてください。

 

Heroku-CLI: https://toolbelt.heroku.com/

Git:https://git-scm.com/downloads

 

 

toolbeltをインストールしたら、ターミナルで以下のコマンドを入力しましょう。バージョンが表示されればrootにパスが通っているので問題ないです。

# それぞれのバージョンを確認する
$ git --version
$ heroku -v

 

よくあるのが「’git’は内部コマンドまたは外部コマンドとして認識されません」というエラー、これはrootにPATHが通っていないのが原因なので、コマンドプロンプトを「管理者として実行する」かrootにパスを通してください。

 

あなたのGitインストールを指すようにあなたのPATHを正しく設定しましたか?

以下のパスをPATHに追加する必要があります。

C:\Program Files\Git\bin\
C:\Program Files\Git\cmd\
そして、これらのパスが正しいことを確認してください - あなたはGitが別のドライブにインストールされているか、Program Files (x86)の下にあるかもしれません。必要に応じてパスを修正してください。

Windows 10でPATHを変更する:

スタートメニューまたはタスクバーの検索で、「環境変数」を検索してください。
「システム環境変数を編集する」を選択します。
下部にある[環境変数]ボタンをクリックします。
[システム環境変数]の下の[パス]エントリをダブルクリックします。
PATHエディタの[New]ボタンを使用して、リストの最後にC:\Program Files\Git\bin\とC:\Program Files\Git\cmd\を追加します。
コンソールを閉じて再度開きます。
Windows 7でPATHを変更する:

デスクトップまたはスタートメニューの[コンピュータ]を右クリックします。
「プロパティ」を選択してください。
一番左端の、[システムの詳細設定]リンクをクリックします。
下部にある[環境変数]ボタンをクリックします。
[システム環境変数]の下の[パス]エントリをダブルクリックします。
「変数値」の最後に、まだ存在していない場合は;を挿入し、次にC:\Program Files\Git\bin\;C:\Program Files\Git\cmd\を挿入します。 ;とエントリの間にスペースを入れないでください。
コンソールを閉じて再度開きます。
これらの指示が役に立たなかった場合は、他の人を見てください。

Windowsでパスと環境変数を設定する方法 (Computer Hope)
Windowsで簡単にコマンドラインにアクセスできるようにシステムパスを編集する方法 (How-To Geek)
Windows 10でPath環境変数を設定する方法 (習慣性のヒント)
PATHやその他の環境変数とは何ですか?また、それらをどのように設定または使用できますか? (スーパーユーザー)

参照:https://www.it-swarm-ja.tech/ja/windows/%27git%27%E3%81%AF%E5%86%85%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%BE%E3%81%9F%E3%81%AF%E5%A4%96%E9%83%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93/970196539/

 

 

ここが問題なければ「heroku-CLI」を使用してコマンドラインからHerokuにログインしてみましょう。以下のコマンドを打ち込み、先ほど登録したメールアドレスとパスワードを入力すれば下記のようになるかと思います。

 

$ heroku login
Enter your Heroku credentials.
Email: hoge@example.com
Password hogehoge:
Authentication successful.

 

ちなみに2回目のログインからは認証ページがブラウザで開き、そのページのLOGINをクリックするだけで認証は完了します。

 

新規プロジェクトを作成する

 

ログインができたら新規プロジェクトを作成していきましょう。まずローカル作業用のフォルダを作成し、そこに移動します。(フォルダ名などは任意で大丈夫です)。コマンドが良く分からない場合はファイルエクスプローラーから手動で作成しても問題ありません。

 

# 新規フォルダを作成する
$ mkdir himajin-test
# 作業用フォルダを移動する
$ cd himajin-test

 

次に以下のコマンドを打ち込んで新規プロジェクトを作成します。プロジェクトは無料枠だと4つしか作れないので、むやみに作らないようにしましょう。

 

# 新規プロジェクトの作成(プロジェクト名は勝手に決めてくれます)
$ heroku create

 

ここの名前は全ユーザー共通なので、既にほかのだれかが使用している場合は「Name heroku-test is already taken」と返されるので違う名前を付けてください。

 

# ローカルリポジトリを作成する
$ git init
$ git add .
$ git commit -m "Initial Commit"
$ git remote add heroku https://git.heroku.com/<アプリケーション名>.git
$ git push heroku master

 

空のリポジトリを作成しようとしていますと警告がでますが、無視でオッケーです。プロジェクトが作成できたら、heroku git:remote -aで、herokuに接続しましょう。

 

# プロジェクトに接続する
$ heroku git:remote -a himajin-test

 

ローカルにファイルを置いてデプロイする

 

プロジェクトに接続してローカルリポジトリを作成したら、そこに定期実行させたいスクリプトと設定ファイルを配置します。今回は「GMOコイン」という仮想通貨取引所のビットコインの価格データをスクレイピングで取得し、コンソールに出力するプログラムを配置します。

 

<main.py>

import requests
import json
endPoint = 'https://api.coin.z.com/public'
path = '/v1/ticker?symbol=BTC'
response = requests.get(endPoint + path)
print('現在のビットコインの価格は', response.json()['data'][0]['last'],'円です')

 

あとruntime.txtとrequirements.txtも作成します。これらはHeroku側にプログラムの言語と実行環境を教えてあげるためにあります。これらがないとプログラムは動作しません。

 

herokuで動作するPythonのバージョンには制限があるので、herokuでサポートしているバージョンを指定しましょう。

 

<runtime.txt>

python-3.7.10

 

次にrequirements.txtにはプログラムに使用している外部モジュール名とバージョンを記載します。手動でも作成できますが、以下のコマンドで一括作成できます。

 

# 現在の環境のインストールされているモジュールをrequirements.txtに書き出す
$ pip freeze > requirements.txt

 

Anaconda環境だと膨大になるので、今回はその中からこのプログラムで使用しているrequestsだけを記載します(jsonは標準モジュールなので記載不要です。)

 

<requirements.txt>

requests==2.25.1

 

配置は以下のようになっています。

 

配置出来たらこれをgitコマンドを使ってデプロイします。

 

# git経由でデプロイする 
$ git init 
$ git add . 
$ git commit -m "first commit" 
$ git push heroku master

 

恐らく以下のようなエラーが出ると思います。

 

$ git push heroku master

fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

 

configにリモート先が指定されていないのが原因なので.git/configをコマンドなりテキストエディタで以下のように付け加えます。(既に作成されている場合はスルーしてください。)

 

[remote "origin"]
  url = https://hoge@bitbucket.org/hoge/hoge.git
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master

# ↓を追加し、URLとFetchには[remote "origin"]の部分と同じにする
[remote "heroku"]
  url = https://git.heroku.com/hoge.git
  fetch = +refs/heads/*:refs/remotes/heroku/*

 

configを修正したあと再度$ git push heroku masterを叩くとコマンドが通り、デプロイが完了します。デプロイしたmain.pyが動くかどうかは以下のコマンドを叩くと確認できます。

 

# デプロイしたファイルを実行してみる
$ heroku run --app himajin-test python main.py

(heroku run --app <プロジェクト名> <コマンド>

※結果 現在のビットコインの価格は 3066955 円です

 

Heroku schedulerをインストールする

 

プロジェクトがデプロイできたら、次はそこにHeroku Schdulerをインストールしましょう。

 

ここで注意点なのですが、Heroku Schdulerをインストールするためにはクレジットカードを登録をする必要があります。基本的にクレカの支払いは発生しませんが、万が一無料枠を超えた時のために必要となります。

 

クレジットカード設定はホーム画面から右上のユーザーアイコンをクリックすると出てくる「account setting」「billing(支払い)」の画面で設定できます。クレカを設定していないと以下のようなエラーがでます。

 

▸    Please verify your account to install this add-on plan (please enter a credit card) For more
 ▸    information, see https://devcenter.heroku.com/categories/billing Verify now at
 ▸    https://heroku.com/verify

 

クレカを設定できたら以下のコマンドを叩いてHeroku Schdulerをインストールしてください。

 

# Heroku Schdulerをインストールする
$ heroku addons:create scheduler:standard --app himajin-test

 

Heroku schedulerにタスクを設定して定期実行する

 

schedulerをインストールしたら、定期実行のタスク内容を設定します

 

# スケジューラーを開く
$ heroku addons:open scheduler

 

Heroku schedulerが複数のプロジェクトにインストールされていると、Ambiguous identifier; multiple matching add-ons found:~ とエラーが出るので、found:~いかに表示されているスケジューラーのIDを指定してください。

 

# スケジューラーを開く(スケジューラーが複数ある場合)
$ heroku addons:open <schedulerのID>

 

するとブラウザが開いて以下のような画面に遷移するので「Create job」をクリックしてください

 

するとediterが開くのでタスクの間隔とコマンドを指定します。タスクの間隔は「10分に1回」「1時間に1回」「1日1回」の3種類です。VPSのcronであれば自由自在に設定できるので、ここが少しもどかしいところですね。コマンドは先ほどの実行コマンドのheroku run –app himajin-test~  以降の「python main.py」の部分だけを記載するだけでオッケーです。

 

 

 

これで「save job」をクリックするとタスクが登録されます。

 

登録したタスクの実行状況の確認はログ出力することで確認できます。

 

# プロジェクトのログを確認する
$ heroku logs --app アプリ名

 

タスクを登録して10分後に以下のようなコンソールにビットコインの価格を表示するメッセージが出力されていれば、定期実行は成功しています。

 

~
2021-01-02T11:04:17.647876+00:00 heroku[scheduler.5387]: Starting process with command `python main.py`
2021-01-02T11:04:18.289925+00:00 heroku[scheduler.5387]: State changed from starting to up
2021-01-02T11:04:22.830200+00:00 app[scheduler.5387]: 現在のビットコインの価格は 3060000 円です
2021-01-02T11:04:23.009431+00:00 heroku[scheduler.5387]: Process exited with status 0
2021-01-02T11:04:23.070760+00:00 heroku[scheduler.5387]: State changed from up to complete
~

 

終わり

 

以上が「heroku scheduler」の使い方です。タダで使えますが、その分自由度は少し低めです。より高頻度でタスクを実行したい場合はVPSを使ったほうがいいかなと思います。

 

今回はビットコインの価格をコンソールに表示するだけでしたが、定期実行するスクリプトでよくあるのが、スクレイピングした内容をメールで通知する的なやつですかね?以下の記事を参照にするとスクレイピングした内容をメールで送信するアプリなんかも作れちゃいます。

 

関連記事:【Python】YahooメールのSTMPを使ってメール送信してみる

 

 

 

 

コメント

タイトルとURLをコピーしました