本記事では、Djnagoで作成したアプリケーションとGoogleが提供する Cloud SQL (MySQL)を連携させる方法をご紹介いたします。
・DjangoアプリケーションをGCPにデプロイするための準備
・データベース作成
・データベースとの連携
Djangoフレームワークで作成したWebアプリケーションを、GAE(Google App Engine)にデプロイすると共に、データベース連携も行う方法を画像多めでご紹介していきます。
準備
開発環境下では、ローカルPCにインストールしたデータベースに接続して動作確認をしますが、アプリを本番環境にデプロイする際には、本番環境のデータベースとの連携も考える必要があります。
今回はGoogleが提供するGAE(Google App Engine)にアプリケーションをデプロイしますので、同じくGoogleのデータベースである Cloud SQL(MySQL)と連携していきます。その為にいくつか行わなければならない作業がありますので、順次行っていきましょう!
Cloud SQL Admin APIの有効化

このような画面に遷移します。ここでAPIを有効化するプロジェクトを選択します(プロジェクトの作成方法はこちらでご紹介しています)。
表示されている文を拡大してみます。
-1024x232.png)
「APIを有効化しようとしているプロジェクトは’cafe-project-377203’で合ってますか?」と書かれています。合っているか確認し、もし違う場合はプロジェクトを選択し直しましょう。

合っていれば「次へ」をクリックします。

「有効にする」をクリックして、APIを有効化します。
OAuth同意画面の構成

GCPの右側のメニュー一覧から「APIとサービス」をクリックします。

移動した後、右側のメニューから「認証情報」をクリックします。すると上図のような画面が表示されます。
「必ずアプリケーションに関する情報を使用して OAuth 同意画面を構成してください。」と表示があるかと思いますので、右側の「同意画面を構成」をクリックしてください。

このようなUser Typeを選択する画面が表示されます。何かしらの組織の中で作成する場合でなければ「外部」を選択し、「作成」をクリックしましょう。


- アプリ名
- ユーザーサポートメール
- メールアドレス
をそれぞれ入力します。これらは必須項目なのですが、必要でしたらそれ以外も適宜入力してください。


スコープの設定画面に遷移します。特に必要がなければ「保存して次へ」をクリックします。

アプリケーションの公開ステータスが「テスト」の場合にアクセスできるユーザーをここで設定します。先ほど設定した「User Type」が ‘外部’ の場合はテストユーザーを追加しましょう。
アプリケーションの公開ステータスの確認方法

「APIとサービス」ページの「OAuth 同意画面」にて確認およびステータスの変更ができます。
これにてOAuth同意画面の作成が完了しました!
ここまでの設定は「OAuth同意画面」の「アプリを編集」をクリックすることで再設定することができます。

gcloudにログインする
Cloud SQL Admin API を使用するために、新しい認証情報を取得します。下記のコマンドを実行しましょう。
(venv)$ gcloud auth application-default login
するとブラウザにて自動でログイン画面が現れるかと思います。

ご自身のアカウントを選択しましょう。

リクエスト許可画面が現れるので、「許可」をクリックしましょう。
Cloud SQL Proxy をインストール
Cloud SQL に接続するための Cloud SQL Auth Proxy をインストールします。
上記のリンクを参考に、OSに合わせたコマンドを実行します。

Mac M1の場合はこんな感じです。
(venv)$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.arm64
(venv)$ chmod +x cloud_sql_proxy
Windows64ビットの場合
https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe
こちらを右クリックして「名前をつけてリンク先を保存」を選択しダウンロードします。ファイル名を「cloud_sql_proxy.exe」に変更します。
データベース構築
次は、アプリケーションと連携するデータベース(Cloud SQL)の構築を行います。スペックにも寄りますが、データベースの維持にはそれなりの費用がかかりますので、必要でなくなったら削除しましょう。

消し忘れてそれなりに請求がきたこともあります、、、。
GCPのコンソール画面から簡単に作成することができます。


GCPのコンソール画面にて、左のメニューから「SQL」をクリックします。


SQLのトップページに遷移します。「インスタンスを作成」をクリックしてインスタンスを作成します。


インスタンスの種類をここで選択します。今回は「MySQL」を使用します。
選択した後にこのような「Compute Engine APIを有効にする必要があります。」という画面に遷移する場合があります。


指示通りAPIを有効にしましょう。(※左上のインスタンスの種類が「PostgreSQL」なのは気にしないでください、、。)


インスタンスの設定画面に移動します。まず任意の「インスタンスID」と「パスワード」を入力します。ここで入力したパスワードは控えておきましょう。
また画面下部にて「リージョン」「インスタンスのカスタマイズ」を行うことができます。


「リージョン」は asia-northeast1(東京)を選択しましょう。
「構成オプションを表示」をクリックすると、インスタンスのスペックのカスタマイズを行うことができます。


それぞれの項目は下記のように設定しています。
マシンタイプ


選択肢はこの4種類です。
今回はコストが一番低い「共有コア」の「1 vCPU、0.614 GB」を選択しています。


ストレージ


ストレージの種類はこのようにしています。やはり性能よりローコスト優先で設定しています。ストレージ容量は後から減らすことはできないので、初めは少なめで、適宜増やすのがいいかと思います。
接続


Cloud SQL Proxy を使用して接続するので「パブリック IP」を選択しています。
それ以外はデフォルトでいいかと思います。
これにてデータベースのインスタンスが作成できました。
インスタンスが作成できたら、ユーザーを作成します。


インスタンスの画面上にて「ユーザー」→「ユーザーアカウントを追加」の順でクリックしましょう。


任意の「ユーザー名」「パスワード」を入力し「追加」ボタンを押してユーザーを追加しましょう。ここで作成したユーザー名とパスワードは後で使用するので控えておきましょう。
続いてデータベースの追加をします。


インスタンス画面にて「データベース」→「データベースの作成」の順でクリックします。


任意のデータベース名を入力し、「作成」ボタンでデータベースを作成しましょう。
これにてデータベースのセッティングは終了です!
settings.pyの編集
Djangoプロジェクトの設定ファイル settings.py にて、ここまでに作成したデータベースと連携するための設定を追加します。
settings.py のデータベース設定を下記のようにします。
import os
if os.environ.get('GAE_APPLICATION', None):
# 本番環境(GCP)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '<データベース名>',
'USER': '<ユーザー名>',
'PASSWORD': '<ユーザーのパスワード>',
'HOST': '/cloudsql/<インスタンスの接続名>',
}
}
else:
# 開発環境
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '<データベース名>',
'USER': '<ユーザー名>',
'PASSWORD': '<ユーザーのパスワード>',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
if os.environ.get(‘GAE_APPLICATION’, None) によって、本番環境と開発環境でのデータベース設定を分岐させています。
- データベース名
-
作成したデータベース名を記述(インスタンス名ではありません)。
- ユーザー名
-
データベース作成後に追加したユーザーの名称
- ユーザーのパスワード
-
データベース作成後に追加したユーザーのパスワード
- インスタンスの接続名
-
GCPコンソール上にて、インスタンスのトップページより確認できます。
settings.pyでのデータベースの設定は以上です。
しかし、settings.py内にユーザー名やパスワードなどを直接記述するのは、セキュリティの観点から好ましくありません。機密情報などを環境変数として外部ファイルから読み取る方法をこちらで紹介しております。


マイグレーション
現在、GCP上にデータベースを構築しましたが、アプリケーション用のテーブル構造になっていません。本番運用する前に開発環境でマイグレーションを行い、テーブルを作成する必要があります。
今回 MySQL を使用するために、下記の2つをインストールする必要があります。



コマンド順に実行してください。
(venv)$ brew install mysql
(venv)$ pip install mysqlclient
これらが終了したら、忘れずに requirements.txt も更新しておきましょう。
(venv)$ pip freeze > requirements.txt
続いてローカル環境から Cloud SQL に接続するのですが、そのためには先ほどインストールした Cloud SQL Proxy を起動させる必要があります。
別のターミナルにて Cloud SQL Proxy があるディレクトリに移動し、下記のコマンドを実行しましょう。<インスタンスの接続名>には、先ほど settings.py に記述したものと同じのを代入してください。
$ ./cloud_sql_proxy -instances="<インスタンスの接続名>"=tcp:3306
起動に成功するとこのようにターミナルに表示されます(「Ctrl + C」で停止できます)。


この状態で下記のコマンドを実行し、マイグレーションを行います。
(venv)$ python manage.py makemigrations
(venv)$ python manage.py migrate
このような表示がでてくればマイグレーション完了です。


これで無事に、本番環境で連携するデータベースにテーブルが作成されました!
デプロイ
準備が整ったので実際にデプロイしましょう。
デプロイする際には app.yaml が必要です。こちらで解説しています。
(venv)$ gcloud app deploy --project=<プロジェクトID>
06-300x158.png)
06-300x158.png)
お疲れ様でした!
まとめ
本記事では、DjangoアプリケーションをGCPの MySQL と連携し、デプロイするまでをご紹介させていただきました。
再度になりますが、データベースは作成した時点から料金が発生しますので、必要なければ適宜削除するようにしましょう!
お疲れ様でした!
コメント
コメント一覧 (1件)
[…] DjangoアプリケーションとCloud SQL(MySQL)の連携 本記事では、Djnagoで作成したアプリケーションとGoogleが提供する Cloud SQL […]