App Engine + Cloud SQL + Django でWebアプリ作成(環境構築編)



PythonのフレームワークであるDjangoを使ってWebアプリケーションを作りたかったので、Google App Engine を使って環境を構築してみました。

Google App Engine はGCPのPaaSのサービスで、アプリの作成もメンテナンスも簡単でスケーリングもしてくれるので、メンテナンスが必要なくなるといった特徴があります。


*環境

  • MacOS
  • Python 2.7.14
  • Django 1.11.16
  • Google Cloud SDK 220.0.0


*参考



*プロジェクトを作成

GCPコンソール画面から、今回作成するWebアプリ用のプロジェクトを作成します。















作成したプロジェクトをセットしておきます。
$ gcloud config set project {作成したプロジェクトID}


*Cloud SDKインストール

GCPのコマンドを使うための Cloud SDK をインストールします。
下記コマンドを実行します。
$ curl https://sdk.cloud.google.com | bash

$ exec -l $SHELL
初期設定をします。
$ gcloud init

# 情報の確認
$ gcloud info


*Django アプリをクローン

Django 用にサンプルのアプリが提供されているのでクローンします。
$ git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

クローンしてきたら、アプリのディレクトリへ移動します。
このディレクトリ配下に設定ファイルがあります。
$ cd python-docs-samples/appengine/standard/django


*SQLプロキシをインストール

Cloud SQL Proxy を使って Cloud SQL のインスタンスにアクセスします。Proxy をローカル環境で実行することによって、Cloud SQL に安全にアクセスすることができるようになります。

下記コマンドでインストールし、プロキシを実行できるように権限を付与します。
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64

$ chmod +x cloud_sql_proxy


*Cloud SQL インスタンスを作成

GCPコンソール画面から Cloud SQL の MySQL インスタンスを作成します。
第1世代と第2世代がありますが、今回は最新の第2世代を使います。






































MySQL インスタンスの作成ができたら下記コマンドを実行して設定をします。
$ gcloud sql instances describe {作成したCloud SQLインスタンス名}

Cloud SQL インスタンスを初期化します。
しばらく時間がかかるので実行させたままにしておきます。
$ ./cloud_sql_proxy -instances="{プロジェクト名}:{リージョン}:{Cloud SQLインスタンス名}"=tcp:3306


*データベースの作成

GCPコンソールからデータベースを作成します。
ローカル環境でMySQLクライアントを使って行うこともできるようですが、うまくいかなかったのでGCPコンソールから行いました。














次にデータベースの設定をします。
~/python-docs-samples/appengine/standard/django配下にあるmysite/settings.py<your-database-user><your-database-password>があるので、作成したユーザーに変更します。
(それぞれ2箇所あります)
# [START db_setup]
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'):
    # Running on production App Engine, so connect to Google Cloud SQL using
    # the unix socket at /cloudsql/<your-cloudsql-connection string>
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '/cloudsql/<your-cloudsql-connection-string>',
            'NAME': 'polls',
            'USER': '<your-database-user>',
            'PASSWORD': '<your-database-password>',
        }
    }


*ローカル環境でアプリを実行

~/python-docs-samples/appengine/standard/djangoの配下でWebアプリを実行するための環境を構築します。
# 仮想環境作成
$ virtualenv env
$ source env/bin/activate

# 依存関係をインストール
$ pip install -r requirements-vendor.txt -t lib/
$ pip install -r requirements.txt

モデルの設定をするために、下記コマンドを実行してマイグレーションします。
今回はpollsというデータベースに対してマイグレーションしていますが、適宜置き換えてください。
$ python manage.py makemigrations
No changes detected

$ python manage.py makemigrations polls
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Choice
    - Create model Question
    - Add field question to choice


# マイグレーションを実行
$ python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  ...


*Webアプリをローカルで起動

下記コマンドを実行してローカル環境のWebサーバを起動します。
$ python manage.py runserver

下記URLにアクセスするとHello worldのページが表示されます。
http://localhost:8000











*Django管理コンソールにアクセス

Djangoには管理コンソールがデフォルトで提供されていて、 管理コンソールからモデルの追加や変更をすることができます。
下記コマンドでユーザーを作成します。ユーザー名は何も入力しなければデフォルト値が入ります。メールアドレスは任意ですが、パスワードは必須です。
$ python manage.py createsuperuser
Username (leave blank to use 'XXXXXX'):
Email address:
Password:
Password (again):

Superuser created successfully.

Webサーバを起動します。
$ python manage.py runserver
下記にアクセスして作成したユーザーとパスワードでログインすると、管理サイトが表示されます。
http://localhost:8000/admin/












*Webアプリを App Engine で起動

デプロイをするために、下記コマンドを実行して静的ファイルを1つのフォルダにまとめます。
$ python manage.py collectstatic

ちなみにフォルダの設定はmysite/settings.pySTATIC_ROOTで変更することができます。(デフォルトはstaticになっています。)

app.yamlが存在するディレクトリ(今回は~/python-docs-samples/appengine/standard/django)で下記コマンドを実行してデプロイをします。
ロケーションを聞かれたので、東京リージョンを選択しておきました。
続けるかの質問にY + Enterを入力するとデプロイが実行されます。
$ gcloud app deploy

Please choose the region where you want your App Engine application
located:
[1] asia-northeast1 (supports standard and flexible)
...

# ロケーションを入力
Please enter your numeric choice:  1

# Yを入力
Do you want to continue (Y/n)?  Y

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 3477 files to Google Cloud Storage             ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.


GCPコンソールから App Engine のページでデプロイされたことが確認できます。









下記にアクセスすると先ほどローカルで実行して表示されたHello worldの画面が表示されます。
(GCPコンソールからリンクをクリックするとアクセスできます。)
https://{自分のプロジェクトID}.appspot.com












*所感

GCPの公式ドキュメントの通りにすすめれば環境を構築できたので、非常に便利だと感じました。ただ、今後設定などを変更したくなったときのために、コマンドや設定の意味をしっかり理解しておこうと思います。
これから画面や機能の開発を進めていきます。