Heroku スターターガイド (Python)
はじめに
このチュートリアルを完了して、サンプル Python Django アプリを Heroku にデプロイします。
このチュートリアルでは、以下が用意されていることを前提としています。
- 確認済みの Heroku アカウント
- ローカルにインストールされた Python 3.12。インストールについては、OS X、Windows、Linux のガイドを参照してください。
- Eco dyno プランのサブスクリプション (推奨)
dyno とデータベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。低料金プランを使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
設定する
Heroku CLI には、一般によく使われている Git というバージョン管理システムが必要です。Git がインストールされていない場合は、先に進む前に次の手順を完了してください。
Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリケーションの管理やスケール、アドオンのプロビジョニング、ログの表示、アプリケーションのローカル実行に使用できます。
ご使用のプラットフォーム用のインストーラをダウンロードし、実行してください。
$ brew tap heroku/brew && brew install heroku
インストール後、コマンドシェルで heroku
コマンドを使用できます。
Heroku CLI にログインするには、heroku login
コマンドを使用します。
$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/***
Logging in... done
Logged in as me@example.com
このコマンドにより、Web ブラウザで Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページに表示されているLog in
(ログイン) ボタンをクリックします。
この認証は、heroku
と git
コマンドが正常に動作するために必要な操作です。
Heroku CLI のインストールや使用に問題がある場合は、アドバイスとトラブルシューティングステップについて、Heroku CLI のメイン記事を参照してください。
外部の HTTP/HTTPS サービスへの接続にプロキシを使用するファイアウォールを利用している場合は、heroku
コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY
または HTTPS_PROXY
環境変数を設定してください。
アプリを複製する
Heroku をはじめて使う場合は、 Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。
デプロイする既存のアプリケーションを用意してある場合は、 代わりにこの記事に従います。
コードのローカルバージョンを得るために、サンプルアプリケーションを複製します。以下のコマンドをローカルのコマンドシェルまたはターミナルで実行します。
$ git clone https://github.com/heroku/python-getting-started.git
$ cd python-getting-started
これで、シンプルなアプリケーションを格納した、正常な Git リポジトリを準備できました。これには、使用する Python バージョンを指定する runtime.txt
と、Python の依存関係マネージャー Pip によって使用される requirements.txt
が含まれています。
Procfile を定義する
Procfile は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言します。
サンプルアプリの Procfile
は、次のようになっています。
web: gunicorn gettingstarted.wsgi
この Procfile では、単一のプロセスタイプの web
と、その実行に必要なコマンドを宣言しています。 ここでは、web
という名前が重要です。 これは、このプロセスタイプを Heroku の HTTP ルーティングスタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しています。 ここで使われているコマンドは、Gunicorn (Web サーバー) を実行し、設定ファイルを渡しています。
Procfile には追加のプロセスタイプを含めることができます。 たとえば、キューからアイテムを取り出して処理するバックグラウンドワーカープロセスを宣言できます。
Microsoft Windows
サンプルアプリには、Microsoft Windows でローカル開発を行うための追加 Procfile
があり、ファイル Procfile.windows
内に配置されています。 チュートリアルの後半のステップでは、代わりにこの Procfile を使用して、Windows と互換性のある別の Web サーバーを起動します。
web: python manage.py runserver %PORT%
アプリを作成してデプロイする
Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちらを参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
Heroku でソースコードを受け取る準備をするには、アプリを作成します。
$ heroku create
Creating app... done, ⬢ serene-caverns-82714
https://serene-caverns-82714.herokuapp.com/ | https://git.heroku.com/serene-caverns-82714.git
アプリを作成すると、heroku
という名前の Git リモートリポジトリも作成され、ローカルの Git リポジトリと関連付けられます。Git リモートは、他のサーバー上で稼働するリポジトリのバージョンです。アプリに関連付けられた、Heroku でホストされる特別なリモートにコードをプッシュすることにより、アプリをデプロイします。
Heroku によってランダムなアプリ名 (このケースでは serene-caverns-82714
) が生成されます。独自のアプリ名を指定できます。
コードをデプロイします。このコマンドは、サンプルリポジトリの main
ブランチを heroku
リモートにプッシュし、次に Heroku にデプロイします。
$ git push heroku main
Enumerating objects: 673, done.
Counting objects: 100% (673/673), done.
Delta compression using up to 10 threads
Compressing objects: 100% (315/315), done.
Writing objects: 100% (673/673), 141.61 KiB | 141.61 MiB/s, done.
Total 673 (delta 305), reused 673 (delta 305), pack-reused 0
remote: Resolving deltas: 100% (305/305), done.
remote: Updated 28 paths from 9c4e1eb
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Python app detected
remote: -----> Using Python version specified in runtime.txt
remote: -----> Installing python-3.12.3
remote: -----> Installing pip 24.0, setuptools 69.2.0 and wheel 0.43.0
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: Collecting django<5.1,>=5.0 (from -r requirements.txt (line 1))
remote: Downloading Django-5.0.4-py3-none-any.whl.metadata (4.1 kB)
remote: Collecting gunicorn<23,>=22 (from -r requirements.txt (line 2))
remote: Downloading gunicorn-22.0.0-py3-none-any.whl.metadata (4.1 kB)
remote: Collecting dj-database-url<3,>=2 (from -r requirements.txt (line 3))
remote: Downloading dj_database_url-2.1.0-py3-none-any.whl.metadata (11 kB)
remote: Collecting whitenoise<7,>=6 (from whitenoise[brotli]<7,>=6->-r requirements.txt (line 4))
remote: Downloading whitenoise-6.6.0-py3-none-any.whl.metadata (3.7 kB)
remote: Collecting asgiref<4,>=3.7.0 (from django<5.1,>=5.0->-r requirements.txt (line 1))
remote: Downloading asgiref-3.8.1-py3-none-any.whl.metadata (9.3 kB)
remote: Collecting sqlparse>=0.3.1 (from django<5.1,>=5.0->-r requirements.txt (line 1))
remote: Downloading sqlparse-0.4.4-py3-none-any.whl.metadata (4.0 kB)
remote: Collecting packaging (from gunicorn<23,>=22->-r requirements.txt (line 2))
remote: Downloading packaging-24.0-py3-none-any.whl.metadata (3.2 kB)
remote: Collecting typing-extensions>=3.10.0.0 (from dj-database-url<3,>=2->-r requirements.txt (line 3))
remote: Downloading typing_extensions-4.11.0-py3-none-any.whl.metadata (3.0 kB)
remote: Collecting Brotli (from whitenoise[brotli]<7,>=6->-r requirements.txt (line 4))
remote: Downloading Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.5 kB)
remote: Downloading Django-5.0.4-py3-none-any.whl (8.2 MB)
remote: Downloading gunicorn-22.0.0-py3-none-any.whl (80 kB)
remote: Downloading dj_database_url-2.1.0-py3-none-any.whl (7.7 kB)
remote: Downloading whitenoise-6.6.0-py3-none-any.whl (19 kB)
remote: Downloading asgiref-3.8.1-py3-none-any.whl (23 kB)
remote: Downloading sqlparse-0.4.4-py3-none-any.whl (41 kB)
remote: Downloading typing_extensions-4.11.0-py3-none-any.whl (34 kB)
remote: Downloading Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.9 MB)
remote: Downloading packaging-24.0-py3-none-any.whl (53 kB)
remote: Installing collected packages: Brotli, whitenoise, typing-extensions, sqlparse, packaging, asgiref, gunicorn, django, dj-database-url
remote: Successfully installed Brotli-1.1.0 asgiref-3.8.1 dj-database-url-2.1.0 django-5.0.4 gunicorn-22.0.0 packaging-24.0 sqlparse-0.4.4 typing-extensions-4.11.0 whitenoise-6.6.0
remote: -----> $ python manage.py collectstatic --noinput
remote: WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
remote: 1 static file copied to '/tmp/build_74ee2e7d/staticfiles', 1 post-processed.
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 33M
remote: -----> Launching...
remote: Released v3
remote: https://serene-caverns-82714.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/serene-caverns-82714.git
* [new branch] main -> main
アプリケーションがデプロイされました。アプリのインスタンスが 1 つ以上実行されていることを確認します。
$ heroku ps:scale web=1
ps:scale
の実行時にエラー Couldn't find that process type (web)
が表示された場合は、アプリがまだデプロイ中であることを意味します。数分待ってから、再試行してください。
デプロイの出力に示されている URL でアプリにアクセスします。 次のショートカットを使って、Web サイトを簡単に開くこともできます。
$ heroku open
ログを表示する
Heroku では、すべてのアプリと Heroku のコンポーネントの出力ストリームから集約した時系列イベントのストリームとして、ログが扱われます。Heroku は、すべてのイベントに単一のストリームを提供します。
実行中のアプリに関する情報を表示するには、ログコマンドの 1 つである、heroku logs --tail
を使います。
$ heroku logs --tail
2023-12-07T16:24:23.439479+00:00 heroku[web.1]: Starting process with command `gunicorn gettingstarted.wsgi`
2023-12-07T16:24:24.079246+00:00 app[web.1]: [2023-12-07 16:24:24 +0000] [2] [INFO] Starting gunicorn 22.0.0
2023-12-07T16:24:24.079485+00:00 app[web.1]: [2023-12-07 16:24:24 +0000] [2] [INFO] Listening at: http://0.0.0.0:14495 (2)
2023-12-07T16:24:24.079518+00:00 app[web.1]: [2023-12-07 16:24:24 +0000] [2] [INFO] Using worker: sync
2023-12-07T16:24:24.081369+00:00 app[web.1]: [2023-12-07 16:24:24 +0000] [7] [INFO] Booting worker with pid: 7
2023-12-07T16:24:24.090070+00:00 app[web.1]: [2023-12-07 16:24:24 +0000] [8] [INFO] Booting worker with pid: 8
2023-12-07T16:24:24.191717+00:00 app[web.1]: WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
2023-12-07T16:24:24.198722+00:00 app[web.1]: WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
2023-12-07T16:24:24.575600+00:00 heroku[web.1]: State changed from starting to up
2023-12-07T16:25:39.298227+00:00 heroku[router]: at=info method=GET path="/" host=serene-caverns-82714.herokuapp.com request_id=e6d0c869-28dd-4ba3-820e-6fc137b4a32a fwd="123.45.67.89" dyno=web.1 connect=0ms service=8ms status=200 bytes=7732 protocol=https
さらに他の生成されたログメッセージを表示するには、まずブラウザでアプリケーションにアクセスします。
ログのストリーム出力を停止するには、Control+C
を押します。
アプリをスケールする
サンプルアプリをデプロイすると、1 つの Web dyno で自動的に実行されます。 dyno とは、Procfile
で指定されているコマンドを実行する軽量のコンテナのようなものです。
実行されている dyno の数を確認するには、ps
コマンドを使います。
$ heroku ps
Eco dyno hours quota remaining this month: 999h 50m (99%)
Eco dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Eco): gunicorn gettingstarted.wsgi (1)
web.1: up 2023/12/07 16:24:24 +0000 (~ 3m ago)
Heroku でアプリケーションをスケールするとは、実行中の dyno の数を変更することを意味します。 Web dyno の数を 0 にスケールしてみます。
$ heroku ps:scale web=0
Scaling dynos... done, now running web at 0:Eco
ブラウザのタブで更新ボタンを押してアプリにアクセスするか、heroku open
コマンドを使ってブラウザのタブで開きます。 リクエストに応答できる Web dyno がなくなったので、エラーメッセージが表示されます。
もう一度スケールしてみましょう。
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Eco
Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。Eco dyno は 30 分間トラフィックを何も受信しないとスリープします。 このスリープ動作により、スリープ解除した最初のリクエストで数秒の遅延が発生します。Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間を消費します。割り当て時間が残っている限り、アプリは稼働し続けます。
dyno がスリープしないようにするには、「dyno タイプ」の記事で紹介されている Basic 以上の dyno タイプにアップグレードします。少なくとも Standard dyno にアップグレードすることで、プロセスタイプあたり複数の dyno にスケールアップできます。
アプリの依存関係をローカルでインストールする
Heroku では、主要なファイルを探すことでアプリを Python アプリとして認識します。Python アプリを認識する 1 つの方法は、ルートディレクトリに requirements.txt
を格納することです。
デプロイしたデモ用アプリには、事前に次のような requirements.txt
が用意されています。
django>=5.0,<5.1
gunicorn>=22,<23
dj-database-url>=2,<3
whitenoise[brotli]>=6,<7
requirements.txt
ファイルにはアプリの依存関係がリストされています。Heroku がアプリをデプロイすると、プラットフォームはこのファイルを読み出し、pip install -r
コマンドを使用して適切な Python の依存関係をインストールします。
依存関係をローカルでインストールするには、仮想環境 (venv
とも呼ばれる) を作成します。この環境を使用すると、システム Python のインストールに影響を与えずに、パッケージをインストールできます。次のコマンドで、サンプルアプリのディレクトリ内に仮想環境を作成します。
$ python3 -m venv --upgrade-deps .venv
次に、仮想環境をアクティブにします。
Microsoft Windows システム をご使用の場合は、次のコマンドでアクティブにします。
.\.venv\Scripts\activate
macOS/Linux システムをご使用の場合は、次のコマンドでアクティブにします。
source .venv/bin/activate
仮想環境の設定に関するヘルプについては、Python のドキュメントを参照してください。
最後に、新しく作成した環境に依存関係をインストールします。
$ pip install -r requirements.txt
依存関係をインストールすると、それらの依存関係もインストールされます。インストールされる依存関係は、Pip の list
機能を使用して表示できます。
$ pip list
Package Version
----------------- -------
asgiref 3.8.1
Brotli 1.1.0
dj-database-url 2.1.0
Django 5.0.4
gunicorn 22.0.0
packaging 24.0
pip 24.0
sqlparse 0.4.4
typing_extensions 4.11.0
whitenoise 6.6.0
依存関係がインストールされたら、アプリをローカルで実行できます。
アプリをローカルで実行する
続行する前にアプリの依存関係をローカルで インストールしていることを確認します。
heroku local
を使ってアプリケーションをローカルで起動します。このコマンドは、Heroku CLI の一部です。
Microsoft Windows システム をご使用の場合は、次のコマンドを実行します。
$ heroku local --port 5001 -f Procfile.windows
macOS/Linux システムをご使用の場合は、次のコマンドを実行して、デフォルトの Procfile
を使用します。
$ heroku local --port 5001
コマンドを実行するとローカル Web サーバーが起動します。
[OKAY] Loaded ENV .env File as KEY=VALUE Format
16:30:48 web.1 | [2023-12-07 16:30:48 +0000] [47691] [INFO] Starting gunicorn 22.0.0
16:30:48 web.1 | [2023-12-07 16:30:48 +0000] [47691] [INFO] Listening at: http://0.0.0.0:5001 (47691)
16:30:48 web.1 | [2023-12-07 16:30:48 +0000] [47691] [INFO] Using worker: sync
16:30:48 web.1 | [2023-12-07 16:30:48 +0000] [47692] [INFO] Booting worker with pid: 47692
Heroku と同じように、heroku local
は Procfile
を使用して実行するコマンドを認識します。
アプリがローカルで実行していることを確認するには、Web ブラウザで http://localhost:5001 を開きます。
アプリのローカル実行を停止するには、CLI で Control + C
を押して終了します。
ローカルの変更をプッシュする
このステップでは、アプリケーションへのローカルでの変更を Heroku に反映させます。
requests
パッケージを requirements.txt
ファイルに追加します。
django>=5.0,<5.1
gunicorn>=22,<23
dj-database-url>=2,<3
whitenoise[brotli]>=6,<7
requests
pip を使用して requests
パッケージを更新された requirements.txt
ファイル経由でインストールします。
$ pip install -r requirements.txt
hello/views.py
を変更して、requests
モジュールと Django HttpResponse
クラスをファイルの上部にインポートします。
import requests
from django.http import HttpResponse
次に、モジュールを使用するように、index
メソッドを変更します。 現在の index
メソッドを次のコードで置き換えてみます。
def index(request):
r = requests.get('https://httpbin.org/status/418')
print(r.text)
return HttpResponse('<pre>' + r.text + '</pre>')
次にローカルで再びテストします。
Microsoft Windows システム をご使用の場合は、次のコマンドを実行します。
$ heroku local --port 5001 -f Procfile.windows
macOS/Linux システムをご使用の場合は、次のコマンドを実行して、デフォルトの Procfile
を使用します。
$ heroku local --port 5001
http://localhost:5001 でアプリケーションにアクセスし、https://httpbin.org/status/418 のフェッチの出力を確認します。
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
ブラウザにエラー Internal Server Error
が表示され、ターミナルログ出力にエラー ModuleNotFoundError: No module named 'requests'
が表示されている場合、requests
パッケージが正常にインストールされたことを確認します。
次にデプロイします。 Heroku へのデプロイは、ほとんどの場合、このパターンで行います。 まず、変更したファイルをローカルの Git リポジトリに追加します。
$ git add .
次に、変更内容をリポジトリにコミットします。
$ git commit -m "Demo"
次に、以前と同じようにデプロイします。
$ git push heroku main
最後に、すべて正常に動作しているかどうかを確認します。
$ heroku open
ログ記録アドオンをプロビジョニングする
アドオンは、アプリケーションですぐに使える追加サービスを提供するサードパーティのクラウドサービスです。永続性、ログ記録、モニタリングなど、さまざまなアドオンがあります。
Heroku では、デフォルトで 1500 行のアプリケーションログが記録されますが、完全なログストリームはサービスとして提供されています。複数のアドオンプロバイダーが、ログの永続化、検索、メールや SMS 通知などの機能を提供するログサービスを用意しています。
このステップでは、このようなログ関連アドオンの 1 つである、Papertrail をプロビジョニングします。
Papertrail ログ記録アドオンをプロビジョニングします。
$ heroku addons:create papertrail
Creating papertrail on ⬢ serene-caverns-82714... free
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging!
Created papertrail-convex-88929 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation
アドオンがデプロイされ、アプリケーション用に設定されました。 アプリのアドオンは、次のコマンドで一覧表示できます。
$ heroku addons
このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスするたびにログメッセージが生成され、Papertrail のアドオンに送られます。 Papertrail のコンソールにアクセスし、ログメッセージを確認します。
$ heroku addons:open papertrail
ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。このインターフェースでは、検索したり通知を設定したりできます。
コンソールを起動する
One-off dyno で、heroku run
コマンドを使ってコマンド (通常はアプリの一部を構成するスクリプトやアプリケーション) を実行できます。アプリの環境で試行するためにローカルターミナルにアタッチされた REPL プロセスを起動することもできます。
$ heroku run python manage.py shell
Running python manage.py shell on ⬢ serene-caverns-82714... up, run.9594 (Eco)
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Error connecting to process
というエラーが表示された場合は、ファイアウォールを設定します。
アプリとアプリのすべての依存関係の環境で Python シェルが実行されます。ここから、一部のアプリケーションファイルをインポートできます。 たとえば、次のコードを実行できます。
>>> import requests
>>> print(requests.get('https://httpbin.org/status/418').text)
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
Python シェルを終了するには、exit()
コマンドを実行します。
別の例を試してみましょう。別の One-off dyno を作成し、bash
コマンドを実行して、その dyno でシェルを開きます。シェルが開いたら、そこでコマンドを実行できます。それぞれの dyno には専用の一時的ファイル領域があり、アプリとその依存関係が入力されています。コマンドが完了したら (このケースでは bash
)、dyno が終了します。:
$ heroku run bash
Running bash on ⬢ serene-caverns-82714... up, run.3789 (Eco)
~ $ ls
app.json gettingstarted hello manage.py Procfile Procfile.windows README.md requirements.txt runtime.txt staticfiles
~ $ exit
exit
必ず exit
と入力してシェルを閉じ、dyno を終了してください。
環境設定を定義する
Heroku では、暗号鍵や外部リソースのアドレスなどのデータを環境設定に保存して、設定を外部に置くことができます。
環境設定は、ランタイムに環境変数としてアプリケーションに提供されます。
hello/views.py
を編集します。ファイルの先頭に、os
モジュールをインポートする行を追加します。
import os
from django.http import HttpResponse
index
メソッドを編集し、環境変数 TIMES
の値に応じてあるアクションを繰り返し実行するようにします。
def index(request):
times = int(os.environ.get('TIMES', 3))
return HttpResponse('Hello! ' * times)
heroku local
は、ローカルディレクトリにある .env
ファイルの内容に応じて、環境を自動的に設定します。 サンプルプロジェクトのトップレベルディレクトリにはすでに .env
ファイルがあり、以下の行が含まれています。
TIMES=2
heroku local --port 5001
でアプリを実行し、http://localhost:5001 にアクセスすると、「Hello!」が 2 回表示されます。
Heroku で環境設定を設定するには、次のコマンドを実行します。
$ heroku config:set TIMES=2
heroku config
を使用して、アプリの環境設定を表示します。
$ heroku config
=== serene-caverns-82714 Config Vars
PAPERTRAIL_API_TOKEN: <SECRET_TOKEN>
TIMES: 2
このアクションの変更を確認するには、変更したアプリケーションを Heroku にデプロイします。
データベースをプロビジョニングして使用する
add-on marketplace には、Redis や MongoDB、Postgres、MySQL など、多数のデータストアが揃っています。
essential-0
Postgres のサイズのコストは月額 5 ドルで、分単位で課金されます。このチュートリアルの最後で、データベースを削除して、コストを最小限に抑えるように求められます。
essential-0
Heroku Postgres アドオンをプロビジョニングするには、addons:create
コマンドを使用します。
$ heroku addons:create heroku-postgresql:essential-0
Creating heroku-postgresql:essential-0 on ⬢ serene-caverns-82714... ~$0.007/hour (max $5/month)
Database should be available soon
postgresql-aerodynamic-21282 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-aerodynamic-21282 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
CLI で addons
コマンドを使うと、アプリにプロビジョニングされたデータベースの詳細について確認できます。
$ heroku addons
Add-on Plan Price State
──────────────────────────────────────────────── ─────────── ──────── ───────
heroku-postgresql (postgresql-aerodynamic-21282) essential-0 $5/month created
└─ as DATABASE
...
アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL
) が表示されます。
$ heroku config
=== serene-caverns-82714 Config Vars
DATABASE_URL: postgres://emhmpvrhtwgqhx:<PASSWORD>@ec2-52-205-45-222.compute-1.amazonaws.com:5432/daacqaueosis8n
...
Heroku には、さらに詳細を表示する pg
コマンドもあります。
$ heroku pg
=== DATABASE_URL
Plan: Essential 0
Status: Available
Connections: 0/20
PG Version: 15.5
Created: 2024-05-01 13:22 UTC
Data Size: 7.5 MB/1.00 GB (0.73%) (In compliance)
Tables: 0
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-aerodynamic-21282
この情報は、essential-0
データベースが Postgres v15.5 を実行しており、テーブルがないことを示しています。
デプロイしたサンプルアプリにはすでにデータベース機能が備わっていますが、それを有効にするには、2 つの小さな変更を行う必要があります。
まず、requirements.txt
ファイルの末尾にある 2 行の psycopg
のコメントを解除します。
psycopg[c]; sys_platform == "linux"
psycopg[binary]; sys_platform != "linux"
これらの行により、ビルド時に、Postgres データベースアダプターパッケージがインストールされます。
次に、Procfile
ファイルの末尾にある release
プロセス行のコメントを解除します。
release: ./manage.py migrate --no-input
この release
プロセスエントリによって、Heroku リリースフェーズ機能が有効になり、それを使用して、アプリのデプロイ時に常に Django データベース移行が実行されます。
前と同じデプロイプロセスを使用して、変更したアプリケーションを Heroku にデプロイします。ビルド後に Django のデータベース移行が実行されることを確認できます。
remote: Running release command...
remote:
remote: Operations to perform:
remote: Apply all migrations: auth, contenttypes, hello, sessions
remote: Running migrations:
remote: Applying contenttypes.0001_initial... OK
remote: Applying contenttypes.0002_remove_content_type_name... OK
remote: Applying auth.0001_initial... OK
remote: Applying auth.0002_alter_permission_name_max_length... OK
remote: Applying auth.0003_alter_user_email_max_length... OK
remote: Applying auth.0004_alter_user_username_opts... OK
remote: Applying auth.0005_alter_user_last_login_null... OK
remote: Applying auth.0006_require_contenttypes_0002... OK
remote: Applying auth.0007_alter_validators_add_error_messages... OK
remote: Applying auth.0008_alter_user_username_max_length... OK
remote: Applying auth.0009_alter_user_last_name_max_length... OK
remote: Applying auth.0010_alter_group_name_max_length... OK
remote: Applying auth.0011_update_proxy_permissions... OK
remote: Applying auth.0012_alter_user_first_name_max_length... OK
remote: Applying hello.0001_initial... OK
remote: Applying sessions.0001_initial... OK
remote: Waiting for release.... done.
ビルドが settings.DATABASES is improperly configured
エラーで失敗した場合は、デプロイの前にデータベースアドオンをプロビジョニングしていることを確認します。
アプリの URL にアクセスし、/db
を追加して、データベースデモンストレーションページにアクセスします。 たとえば、アプリが https://serene-caverns-82714.herokuapp.com/
にデプロイされている場合は、https://serene-caverns-82714.herokuapp.com/db
にアクセスします。
再度 /db
ルートにアクセスすると、アクセスするたびにシンプルなページの更新が表示されます。
Page View Report
Dec 7, 2023, 4:57 p.m.
Dec 7, 2023, 4:58 p.m.
データベースにアクセスするためのコードは簡単です。これは Greetings
というシンプルな Django モデルを使用しており、hello/models.py
にあります。
アプリの /db
ルートにアクセスするたびに hello/views.py
ファイル内の次のメソッドが呼び出され、挨拶が作成されます。次に、既存のすべての挨拶がレンダリングされます。
def db(request):
greeting = Greeting()
greeting.save()
greetings = Greeting.objects.all()
return render(request, 'db.html', {'greetings': greetings})
Postgres がローカルでインストールされている場合、heroku pg:psql
コマンドを使ってリモートデータベースに接続し、すべての行を表示します。
$ heroku pg:psql
--> Connecting to postgresql-cubed-97628
...
Type "help" for help.
serene-caverns-82714::DATABASE=>
詳細は、「Heroku PostgreSQL」を参照してください。
同様のテクニックを使用して、MongoDB または Redis アドオンをインストールできます。
次のステップ
ここまで、アプリのデプロイ、アプリの設定変更、ログの表示、スケール、アドオンのアタッチを行う方法を説明しました。
次にお勧めするリソースを紹介します。
- 「Heroku の仕組み」では、アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
- 既存の Python または Django アプリを Heroku にデプロイするには、「Heroku での Python および Django アプリのデプロイ」を参照してください。
- Python アプリケーションの開発とデプロイの詳細については、Python カテゴリを参照してください。
コストを抑制するために、チュートリアルを完了したらすぐにサンプルアプリを削除し、データベースも削除してください。
アプリとアドオンを削除する
アカウントからアプリとデータベースを削除します。使用したリソースに対してのみ課金されます。
この操作により、アドオンとデータベースに保存されたすべてのデータが削除されます。
$ heroku addons:destroy heroku-postgresql
▸ WARNING: Destructive Action
▸ This command will affect the app serene-caverns-82714
▸ To proceed, type serene-caverns-82714 or re-run this command with
▸ --confirm serene-caverns-82714
>
この操作により、アプリケーションが完全に削除されます。
$ heroku apps:destroy
▸ WARNING: This will delete ⬢ serene-caverns-82714 including all add-ons.
▸ To proceed, type serene-caverns-82714 or re-run this command with
▸ --confirm serene-caverns-82714
>
以下のコマンドによって、アドオンとアプリが消去されたことを確認できます。
$ heroku addons --all
$ heroku apps --all