仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書きます。

PythonでSlackBot開発②「Herokuにデプロイする」


PythonでSlackBotを開発しよう企画の第2弾!今回は、第1回目で作ったしょぼいSlackBotアプリケーションをデプロイ(いつでもアクセスできる状態に)していきましょう。

わざわざ「$ python run.py」と打ち込んでファイルを起動しなくてもBotが動き続けてくれるようになることを目指します。


Herokuとは?

Herokuとは、PaaS(Platform as a Service)と呼ばれるサービスで、アプリケーションを実行するための環境を提供してくれるものです。Webサイト上でブログを書いてブログがインターネット上に公開されるには、IPアドレスを取得して、Webアプリケーションとして公開してと様々な手順が必要なのですが、そのめんどくさい手順の諸々を担ってくれるありがたい機能です。PaaSを利用することで、難しいことを考えずに自分の手元で開発したアプリケーションをWeb上に公開することができるのです。

f:id:virtual-surfer:20180331200608p:plain
(参照:https://jp.heroku.com/pricing

2018年4月現在だと、1ヶ月に1000時間までは無料で利用できるようなので、1アプリケーションしか利用しなければ31日×24hで744hなので、ずっと稼働させられますね。今回はそんなHerokuを使っていきます!


Herokuのアカウント登録

まずは、HerokuのWebサイトにアクセスし、アカウント作成をしていきます。


f:id:virtual-surfer:20180331200910p:plain

「SIGN UP FOR FREE」というボタンをクリックして会員登録していきます。


f:id:virtual-surfer:20180331201058p:plain

名前、メールアドレスなどを登録していきます。


f:id:virtual-surfer:20180331201336p:plain

メールアドレス認証してねという画面になるので、Herokuから届いているメールを確認しましょう。


f:id:virtual-surfer:20180331201540p:plain

登録したメールアドレスに届いているリンクをクリックして、認証します。


f:id:virtual-surfer:20180331201701p:plain

パスワードの登録を求められるので、登録して「SET PASSWORD AND LOGIN」をクリックしてログインします。


ここまででアカウントの登録は完了です。


Herokuでデプロイ設定ファイル作成

次に、デプロイする際に必要になるファイルを作成しておきます。以下のファイルを作成します。

$ touch Procfile
$ touch runtime.txt
$ touch requirements.txt

それぞれ以下のようにファイルに記述していきます。


Procfile

pbot: python run.py

↑ これで「$ pbot」というコマンドで「$ python run.py」を呼び出すことができます。


runtime.txt

python-3.6.4

↑ runtime.txtには利用しているpythonのバージョンを書き込みます。「$ python -V」でPythonのバージョンを確認し、そのバージョンを記載しましょう。


requirements.txt

slackbot==0.5.1

↑ requirements.txtには利用しているslackbotのバージョンを書き込みます。「$ pip freeze | grep slackbot > requirements.txt」コマンドで、pipで管理されているslackbotという名前のライブラリのバージョン情報をrequirements.txtファイルに書き込むことができます。便利。


次に、デプロイしてSlackBotに話しかけた時に、返答内容でデプロイした内容が反映されているかを確認するため、DEFAULT_REPLYの内容を先ほどと変えておきましょう。

slack_settings.py

DEFAULT_REPLY = "Hey, I'm on Heroku!"

↑ またこの段階で、Gitを初期化してプッシュする前に、「slackbot_setting.pyファイルに記述されているAPI_TOKEN」の値が消されていなければ、消しておきましょう。Git上にAPIトークンをあげてしまうと、全世界誰からでもそのAPIトークンを利用されてしまうので注意です。


Herokuでデプロイ


f:id:virtual-surfer:20180331201844p:plain

HerokuWebサイトにログインすると、アプリケーションを作成する画面に遷移すると思うので、ここで「Create New App」をクリックします。


f:id:virtual-surfer:20180401100934p:plain

アプリケーション名と地域を入力する画面になるので、適当に入力していきます。入力できたら「Create app」をクリック。

これでアプリケーションの登録は完了です。次に、「Setting」というタブをクリックして設定を変更していきます。


f:id:virtual-surfer:20180401094843p:plain

前回、PythonでSlackBot開発①で「slackbot_settings.pyファイル」に登録したAPIトークンの変数と値を入力して、「Add」をクリックして登録完了させます。


f:id:virtual-surfer:20180401100713p:plain

下にスクロールしていき、「Add buildpack」をクリックします。


f:id:virtual-surfer:20180331202749p:plain

今回はPythonアプリケーションとして利用するので、「Python」を選択します。これでアプリケーションの設定は完了です。

あとはHerokuにアプリケーションをデプロイしていきます。


f:id:virtual-surfer:20180401100725p:plain

HerokuサイトのDeployの箇所に書いてある手順に沿ってデプロイを進めていきます。まずは「$ brew install heroku/brew/heroku」でherokuをインストールします。(MacOSの場合です。)無事インストールできたら、「$ heroku login」と打ち込んで、herokuに登録したemailとpasswordの入力を求められるので、入力していきます。

$ brew install heroku/brew/heroku
$ heroku login
Enter your Heroku credentials:
Email: 
Password: 


ここで、普通はログインできると思いますが、僕はなぜかログインできないエラー発生。(ここで普通にログインできた方は、ログイン以降の処理まで読み飛ばしてください。)

WARNING: This is the legacy Heroku CLI with limited functionality. Please install the latest CLI.
WARNING: On MacOS this can be done with 'brew install heroku' or with the MacOS package from https://cli.heroku.com

「Heroku CLIのバージョンが古いから最新のものにアップデートしてね!」て言われているので、言われた通りに「$ brew install heroku」を再度実行してみるも特にバージョンアップデートはされず。「$ heroku version」でherokuのバージョンを確認してみると「heroku-cli/6.16.3-4239951 (darwin-x64) node-v9.9.0」となっていて最新っぽいしなぁ...。と。


もう一度「brew install heroku/brew/heroku」を実行してエラー文を読んでみると、以下のメッセージが。

Warning: heroku/brew/heroku 6.16.3 is already installed, it's just not linked.
You can use `brew link heroku` to link this version.

どうやら最新版をインストールすることはできているけど、紐付けができていないようですね。エラー文の指示に従って「$ brew link heroku」してやります。

$ brew link heroku
Linking /usr/local/Cellar/heroku/6.16.3... 
Error: Could not symlink bin/heroku
Target /usr/local/bin/heroku
already exists. You may want to remove it:
  rm '/usr/local/bin/heroku'

To force the link and overwrite all conflicting files:
  brew link --overwrite heroku

To list all files that would be deleted:
  brew link --overwrite --dry-run heroku

すると、次は「すでにusr/local/bin/herokuにシンボリックリンクが貼られているから、シンボリックリンク貼れませんわ...」みたいなエラー文が。そういえば、1年前くらいにHerokuインストールしたことあったし、そのシンボリックリンクが邪魔してんのかな?と思って上書きしてみる。

$ brew link --overwrite heroku
Linking /usr/local/Cellar/heroku/6.16.3... 1 symlinks created

いけたっぽい!再度ログインを試みます。

$ heroku login
...(emailとpass入力)
Logged in as xxx@gmail.com

次はちゃんとログインできました。ふ〜よかったよかった。


無事Herokuにログインできたので、Gitを初期化してプッシュしていきます。まずはアプリケーションのディレクトリに移動。

$ cd virtual-surfer-bot

↑ 「virtual-surfer-bot」は、自分のアプリケーション名に変えてください。アプリケーションディレクトリに移動できたら、gitを初期化します。そのあとに、remoteのレポジトリを作成します。

$ git init
$ heroku git:remote -a virtual-surfer-bot


次に、以下のコマンドでherokuにデプロイしていきます。

$ git add .
$ git commit -am "初めてのコミット!"
$ git push heroku master

「$ git add .」で、アプリケーションディレクトリ配下のすべての変更があったファイルの変更内容をステージングに反映します。その後、「$ git commit -am "初めてのコミット!"」で、「初めてのコミット」というコミット名で変更内容をコミットします。その後、「$ git push heroku master」で手元(ローカルリポジトリ)のコミットをremoteリポジトリのmasterブランチに反映させます。

remote: Building source:
remote: 
remote: -----> Python app detected
remote: -----> Installing python-3.6.4
remote: -----> Installing pip
remote: -----> Installing requirements with pip
remote:        Collecting slackbot==0.5.1 (from -r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading slackbot-0.5.1-py2.py3-none-any.whl
remote:        Collecting slacker>=0.9.50 (from slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading slacker-0.9.65.tar.gz
remote:        Collecting six>=1.10.0 (from slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading six-1.11.0-py2.py3-none-any.whl
remote:        Collecting websocket-client>=0.22.0 (from slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading websocket_client-0.47.0-py2.py3-none-any.whl (200kB)
remote:        Collecting requests>=2.4.0 (from slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
remote:        Collecting urllib3<1.23,>=1.21.1 (from requests>=2.4.0->slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading urllib3-1.22-py2.py3-none-any.whl (132kB)
remote:        Collecting idna<2.7,>=2.5 (from requests>=2.4.0->slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading idna-2.6-py2.py3-none-any.whl (56kB)
remote:        Collecting chardet<3.1.0,>=3.0.2 (from requests>=2.4.0->slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
remote:        Collecting certifi>=2017.4.17 (from requests>=2.4.0->slackbot==0.5.1->-r /tmp/build_ec718ce7f517690e266a465e86e293a1/requirements.txt (line 1))
remote:          Downloading certifi-2018.1.18-py2.py3-none-any.whl (151kB)
remote:        Installing collected packages: urllib3, idna, chardet, certifi, requests, slacker, six, websocket-client, slackbot
remote:          Running setup.py install for slacker: started
remote:            Running setup.py install for slacker: finished with status 'done'
remote:        Successfully installed certifi-2018.1.18 chardet-3.0.4 idna-2.6 requests-2.18.4 six-1.11.0 slackbot-0.5.1 slacker-0.9.65 urllib3-1.22 websocket-client-0.47.0
remote: 
remote: -----> Discovering process types
remote:        Procfile declares types -> pbot
remote: 
remote: -----> Compressing...
remote:        Done: 42.8M
remote: -----> Launching...
remote:        Released v4
remote:        https://virtual-surfer-bot.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.

上記のようにプッシュすると、ビルドとデプロイが走っていることが確認できます。これだけでビルド・デプロイできるのは超楽。


デプロイが完了していることを確認できたら、以下のコマンドでpbotに1プロセス割り当てます。

$ heroku ps:scale pbot=1
Scaling dynos... done, now running pbot at 1:Free


Dynosの割り当てができたようです!これでSlack上で話しかければ返答してくれるはずです。


f:id:virtual-surfer:20180401160807p:plain

用意されている入力内容で話しかけると反応してくれるようですね!入力内容とリアクションを拡張していけばいろいろできそうです!


以上、Herokuにアプリケーションをデプロイする手順でした!これでいつでもSlack上で話しかければ返答してくれる状態にすることができました。


今回は、こちら↓を参考にさせてもらいました!

Python × Herokuで作る 雑談slack bot


では!