こんにちはKYエンジニアです。
本日はGCP(Google Cloud Platform)のRDBサービスであるCloud SQLを使ってみます。
前回紹介した内容の続きになっているので、ハンズオン試してみる方はまずは以下の記事からご確認ください。
1. Cloud SQLとは
Cloud SQL は、ローカル MySQL、PostgreSQL、SQL Server データベースの代替となるクラウドベースのサービスです。Cloud SQLでは、自動バックアップ、ストレージの自動増量、メンテナンス等DBを運用する上で面倒な部分をGCP側が対応してくれます。
以降ではApp Engineとの連携についてハンズオン形式で解説していきます。
2. Cloud SQL(MySQL)とApp Engineの連携
2.1 Cloud SQL連携のための事前準備
Cloud SQLと連携するためにCloud SQL Auth Proxyを使う必要があります。では設定方法について解説していきます。
◆Cloud SQL Admin APIの有効化
まずは上記リンク内の以下の部分をクリックしてCloud SQL Admin API を有効にします。
ボタンをクリックすると以下のページに飛ぶので、使用しているgcpプロジェクトを選択します。
続行をクリックすると以下の画面になります。
スクロールダウンすると以下の画面が表示されるので、以下赤枠の二つを選択して次へをクリックします。
次へをクリックすると、以下の画面が表示されるので完了をクリックするとAPIの有効化は完了です。
◆gcloudにログインする
Cloud SQL Admin API を使用するために、新しい認証情報を取得します。以下のコマンドを実行してください。
(venv)$ gcloud auth application-default login
◆Cloud SQL Proxy のインストール
続いてCloud SQL Auth Proxyをダウンロードしてインストールしていきます。各OSに合わせて以下のコマンドをターミナル上に入力します。
macOS64ビットの場合
(venv)$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
(venv)$ chmod +x cloud_sql_proxy
Windows64ビットの場合
を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名を cloud_sql_proxy.exe に変更します。
2.2 DBインスタンスの作成
以下のようにGCPコンソール画面よりSQLを選択します。
SQLを選択したらインスタンスの作成をクリックします。
今回はデータベースエンジンとしてMySQLを選択します。
次にCompute Engine APIを有効化をしていない方は、有効化の画面が表示されますので有効化してください。
以下の画面でインスタンスの設定をしていきます。インスタンスIDは任意名を入力してください。パスワードについては控をとっておいてください。
スクロールダウンして以下のようにリージョンとゾーンを以下のように設定します。本番環境では、複数のゾーン(高可用性)の方が障害に強いためベターですが、コストが高くなるので今回はシングルゾーンとします。
さらにスクロールダウンしていくとインスタンスをカスタマイズできます。
マシンタイプでメモリを選択できるので、一番コストの低い共有コア 1 vCPU 0.614GBとします。
ストレージはSSD(推奨)の10GBを選択し、ストレージの自動増量を有効にします。ストレージ容量は後から減らすことはできないため小さめで設定して自動増量するのがいいかと思います。
接続方法はCloud SQLプロキシを使用するのでパブリックIPにチェック入れます。
以下はバックアップの設定です。自動バックアップの時間帯はなるべくサービス利用者の少ない時間帯に設定するのが無難かと思います。ポイントインタイムもデフォルト設定でOKと思います。
メンテナンスはバグの修正、セキュリティ侵害の防止、アップグレードの実施のために行われます。その際インスタンスを再起動する必要があるので、利用ユーザーの少ない時間帯に設定するのがいいと思います。
その他は基本デフォルトの設定のままでいいかと思うのでインスタンスを作成します。
2.3 ユーザーとデータベースの作成
インスタンスの作成が完了したら、ユーザーとデータベースを設定していきます。
設定は簡単でGCPコンソール上で設定していきます。
まずはユーザーの設定です。
SQLの画面上で、上記①、②の順にクリックするとサイドバーが表示されユーザー名とパスワードを入力できます。入力が完了したら追加ボタンをクリックしユーザを追加しましょう。なおここで入力したユーザー名とパスワードは後に使用するので控えて置きましょう。
次にデータベースの設定をしていきます。
ユーザー設定同様に、①、②の順でクリックするとサイドバーが表示されるので、データベース名を入力しデータベースを作成します。なおここで作成するデータベース名も後に使用するので控えて置きましょう。
2.4 settings.pyにDB情報の記述
Cloud SQLで設定した情報をdjangoのsettings.pyに記載します。
config/settings.py
import os
if os.getenv('GAE_APPLICATION', None):
# GAE本番環境
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]',
'USER': '[YOUR-USERNAME]',
'PASSWORD': '[YOUR-PASSWORD]',
'NAME': '[YOUR-DATABASE]',
}
}
else:
# 開発環境
# 事前に./cloud_sql_proxyを実行してプロキシ経由でアクセスできるようにする必要がある。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': '[YOUR-USERNAME]',
'PASSWORD': '[YOUR-PASSWORD]',
'NAME': '[YOUR-DATABASE]',
}
}
DEBUGの記述同様、本番環境と開発環境を分けて記述します。
[YOUR-USERNAME]、[YOUR-PASSWORD]、[YOUR-DATABASE]は先ほどCloud SQLで設定したものを記載します。HOST’内にある[YOUR_INSTANCE_CONNECTION_NAME]については、Cloud SQL概要の以下を記載します。
settings.pyの記述は以上です。ただし、settings.pyにDBのユーザー名やパスワードなどの記述はセキュリティの観点から好ましくないです。このような環境変数の取り扱いについては「6. 環境変数の取り扱い」にて解説します。
2.5 本番環境での確認
本番環境でcloud sqlを使うためにまず開発環境でDBテーブルを作成する必要があります。
テーブル作成にあたってはいつもどおり、makemigrations、migrateとしていきますが、今回MySQLを使用するにあたって、mysqlclientをインストールする必要があります。以下のコマンドを順に実行しましょう。
(venv)$ brew install mysql
(venv)$ pip install mysqlclient
mysqlclientのインストールが完了したら、以下のコマンドでrequirements.txtにインストールしたmysqlclient情報を追記しましょう。
(venv)$ pip freeze > requirements.txt
また開発環境でcloud sqlで設定したDB情報を使うにはCloud SQL Proxyを起動させる必要があります。
もう一つ別のターミナルを開き以下を実行します。[YOUR_INSTANCE_CONNECTION_NAME] の部分には先ほど同様に接続名を入力します。
(venv)$ ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306
起動すると接続状態になるので、この状態で以下のコマンドを実行し、テーブル作成します。
(venv)$ python manage.py makemigrations
(venv)$ python manage.py migrate
以上でテーブル作成完了です。
また、後に使うので管理者権限をもったユーザーを作成して置きましょう。
(venv)$ python manage.py createsuperuser
試しに開発環境で確認してみましょう。
(venv)$ python manage.py runserver
先ほど作成した管理者権限を持ったユーザーでログインしてみます。
ログイン完了し、以下の画面が表示されれば無事データベースとの連携完了です。
本番環境でも同様に確認してみましょう。
#gcloud app deploy --project=<gcpのプロジェクトID>でデプロイ
(venv)$ gcloud app deploy --project=snsapp-316122
#ブラウザで確認
(venv)$ gcloud app browse
以下のように画面が表示され、先ほど作成した管理者権限ユーザーでのログインもできます。
ログイン後以下が表示
3. 環境変数の取り扱い
Cloud SQLとの連携で説明した通り、settings.pyにDB情報を記載するのはセキュリティの観点から好ましくありません。
以降では環境変数をどのように扱うかについて解説していきます。
今回はdjnagoで簡単に環境変数を管理できる、django-environというライブラリを使っていきます。早速インストールしていきましょう。
(venv)$ pip install django-environ
インストールが終わったら、requirements.txtに追記しましょう。
(venv)$ pip freeze > requirements.txt
環境変数を処理していきます。考え方はシンプルで、.envというバージョン管理しないファイルの中に環境変数を記述し、settings.pyでは.envファイルより変数を読み込みます。
記述方法について解説していきます。
from pathlib import Path
import os
import environ #インポート
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
#.envファイルの場所指定
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY') #シークレットキーは.envに記述
...
#DBのセキュリティに関わる部分は.env何に記述
if os.getenv('GAE_APPLICATION', None):
# GAE本番環境
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '/cloudsql/{}'.format(env('DB_HOST')),
'USER': env('DB_USER'),
'PASSWORD': env('DB_PASSWORD'),
'NAME': env('DB_NAME'),
}
}
else:
# 開発環境
# 事前に./cloud_sql_proxyを実行してプロキシ経由でアクセスできるようにする必要がある。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': env('DB_USER'),
'PASSWORD': env('DB_PASSWORD'),
'NAME': env('DB_NAME'),
}
}
今回はシークレットキーとDBに関わる情報を.envに記述します。
(今回の設定ではないですが、emailアドレス等あればそちらも.envに記述ください。)
まず.envファイルが存在する場所を決めます。コードにもある通り、.envファイルの場所をBASE_DIRとします。
env(‘SECRET_KEY’)、env(‘DB_HOST’)の部分が.envファイルより読み込む部分となります。
したがってBASE_DIRに.envファイルを作成し、以下のように記述してください。
.envファイル
SECRET_KEY=[YOUR-SECRET-KEY]
DB_HOST=[YOUR-INSTANCE-CONNECTION-NAME]
DB_USER=[YOUR-USERNAME]
DB_PASSWORD=[YOUR-PASSWORD]
DB_NAME=[YOUR-DATABASE]
また.envをバージョン管理しないように.gitignore内にも.envを追記しましょう。
あとは、gcloud deploy…といつも通りデプロイすれば完了です。
4. まとめ
アプリケーションをGoogle Cloud上で構築する方は、Cloud SQLの使用頻度はかなり高いかと思います。本記事が皆さんの開発に役立てば幸いです。
1点注意事項があります。
Cloud SQLを放っておくとなかなかの額請求されるので不要なら必ずクリーンアップしてください。
では本日は以上です。
コメント