どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

初めてのHeroku!!登録&初期設定からPythonアプリのデプロイ方法についてまとめてみる

 

開発したアプリケーションをみんなに使ってもらうには、アプリケーションを動かすサーバーが必要になると思います。Herokuというサービスを使えばサーバーについて詳しく知らなくても、開発したアプリケーションを容易に動かすことができます。

本記事ではWindowsを使ってHerokuを初めて使う人向けにアカウント登録と初期設定、Tutorialを進めてアプリケーションのデプロイまでをやってみます。

 

 

Heroku(へろく)って何?

そもそもHerokuとはいったい何でしょうか?

 

f:id:pytry3g:20190307092417p:plain

 

Herokuとは、Pass(Platform as a Service)と呼ばれるサービスのひとつで、アプリケーションを実行するためのプラットフォームを提供しています。

Herokuを使うことにより自身で開発したアプリをサーバー周りのことを詳しく知らなくても容易に動かせるようになります。

制限がありますが今回は無料版のものを使ってアプリケーションをデプロイしてみます。

アカウント登録

アカウントはこちらの画面右上にある新規登録から行います。新規登録をクリックするとアカウント情報を入力する画面に移るので必要な情報だけを入力します。(※学生の方は会社名の入力は必要ありません。)

入力が終われば無料アカウント作成をクリック、登録したメールアドレスにHerokuから確認のメールが届くのでメールを開いてURLをクリックする。

パスワードの設定画面に移るのでパスワードの設定をするとアカウント登録作業は完了で、下のような画面に移動すると思います。

f:id:pytry3g:20190307204600p:plain

初期設定

Heroku CLIとGitのインストール

Herokuを使うにはHeroku CLIGitが必要になります。

  • Heroku CLIのインストール

Heroku CLIこちらのページからインストーラーをダウンロードします。私はWindowsを使っているのでheroku-x64.exeをダウンロードしました。MacLinuxはターミナルを開いてコマンドを打つだけでインストールできるみたいですね。

heroku-x64.exeを起動するとこのような画面が出てきます。

f:id:pytry3g:20190308091224p:plain

この内容のままNextInstallでOKです。

  • Gitのインストール

Gitのインストール方法はこちらに書かれています。私はだいぶ前にGitをWindowsにインストールしたのでやり方をはっきり覚えていません。なので、はっきりとしたことは言えませんが、こちらのページを見る限り、Linuxはターミナルからコマンドを打つだけ、Macは最初から入っていて、Windowsこちらのページに行くとGitのインストーラーのダウンロードが自動的に始まります。

Herokuにログインする

新しくコマンドプロンプト、もしくはPowershellを開きheroku loginを実行する。

> heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/browser/hogehoge...
Logging in... done
Logged in as e-mail address

q以外のキーを押すとブラウザが開いて下のようなログイン画面になるのでLog inをクリックする。

f:id:pytry3g:20190308152435p:plain

これで初期設定は完了です。

アプリケーションをデプロイする。

ここからはHerokuのTutorialを進めてアプリケーションをデプロイしてみます。

まずは作業ディレクトリを作って移動。

>mkdir workspace && cd workspacee

サンプルアプリケーションを用意する。

>git clone https://github.com/heroku/python-getting-started.git
>cd python-getting-started

Herokuにアプリを作るにはheroku create アプリの名前で作ることができます。(※アプリの名前は省略でき、適当な名前が付けられる。)

Tutorialではアプリの名前を省略しているので同じようにしてみました。下の例ではアプリの名前はserene-caverns-82714になっています。

>heroku create
Creating app... done, ⬢ serene-caverns-82714
https://serene-caverns-82714.herokuapp.com/ | https://git.heroku.com/serene-caverns-82714.git

アプリをHerokuにデプロイできるようになったので、デプロイしてみます。

>git push heroku master

アプリケーションはデプロイされていますが、まだHerokuでは動いていない状態です。

次のコマンドを実行してアプリを動かします。

>heroku ps:scale web=1

動作確認するには以下のコマンドを実行します。

>heroku open

ブラウザが開いて作成したアプリがちゃんと表示されているはずです。

ちなみに、アプリを止めるには以下のようにします。

>heroku ps:scale web=0

試しにheroku openを実行してみてください。ブラウザが開いてエラーが表示されるはずです。

(おまけ)トレンドを呟くTwitter botをHerokuにデプロイする。

Tutorialを進めただけでは、面白みに欠けるので自分でゼロから書いたコードをHerokuにデプロイしてみます。

ということで、現在のトレンド取得し、その中からランダムに選ばれた1つの単語を呟くTwitter botを作ってみます。

TwitterAPIを利用するにはConsumer keyやAccess tokenが必要になってきます。

持っていない方はDeveloper登録をしてください。

www.pytry3g.com

Pythonアプリの作成

まずは作業ディレクトhello-herokuを作り、そこに移動。

>mkdir hello-heroku && cd hello-heroku

そして、2つのプログラムを用意します。

twitter_api.pyではHerokuに設定した環境変数を読み込んで認証をしています。環境変数の設定方法は次のHerokuアプリの作成のところで後述します。

# twitter_api.py
import os
import tweepy


consumer_key = os.environ["CONSUMER_KEY"]
consumer_secret = os.environ["CONSUMER_SECRET"]
access_token = os.environ["ACCESS_TOKEN"]
access_token_secret = os.environ["ACCESS_TOKEN_SECRET"]

def get_authentication():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    return auth

 

bot.pyでやっていることはtweepyを使ってトレンドを取得し、その中からランダムに選んだものを現在の時刻と共にツイートをしています。このとき、ハッシュタグは取り除くようにしています。

さらに、apsschedulerを使って一時間ごとに post_tweet()が実行されるように設定。

# bot.py
import random
import tweepy
import twitter_api
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime, timedelta

auth = twitter_api.get_authentication()
api = tweepy.API(auth)

scheduler = BlockingScheduler()


woeid = {"日本": 23424856}
@scheduler.scheduled_job("interval", hours=1)
def post_tweet():
    # トレンドの取得
    trends = api.trends_place(woeid["日本"])[0]
    # 上位20に絞る
    trend_top20 = [content["name"] for content in trends["trends"]][:20]
    try_cnt = 0
    while try_cnt <= 10:
        word = random.choice(trend_top20)
        if "#" not in word:
            t = str(datetime.now() + timedelta(hours=+9)).split(".")[0]
            tweet = t + "\n" + "現在のトレンドですー>{}".format(word)
            api.update_status(tweet)
            break
        try_cnt += 1

# start bot program
scheduler.start()

無料版のHerokuは30分間何もしなければsleep状態になってしまいます。しかし、aspschedulerを使うことによりsleep状態を回避でき、定期的にジョブを実行することが可能になります。

(※ちなみに下のQ&Aでタイムゾーンの変更方法を書いていますが、変更した場合以下の部分は

   t = str(datetime.now() + timedelta(hours=+9)).split(".")[0]          

下のように変更するといいです。

      t = str(datetime.now()).split(".")[0]

Herokuアプリの作成

今回は以下3点を用意する必要があります。

  • requirements.txt
  • runtime.txt
  • Procfile

Herokuに使用するライブラリを教えてあげる必要があるので、以下のように書かれたrequirements.txtを用意する。

tweepy
apscheduler

 

runtime.txtpythonのバージョンを指定。

python-3.6.0

 

Procfileの中身。Tutorialではwebとなっていましたが、今回は以下のようにします。

clock: python bot.py

アプリケーションをデプロイする

現時点での作業ディレクトリはつぎのようになっています。

hello-heroku
requirements.txt
runtime.txt
Procfile
bot.py
twitter_api.py

 

デプロイするには、コマンドプロンプトもしくはターミナルから

> git init
> git add .
> git commit -m "Initial commit"

そして、Herokuにログインー>アプリの作成ー>デプロイー>環境変数の設定という流れです。(※環境変数の設定では、各自で用意したConsumer keyやAccess tokenなどに変えてください。)

> heroku login
> heroku create
> git pugh heroku master
> heroku config:set CONSUMER_KEY="consumer_key" CONSUMER_SECRET="consumer_secret" ACCESS_TOKEN="access_token" ACCESS_TOKEN_SECRET="access_token_secret"
> heroku ps:scale clock=1

heroku ps:scale clock=1実行するとアプリケーションが起動します。

 

アプリケーションを停止するには次のようにします。

> heroku ps:scale clock=0

 

コードを更新後は、以下のようにします。環境変数は再度設定する必要はありません。

> git add . もしくは git add ファイル名 とか git add *.py
> git commit -a -m "任意のコメント"
> git push heroku master
> heroku ps:scale clock=1

以上がTwitter botをHerokuにデプロイする方法になります。

Q&A

タイムゾーンを変更したい。

タイムゾーンを変更するには

> heroku config:add TZ=Asia/Tokyo

変更できたか確認するには

> heroku run bash
$ date

bashから抜け出すにはexit

無料版だと何時間使える?

2019年3月24日時点では550時間無料で使えるようです。

クレジットカードを登録すれば450時間追加されるので1ヵ月で最大1000時間無料で使えます。ただし、ひとつのアプリケーションではなくすべてのアプリケーションで1000時間です。