DjangoアプリケーションとCloud SQL(MySQL)の連携

本記事では、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の有効化

STEP
APIを有効化

こちらにアクセスします。

「APIを有効にする」をクリックします。

STEP
プロジェクトの選択

このような画面に遷移します。ここでAPIを有効化するプロジェクトを選択します(プロジェクトの作成方法はこちらでご紹介しています)。

表示されている文を拡大してみます。

「APIを有効化しようとしているプロジェクトは’cafe-project-377203’で合ってますか?」と書かれています。合っているか確認し、もし違う場合はプロジェクトを選択し直しましょう。

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

STEP
API有効化

「有効にする」をクリックして、APIを有効化します。

OAuth同意画面の構成

STEP
認証情報ページに移動

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

移動した後、右側のメニューから「認証情報」をクリックします。すると上図のような画面が表示されます。

「必ずアプリケーションに関する情報を使用して OAuth 同意画面を構成してください。」と表示があるかと思いますので、右側の「同意画面を構成」をクリックしてください。

STEP
User Typeの選択

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

STEP
アプリ情報
  1. アプリ名
  2. ユーザーサポートメール
  3. メールアドレス

をそれぞれ入力します。これらは必須項目なのですが、必要でしたらそれ以外も適宜入力してください。

STEP
スコープの設定

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

STEP
テストユーザーの設定

アプリケーションの公開ステータスが「テスト」の場合にアクセスできるユーザーをここで設定します。先ほど設定した「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のコンソール画面から簡単に作成することができます。

STEP
DBインスタンスの作成

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

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

STEP
インスタンスの種類選択

インスタンスの種類をここで選択します。今回は「MySQL」を使用します。

選択した後にこのような「Compute Engine APIを有効にする必要があります。」という画面に遷移する場合があります。

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

STEP
インスタンスの設定

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

また画面下部にて「リージョン」「インスタンスのカスタマイズ」を行うことができます。

「リージョン」は asia-northeast1(東京)を選択しましょう。

「構成オプションを表示」をクリックすると、インスタンスのスペックのカスタマイズを行うことができます。

それぞれの項目は下記のように設定しています。

マシンタイプ

選択肢はこの4種類です。

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

ストレージ

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

接続

Cloud SQL Proxy を使用して接続するので「パブリック IP」を選択しています。

それ以外はデフォルトでいいかと思います。

これにてデータベースのインスタンスが作成できました。

STEP
ユーザーの作成

インスタンスが作成できたら、ユーザーを作成します。

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

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

STEP
データベースの追加

続いてデータベースの追加をします。

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

任意のデータベース名を入力し、「作成」ボタンでデータベースを作成しましょう。

これにてデータベースのセッティングは終了です!

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>

お疲れ様でした!

まとめ

本記事では、DjangoアプリケーションをGCPの MySQL と連携し、デプロイするまでをご紹介させていただきました。

再度になりますが、データベースは作成した時点から料金が発生しますので、必要なければ適宜削除するようにしましょう!

お疲れ様でした!

案件、ありますか?

「メインの仕事があるけれど、週1、2日だけできる仕事ないかな、、、」

「ある程度スキルが身に付いてはきたけど、そのスキルを活用できる場が欲しい」

なんて悩みが以前はありました。

自分で仕事を探しに行くのも大事ですが、蛇の道は蛇。その道の人に頼むことで、自分だけでは見つからないような案件に携わることができます。

IT PRO パートナーズでは、簡単に無料でアカウントを登録でき、さらにはエージェントさんに希望の働き方・案件の種類を提示することでお仕事を紹介してくれます!

登録自体も非常に簡単で、「エージェントさんとの面談を希望する」という欄にチェックをするだけで、エージェントさんから直接連絡をいただくことができます。

驚くほど簡単で正直拍子抜けしてしまいました笑

もしお仕事探しに困っておりましたら、一度登録し案件を眺めてみることをおすすめします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

勤めていた設計会社を退社し、フリーランスとして活動しています
また、趣味で主にpyhonを用いて機械学習を行なっています!
現在競艇の予測モデルの開発中です。

コメント

コメント一覧 (1件)

コメントする

目次