【GoogleCloud】AppEngineにPythonでDjangoをデプロイする。

localhost:8080で動かす方法はみんな解説してくれるのに、何故かそれをサーバーにデプロイする工程を誰も教えてくれない。。。 とっても苦戦して、なんとかデプロイ達成したのでこれを解説します。

※概念的な説明をします。

具体的にどう書くかは都度考えたり調べたりする必要があります。

使うもの

前提レベル

ls dir cd とかのコマンドでカレントディレクトリを移動できる。 困ったときはChatGPTとかGeminiとかのAIに聞く。 エラーが出ても諦めない。

はじめ

僕の端末はMacなのでbrewを使ってインストールしました。

brew install python3

Python3を入れると、pip3コマンドが使えるようになります。

pip3 install django

こんな感じのコマンドでdjangoをインストールします。

brewを使ったせいかパスが通ってなかったので、ユーザーフォルダ下の .zshrc ファイル(なければ作成。隠しファイルなので、表示するにはcommand + shift + . )に次の一行を追加しました。

export PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin:$PATH"

このPythonFrameworkのbinファイルがどこにあるかは環境やインストール方法によるので探してみてください。

また、Windowsや古いMacだとコマンドプロンプトのシェルがbashとかだと思うので、そちらのパスの通し方を調べてみてください。

パスが通ったら、

cd desktop

django-admin startproject ProjectName

※ProjectNameは作りたいプロジェクト名でOKです。 ※アプリ名はまた後で作成します。

別にデスクトップじゃなくてもいいですが、とりあえずdesktopでやります。

「ProjectName」フォルダがデスクトップに作成されます。

これでDjangoプロジェクトが作成できました。

デプロイするときはこのフォルダの中身をアップロードするようなイメージです。

できたフォルダ、是非開いて「こんな形になってるんだ」というのを確認してください。とりあえず、これが丸ごと一つのDjangoプロジェクトという認識です。

ここにある、manage.pyというやつがこのプロジェクトに関するコマンドを持ってるっぽいです。

cd ProjectName

python3 manage.py startapp myapp

※myappは作りたいアプリ名でOKです。

これでプロジェクトの中にmyappというアプリができました。

python3 manage.py runserver

と打つと、ローカルホストサーバーが立ち上がります。

http://localhost:8000/

とまあ、ここまでは基本的なDjangoの建て方ですね。

ここから先を誰も教えてくれなかったんだ。。。

デプロイ

サーバーにアップロードして公開する事をデプロイと言うっぽいです。

今回はGoogleCloudのAppEngineにアップロードします。

基本的にはデプロイまでの案内はサーバー側の説明にあるので、案内に従って設定してあげてください。

案内に従うと、gcloud CLIが必要になります。

インストールするとgcloudコマンドとgsutilコマンドが使えるようになります。

cloud.google.com

いい感じにインストールしてあげてください。

終わったら、

gcloud init

で、イニシャライズします。出てきた内容をよく読んで、自分のGoogleアカウントにログインしてください。

その後、今回使っているGoogleCloudのプロジェクトを1,2,3...とかの数字で選ぶような画面があったと思います。なんとか上手いことやってください。

ミスったときはまた gcloud init で再ログインとか再設定ができます。

gcloudコマンドが使えるようになったらデプロイをやります。

今回のプロジェクトフォルダのルートディレクトリで...

gcloud app deploy

と行きたいところですが、これは失敗します。

はい設定が必要でした。ここのところなんで誰も解説してくれないの。

公式では、サンプルプロジェクトをデプロイする方法の案内があったので、そのサンプルプロジェクトの中身を見てみました。

んで、デプロイコマンドを打ったエラー文を読むと、まずはapp.yamlが必要らしいです。

app.yamlファイルをProjectNameフォルダの中に作成して、中身を手書きします。

runtime: python312

entrypoint: gunicorn -b :$PORT ProjectName.wsgi:application

runtime_config:

operationg_system: "ubuntsu22"

runtime_version: "3.12"

こういうのは改行とかインデント(列の頭のスペース)が大事なので気をつけてください。 ※ブラウザの表示次第で行が崩れてる可能性あります

自分はhelloWorldサンプルプロジェクトの中にあったやつをコピーして改変しました。

まず runtime: python312 これはPython3.12バージョンを使うと言う意味です。まあ一番新しいバージョンを使いましょう

次に entrypoint: gunicorn -b :$PORT ProjectName.wsgi:application

※ProjectNameのところは自分で設定したものに合わせてください。

これはデプロイした瞬間にサーバー上でコマンドが走らせるためのものらしいです。

gunicorn というコマンドを使ってwsgiファイルの中のapplicationという部分を設定する?使う?らしいです。

wsgiファイルは最初から生成されてました。 名前の感じから推測するに、多分CGIファイル的なものなんじゃないかなという気がします。知らんけど。

まだまだ作業があります。この段階でデプロイしようとするとgunicornがないとか言われます。

プロジェクトのルートフォルダで

pip3 freeze > requirements.txt

コマンドを打ちます。これで今使っているライブラリ一覧をこの名前のファイルに書き出せます。ファイル名を間違えないように気をつけてください。

この中には多分djangoとgunicornがあれば大丈夫です。

なければpip3でそれをインストールしてからもう一回書き出しですかね。多分。

これで、デプロイはできるようになったと思います。

一応デプロイしてみますか。 プロジェクトルートフォルダで

gcloud app deploy

多分行ける気がします。

デプロイできたら

gcloud app browse とかで開けるよみたいなことが書いてあると思います。

ダメそうだったらエラー文をよくみてなんとかしてください。

あと何故か初回だけダメな時とかもありました。何回かトライしてみてください。

権限がダメとか言われる時もあるので、一応GoogleCloudのIAMから権限を確認してください。 オーナーにしておけば多分一番強いです。

こういう時にChatGPTとかGeminiとかに聞くと助けてくれます。

エラー文そのまま入れても日本語で返してくれないので、「日本語で説明して」とかいうと良いです。

502エラー

さて、まだエラーは残っています。 デプロイできたはいいものの、中身とURLが対応してないのでバグります。

manage.pyを見ると、 ProjectName.pyとかいうファイルが指定されてます。これをみてみます。

INSTALLED_APPS = []

のリストがあるので、とりあえずここに自分が作ったアプリ名を入れます。「'myapp',」

どうやらこのプロジェクトはまだ'myapp'の存在を認識してないようです。

URLはurls.pyファイルが管理しているっぽいのでここをみます。

admin用のURLがあると思いますが、デフォルトのURLは多分正しくないやつがいるので

まずimport を並べているところに

import myapp.views

Pathのリストのところに

path('', myapp.views.index),

と記述します。Pythonの書き方全然覚えていなかったけど、Pythonってやっぱ簡単そうですね。

この書き方、myappフォルダのviews.pyの中のindexを指定してるらしいので、これを設定しに行きます。

views.pyフォルダ、ほぼ空っぽなので

from django.http import HttpResponse

def index(request):

return HttpResponse("Hello, World. This is Django running on Google App Engine")

これを追記してあげてください。 helloWorldサンプルから持ってきたやつです。へぇーこうやって書くんやと思いながら引っ張ってきました。

これでデプロイすると、502エラーからdjangoエラーに変わります。

gcloud app browse でみてみると、DisallowedHostと書いてあります。

どうやら、実際に使うときのURLをALLOWD_HOSTS = のリストの中に書き込まなきゃいけないみたいです。

これはsettings.pyの中にあるやつです。

ここのALLOWD_HOSTS=に書き足して

ALLOWD_HOSTS = ['実際に使うURL.com']

とします。文字列なので''クオーテーションも忘れずに。

GCPのURLなら'GCPプロジェクトの名前.an.r.appspot.com'みたいな感じになってました。

このURLを複数指定する場合は['one.com','two.com','three.com',]みたいな感じでカンマ区切りしてあげてください。

URLに制限をかけない場合は['*']として、アスタリスクを打ち込むのもアリです。ワイルドカード

おめでとう

ここまでくればデプロイ完了です。 あとはDjangoの使い方とかHttpリクエストの処理方法とかを構築していって、必要に応じてURLのところを書き足していったりしていろいろやってみてください。

なかなか長い戦いでした。ありがとうGemini。あとここまで読んでトライしてみた閲覧者さんもナイスです。