Heroku入門 - Python DjangoでHello Worldを表示する with Raspberry PI 3

## :rocket: この記事の目的

**PaaS**(プラットフォーム・アズ・ア・サービス)の一つである**Heroku**(ヘロク)に、PythonのWEBサーバのDjangoで作成した最も単純なアプリケーションをリリースし、画面に「Hello World...」を表示する手順を確認します。

※本記事の内容は、執筆時点(2020/10/18)のものです。今後の仕様変更や機能改修により内容がそぐわなくなる場合はご了承下さい。

## :rocket: Herokuとは

Herokuは、セールスフォース・ドットコム社のForce.comやGoogle社のGoogle AppEngineと並び、最も有名なPaaSの一つです。

:link: Heorkuの本サイト
https://jp.heroku.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cc1109bd-3f09-15af-1864-6040b9c5130f.png)

Herokuを利用すると、サーバの調達からセットアップやネットワークの構築、さらにサーバ類の保守・メンテナンスなどのインフラ環境の手間を一切考慮する必要がなく、カスタマイズしたアプリケーションをリリースし運用することができます。

Herokuにデプロイされたアプリケーションは、**Dyno**(ダイノ)と呼ばれる完全に独立したモジュール単位で実行され、自動的にスケール・イン(Dyno数を減少)、スケール・アウト(Dyno数を増加)することが可能です。

また、Dyno数の増減に応じて負荷分散やルーティング処理が自動的に行われ、利用者はその設定や操作を意識する必要がありません。

Herokuはこれ以外にも様々な機能を備えています。詳細はHeroku本サイトをご参照ください。

:moneybag: **無料利用範囲について**
Herokuには無料のお試しプランがあります。
・RAMの容量制限：512MBまで
・同時実行Dyno数：最大2個
・30分間アイドル状態でスリープに移行
・一月当たりのDyno利用時間：最大1,000時間

## :rocket: 実行環境

今回は、Raspberry PI 3でDjangoアプリを構築し、Herokuにリリースします。
実行環境(WEBアプリケーション構築環境)の詳細は以下です。

:wrench: **WEBアプリケーション構築環境詳細**
・Raspberry PI 3 model B (Memory 1GB)
・OSバージョン：Raspbian GNU/Linux 10 (buster)
・Kernelバージョン：Linux raspberrypi 4.19.97-v7+
・Python 3.7.3
・Git Version 2.20.1



## :rocket: WEBアプリケーション環境の構築

Djangoで「Hello World...」を表示するWEBアプリを作成します。
WEBアプリが完成したら、Herokuにリリースします。

####1. django-toolbeltのインストール

**django-toolbelt**をインストールします。
django-toolbeltとはPyPIで提供されるライブラリで、Herokuで実行に必要な機能の一式がまとめられたパッケージです。pip installでインストールします。

:link: django-toolbeltの詳細
https://pypi.org/project/django-toolbelt/

以下のコマンドを実行します。

`pip install django-toolbelt`

以下のように表示されたらOKです。
インストールされたソフトウェア名が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a090b948-2bb6-7ca6-00c1-6638978ca5f9.png)

####2. Djangoプロジェクトの作成

Djangoプロジェクトを作成します。作成手順は一般的なDjangoの手順と同じです。
今回は以下の手順で進めました。

(1)django-adminコマンドのパスを設定
　`export PATH=~/.local/bin:$PATH`
(2)django-adminコマンドを実行
　`django-admin startproject herokutest`
　プロジェクトフォルダ「herokutest」が作成されます。
(3)settings.pyの編集
　settinigs.pyの以下の部分を修正します。
　(ファイルの場所：[プロジェクトフォルダ]/herokutest/settings.py)

```ruby:settings.py
ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
```

(4)helloアプリケーションの作成
　(作成したプロジェクトフォルダheroku内で実行)
　`python manage.py startapp hello`
(5)views.pyの編集
　views.pyを以下のように設定します。
　(ファイルの場所：作成されたhelloフォルダ内)

```ruby:views.py
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello World Heroku Test!')
```

(6)urls.pyの編集
　urls.pyを以下のように設定します。
　(ファイルの場所：[プロジェクトフォルダ]/herokutest/urls.py)

```ruby:urls.py
from django.contrib import admin
from django.urls import path
import hello.views as hello

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', hello.index),
]
```

(7)画面表示の確認
　以下のコマンドを実行し、ブラウザでローカル環境にアクセスし、画面の表示を確認します。(コマンドは[プロジェクトフォルダ]直下で実行)
　`python manage.py runserver`
　ローカル環境：localhost:8000/hello/

　画面表示結果↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/5b8e8596-b852-8eee-2fc6-1cb1189e8040.png)
WEBアプリケーション環境の構築は以上です。

## :rocket: Herokuアカウントの登録

Herokuサイトで新規にアカウント登録を行います。
メールアドレスとパスワードを入力し、アカウント登録を行って下さい。
ここでは手順を省略します。

## :rocket: Heroku CLIのインストール

Herokuコマンドを使用するにあたり、Heroku CLIをインストールします。
以下のサイトからダウンロードします。

:link: https://devcenter.heroku.com/articles/heroku-cli

Raspberry PIでは、下図の赤線部のLinux(arm)からダウンロードを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/df2da8ac-8288-5cdb-8baa-6e6a5b01932e.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/db2c816c-7af8-6e3b-39ab-6205daaf644e.png)
ダウンロード後、解凍しbinフォルダにパスを通しておきます。

## :rocket: Herokuのログイン

以下のコマンドでHerokuへログインを行います。
`heroku login`
ブラウザが開き、ログインボタンが表示されますので、ログインを行って下さい。
以下の画面となればログイン成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/bef95585-555a-3752-0ae9-0532c4576a37.png)

## :rocket: SSH鍵の作成

ここでは、Heroku用に個別に使用する目的で、他の鍵と区別した新たなSSH鍵を作成する手順を確認します。
作成するSSH鍵の場所を~/herokukeys/とします。

以下の手順でSSH鍵を作成します。

(1) SSH鍵を格納するフォルダを作成します。
　`mkdir ~/herokukeys`
(2) SSH鍵ペアを作成します。
　`ssh-keygen -f ~/herokukeys/id_rsa`
　herokukeysフォルダ内に秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が作成されます。
(3) SSH鍵作成時にパスフレーズを設定した場合、接続の際に入力を求められますので、これを省略するために以下のコマンドを実行しておきます。
　`ssh-add ~/herokukeys/id_rsa`
(4) 作成したSSH公開鍵を登録します。
　`heroku keys:add ~/herokukeys/id_rsa.pub`
(5) Herokuサイトにおいて個別に作成したSSH鍵を使用するように以下の設定を実行しておきます。
　設定対象ファイル：~/.ssh/config

```ruby:~/.ssh/config
Host heroku
  HostName heroku.com
  User git
  IdentityFile /home/pi/herokukeys/id_rsa
```

## :rocket: Herokuにデプロイする際の必要な設定

HerokuにWEBアプリケーションをデプロイ(リリース)するためにいくつかの設定が必要となります。

####1. Procfileファイルを作成する

HerokuがWeb用のDynoであるWeb Dynoを実行するように、以下のコマンドでProcfileを作成します。
作成する場所は、[プロジェクトフォルダ]直下です。

`echo "web: gunicorn herokutest.wsgi --log-file -" > Procfile`

####2. runtime.txtファイルを作成する

実行するPythonのバージョンを記載します。
以下のようにpythonの文字は小文字で、ハイフンも付加して記載します。
作成する場所は、[プロジェクトフォルダ]直下です。

`echo "python-3.7.3" > runtime.txt`

####3. requirements.txtファイルを作成する

Pythonの実行に必要なライブラリを定義するファイルです。
Herokuはこの内容を見て必要なライブラリのインストールを行います。
作成する場所は、[プロジェクトフォルダ]直下です。

今回は内容を以下としました。

```ruby:requirements.txt
asgiref==3.2.10
dj-database-url==0.5.0
dj-static==0.0.6
Django==3.1.2
django-toolbelt==0.0.1
gunicorn==20.0.4
psycopg2==2.8.6
pytz==2020.1
sqlparse==0.4.1
static3==0.7.0
```

:bulb: **requirements.txtの作り方のコツ**
requirements.txtファイルは以下のコマンドで作成できます。
`pip freeze > requirements.txt`
上記ファイルは、このコマンドを実行後、必要なもののみを抽出しました。

## :rocket: WEBアプリケーションのGit化

####1. Gitの初期設定

Gitの初期設定を行っておきます。
user.emailはHerokuに登録したメールアドレスとして下さい。

```ruby:
git config --global user.email "メールアドレス"
git config --global user.name "ユーザ名"
```

####2. ソースのコミット

(1) Gitリポジトリを初期化します。
　[プロジェクトフォルダ]直下で実行します。
　`git init`
(2) ソースのコミットを行います。
　`git add .`
　`git commit -m "(コミットコメントを設定)"`
　コミットされたソースの一覧が画面に表示されればOKです。

## :rocket: Herokuへのデプロイ(リリース)

####1. アプリケーションの作成

以下のコマンドでHeroku上にアプリケーションを作成します。
[プロジェクトフォルダ]直下で実行します。
`heroku create`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4549d9fb-5e14-5685-1490-43a62137a0f8.png)
Herokuでは、アプリケーション名が自動的に付与されます。
リリースが成功した後は、WEBアプリケーションにアクセスするには、付与されたURLにアクセスします(有料版ではさらに独自ドメインを取得しこれに代えることができます)。

上記では、アプリケーション名としてmysterious-citadel-41347が付与されました。

####2. デプロイ(リリース)の実行

事前にデプロイにあたり、Djangoソースの調整を行います。
今回はStatic Assets(静的コンテンツファイル)を使用していないことを設定する必要があります。
以下のコマンドを実行します。
`heroku config:set DISABLE_COLLECTSTATIC=1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/eb746899-e527-177d-4a7b-35b5863ae32c.png)

以下のコマンドでデプロイ(リリース)の実行を実行します。
`git push heroku master`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/61880cdb-609d-964b-4863-004ca2e1e8a3.png)

####3. 画面表示の確認

エラーなくデプロイが成功したら、画面確認を行います。

"heroku open"コマンドでWEBアプリケーションを起動することができますが、今回はURL末尾にhello/を付加する必要があるため、ブラウザに直接URLを入力して確認を行います。

URL：**https://(アプリケーション名).herokuapp.com/hello/**

画面表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/2db6de5d-793b-2244-ad10-82c164d8619b.png)

ブラウザでは上記のように表示され、無事「Hello World Heroku Test!」の表示確認ができました。


## :rocket: 関連情報

:link: django-toolbeltの詳細
https://pypi.org/project/django-toolbelt/

:link: Heorkuの本サイト
https://jp.heroku.com/



## :rocket: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。