PythonでSlackBotを開発しよう企画の第2弾!今回は、第1回目で作ったしょぼいSlackBotアプリケーションをデプロイ(いつでもアクセスできる状態に)していきましょう。
わざわざ「$ python run.py」と打ち込んでファイルを起動しなくてもBotが動き続けてくれるようになることを目指します。
Herokuとは?
Herokuとは、PaaS(Platform as a Service)と呼ばれるサービスで、アプリケーションを実行するための環境を提供してくれるものです。Webサイト上でブログを書いてブログがインターネット上に公開されるには、IPアドレスを取得して、Webアプリケーションとして公開してと様々な手順が必要なのですが、そのめんどくさい手順の諸々を担ってくれるありがたい機能です。PaaSを利用することで、難しいことを考えずに自分の手元で開発したアプリケーションをWeb上に公開することができるのです。
(参照:https://jp.heroku.com/pricing)
2018年4月現在だと、1ヶ月に1000時間までは無料で利用できるようなので、1アプリケーションしか利用しなければ31日×24hで744hなので、ずっと稼働させられますね。今回はそんなHerokuを使っていきます!
Herokuのアカウント登録
まずは、HerokuのWebサイトにアクセスし、アカウント作成をしていきます。
「SIGN UP FOR FREE」というボタンをクリックして会員登録していきます。
名前、メールアドレスなどを登録していきます。
メールアドレス認証してねという画面になるので、Herokuから届いているメールを確認しましょう。
登録したメールアドレスに届いているリンクをクリックして、認証します。
パスワードの登録を求められるので、登録して「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でデプロイ
HerokuWebサイトにログインすると、アプリケーションを作成する画面に遷移すると思うので、ここで「Create New App」をクリックします。
アプリケーション名と地域を入力する画面になるので、適当に入力していきます。入力できたら「Create app」をクリック。
これでアプリケーションの登録は完了です。次に、「Setting」というタブをクリックして設定を変更していきます。
前回、PythonでSlackBot開発①で「slackbot_settings.pyファイル」に登録したAPIトークンの変数と値を入力して、「Add」をクリックして登録完了させます。
下にスクロールしていき、「Add buildpack」をクリックします。
今回はPythonアプリケーションとして利用するので、「Python」を選択します。これでアプリケーションの設定は完了です。
あとはHerokuにアプリケーションをデプロイしていきます。
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上で話しかければ返答してくれるはずです。
用意されている入力内容で話しかけると反応してくれるようですね!入力内容とリアクションを拡張していけばいろいろできそうです!
以上、Herokuにアプリケーションをデプロイする手順でした!これでいつでもSlack上で話しかければ返答してくれる状態にすることができました。
今回は、こちら↓を参考にさせてもらいました!
Python × Herokuで作る 雑談slack bot
Pythonでのプログラミング学習中の方向けに、Noteでより詳細なプログラミングチュートリアルを配信しているので、そちらもチェックしてみてください( ・v・)/
では!