Heroku入門、Flaskアプリをデプロイ

# はじめに

## herokuとは？

2007年にアメリカで創業したheroku社が提供しているPaaS（Platform as a Service）。

PaaSとは、サーバーの初期設定をすることなく、アプリを公開することのできるサービスのことである。これにより、開発者はアプリケーションの開発に集中することが可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817075/6103b228-a86c-fdd0-c431-5b13c9e52117.png)

## herokuを使うメリットは？

### 拡張機能が豊富

スケールアウトとは、システムを構成するサーバーの台数を増やすことで、システムの処理能力を高める、コンピュータの環境を増強する方法の1つでアプリを開発して公開した後、スムーズに運用を進めるためには「最適な環境を維持すること」が必要不可欠です。
アプリを利用するユーザーの増加などに合わせて、アプリが滞りなく動くために、環境を増強する必要が出てきます。多くのユーザに合わせてサービスを安定的に供給するためには、ハードウェアの性能を上げるためのスケールアウトが重要となってきます。
**また、herokuではダッシュボード画面で操作したり、簡単なコマンドを実行するだけですぐにスケールアウトを変更することが可能となっています。**

### スケールアウトが簡単
スケールアウトとは、システムを構成するサーバーの台数を増やすことで、システムの処理能力を高める、コンピュータの環境を増強する方法の1つでアプリを開発して公開した後、スムーズに運用を進めるためには「最適な環境を維持すること」が必要不可欠です。
アプリを利用するユーザーの増加などに合わせて、アプリが滞りなく動くために、環境を増強する必要が出てきます。多くのユーザに合わせてサービスを安定的に供給するためには、ハードウェアの性能を上げるためのスケールアウトが重要となってきます。
**また、herokuではダッシュボード画面で操作したり、簡単なコマンドを実行するだけですぐにスケールアウトを変更することが可能となっています。**

# Heroku

## Herokuコマンド環境のインストール

```
brew tap heroku/brew && brew install heroku
```

Herokuでアカウントを作成してログイン用のメールアドレスとパスワードをメモしておきます。
Terminalでloginコマンドを打ちます。

```
heroku login
```

上のコマンドを実行した様子が以下の感じです。
![ezgif-4-139b33230118.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817075/c7fca8c3-d6e3-62fc-e08f-cfa609b5b0de.gif)

# FlaskアプリをHerokuにデプロイ
## 必要なリソースを作成
プロジェクトファイル置くディレクトリを作成し、ディレクトリに移動します。
以下のコマンドをターミナルで実行します。

```
mkdir flaskonheroku
cd flaskonheroku
```
必要なファイルを作成します。

```
touch app.py Procfile
```

app.py を下記の通り編集する。

```app.py
# -*- coding: utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'hello, world'

if __name__ == '__main__':
    app.run()
```
Procfile を下記の通り編集する。

```Procfile
web: gunicorn app:app --log-file=-
```
pip install にて今回必要なライブラリーをインストールしておきます。
以下をターミナルにて実行しましょう。

```terminal
pip3 install Flask
pip3 install gunicorn
```
### デプロイに必要なファイルを作成
requirements.txtを作成する。

```
pip freeze > requirements.txt
```
requirements.txt を下記の通り編集する。

```
Flask==1.1.2
click==7.1.2
gunicorn==20.0.4
Jinja2==2.11.2
```

## ローカル環境で動くか確認

```
$ python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
アドレスにアクセスし、以下のような画面が出ればOKです。
![スクリーンショット 2020-10-25 17.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817075/38db587e-2f68-b89b-a8d5-3fbcb23a945d.png)

## gitリポジトリの準備
以下のコマンドをターミナルにて実行してgitリポジトリとして初期化

```
git init
git add .
git commit -m "first commit"
```

## Herokuアプリの作成
`heroku create`コマンドでHeroku上にアプリを作成します。

```terminal
$ heroku create
Creating app... done, ⬢ secret-refuge-44790
https://secret-refuge-●●●●●●●●.herokuapp.com/ | https://git.heroku.com/secret-refuge-●●●●●●●●.git
```
`heroku create アプリ名`でアプリ名を指定することもできます。
アプリ名を指定しないと、自動的にアプリ名が付けられます。(あとで変更可能です)

## Herokuへアプリをデプロイ
リモートリポジトリが作られているので、プッシュします。

```
$ git remote
heroku
git push heroku master
```
コマンドを実行しdeployしている様子が以下。
![ezgif-4-9c7ffb1c8e6f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817075/fa9cbdde-8a51-f3c3-29e9-c6709bdea1d4.gif)

## アプリの確認
以下のコマンドを実行すると自動的にブラウザが立ち上がりデプロイしたFlaskアプリが立ち上がります。

```
heroku open
```
以下の画面が実際に立ち上がったブラウザ画面の様子。
![スクリーンショット 2020-10-25 18.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817075/440b5334-323c-8a20-28a3-999ce45837a7.png)

# 参考にさせていただいた記事
・[herokuとは？初心者でも5分で分かる基本や特徴をまるっと紹介 | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/7858)
・[macでheroku deploy - Qiita](https://qiita.com/tetsu-sh/items/f6fcbb6b85df04e5cf3f)
・[herokuを利用したPythonアプリケーションのデプロイ方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/26403)
・[Heroku CLIの導入と初期設定](https://blog.katsubemakito.net/macos/setup_heroku-cli)
・[Heroku操作 CLI - Qiita](https://qiita.com/ntkgcj/items/9e812220881d671b6bff)