Herokuでお天気Pythonの定期実行

[前回](https://qiita.com/seigo-pon/items/acc5537a491ebc039059)までで作ったものですが、天気予報なので、どうせなら定期的に通知してやりたいなー、と思ったのでやってみました。

# Heroku
Pythonが無料で動くサーバーサイドのサービスって何があるんだろ、と調べたら真っ先に出てきたのがHerokuでした。
非常に簡単にPythonアプリをディプロイできるということでやってみます。

ちなみに、無料でできる範囲の情報が色々ネット上で錯綜していますが(というかころころプランが変わった様子)、定期的なスリープがなくなって稼働時間制限のみになってるようです。アプリ数関係なく1アカウントで月1000時間。

## アカウント作成
まずはアカウント作成。
ここで登録します。
https://signup.heroku.com/login

パスワードは英数だけでなく1文字以上の記号が必要なので注意。

`Primary Development Language`に使用する言語を書きます。
今回はもちろん`Python`
(けど複数使う場合もあるだろうから、別に関係ないのかな？)

## HerokuCLIのインストール
Heroku自体にはgitを介してディプロイします。

1. ローカルで開発
2. gitでHerokuサーバーにプッシュ
3. Herokuサーバーが最新ソースを元に環境をセットアップ

という順序で動作するようです。

この辺りのもろもろを用意した専用のHerokuCLIが用意されています。

ここのリンクからHerokuCLIをダウンロードしてインストールします。
https://devcenter.heroku.com/articles/getting-started-with-python#set-up

色々なOSに対応しております。(Standaloneってなんだ？)

## 開発環境の準備
適当にローカルでフォルダを切って開発環境を準備、ターミナルでアクセスします。

HerokuCLIがインストールされていれば、`heroku`コマンドが使えるようになっているので、登録したアカウントでログインします。

```
$ heroku login
Enter your Heroku credentials.
Email: 
Password:
```

認証通ったら、今回作るアプリを作成します。

```
$ heroku create
```

特別に名前を決めたい場合は、`create`の後に名前を入れます。
自分は入れてないので、適当な名前が勝手に割り振られました。
(やったことないですが、名前は被っちゃいけないらしいので、気を付けましょう)

これでHerokuサーバーに空のアプリが作成されました。
Webでコンソール画面を見にいくと作成されたアプリが確認できます。

![heroku-app.png](https://qiita-image-store.s3.amazonaws.com/0/7690/96ab4766-f4e4-1be3-3655-b60188345dc2.png)

## 開発したソースをプッシュ
前回までに開発したPythonソースを開発フォルダに突っ込みます。

自分の用意したファイル構成は以下のような感じです。

```
root/
├ line/
│   ├ __init__.py
│   └ linenotify.py
├ weatherhacks/
│   ├ __init__.py
│   ├ primary_area.py
│   └ weatherhacks.py
├ main.py   
├ requirements.txt
└ runtime.txt
```

適当に前回までの処理をファイルに切っています。

注意としては、以下です。

- 依存関係のある外部モジュールは`requirements.txt`に記述する
    - 今回でいうと`emoji`と`xmltodict`がそれです。
    - `pip freeze`を実行するとリストが作成できます。`pip install > requirements.txt`でファイル出力もできます。
    - なのですが、仮想環境じゃないとpipでローカルにインストールした全部が出力されてしまうので注意。

- Pythonのバージョンを`runtime.txt`に記述する
    - Heroku標準で使用するPythonのバージョンは`3.6.4`です。
    - ですが、自分が開発したのは`2.7.10`です。
    - 一応Herokuでは`2.7.14`が使用できるようになっており、`runtime.txt`を用意してプッシュすると自動的に環境を変更してくれるそうです。
    - `runtime.txt`に`python-2.7.14`を書いて置いておきましょう。

ソースの準備ができたら、適当にコミットします。

```
$ git add ./
$ git commit -m "Initial Commit"
```

これで準備完了。
Herokuサーバーにプッシュします。

```
$ git push heroku master
```

むにゃむにゃ〜とログが出てきて、成功すれば

```
remote: Verifying deploy... done.
To git@heroku.com:lit-bastion-5032.git
 * [new branch]      master -> master
```

みたいに出力されます。
エラーの場合は内容が出力されるし、コンソールでも確認できるので焦らず対処してください。

## 環境変数の準備
今回LINE Notifyのトークンを環境変数に設定したままプッシュしたので、この状態ではまだ動かせません。

Herokuの環境変数は以下で用意できます。

```
$ heroku config:set LINE_TOKEN="xxxxxxx"
```

みたいな感じです。
`heroku config`すると一覧が見れるので確認もできます。

## 動作確認
準備完了しましたが、WebアプリでもなくただのPythonソース置いただけでどうやって動かすねん、ですよね。
それが以下のように打つと簡単に実行できるんすよ。

```
$ heroku run python main.py
```

ずばっとLINE Notifyが飛んでくるのかが確認できました。
使い勝手が全然ローカルと変わらんやんけ。

## 定期実行設定
Herokuの定期実行で一番メジャーなのは、`heroku scheduler`とのこと。
アドオンとして提供されているもので、簡単にセットアップできてコンソールでも使用できます。
(ただし、いくつかのアドオンに有料プランが存在するため、アドオンを使用する場合にはクレカの登録が必須となっています)

```
$ heroku addons:add scheduler:standard
```

で追加されます。
あとはコンソールから設定可能。

![heroku-scheduler-1.png](https://qiita-image-store.s3.amazonaws.com/0/7690/bd067f3a-9d4e-8e2f-7e29-73bd80c4c85f.png)

`Add new job`すると以下の画面が表示されます。

![heroku-scheduler-3.png](https://qiita-image-store.s3.amazonaws.com/0/7690/2fb53f5b-35ef-64ab-26e4-5d5406059539.png)

実行する処理、今回で言えば`python main.py`を入力します。
あとはスケジュールタイムを入力してSaveします。
時間はUTCなので日本人の我々は9時間足します。

これで完了。
時が来るのを待ちます。

<img width="320" alt="IMG_3500.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/7690/7f13bc7c-fb2b-2c1a-254c-c1520739e570.png">

無事22:00にセットしたのが来ました！

# まとめ
Herokuのセットアップは思いの外、というレベルでないぐらいめちゃくちゃ簡単でした。
無料なんだから使わないともったいないぐらい。

git管理というのが少し理解しづらい感じですが、Pythonの実行方法などはローカルとなんら変わりないので「本当にサーバーで動いてんの？」という感覚で操作できます。

面倒な部分はコンソールでも確認できるので、その辺りも充実しています。

一度触って見て損はないのではないでしょうか？

問題は無料枠で使えるストレージとかがなさそうな部分でしょうか。(DBはあるようですが、微々たるもの、、、)
今回のようなAPIラッパーみたいなのに使うのが良さそうです。

以上でした。