GCP

DjangoアプリをCloud Build×Cloud Run×Cloud SQLで構築

前提

・Djangoのプロジェクトが作成してある
・GCP上でプロジェクトが作成してある(プロジェクトID取得)

.
├── Dockerfile
├── README.md
├── cloudbuild.yaml
└── code
    ├── config
    ├── core
    ├── manage.py
    └── requirements.txt

全体概要

・Dockerfileを作成
【ローカルから手動でデプロイ】
・APIを有効化(Container Registory, Cloud Run)
・Container Registoryへの接続を認証
・Build image for Container Registory
・Push image to Container Registory
・Deploy image to Cloud Run

【Cloud Buildで自動でデプロイ】
・APIを有効化(Cloud Build)
・サービスアカウント権限の認証
・Create cloudbuild.yaml
・Exec Cloud Build

【Cloud SQLとCloud Runを接続】
・GCPでの操作
・Cloud-RunにCloud-SQLのインスタンスを登録
・環境変数を登録

【ローカルからマイグレーション】
・Cloud-SQL-proxyをインストール
・Cloud-SQLインスタンス起動
・マイグレーションを実行

ローカルから手動でデプロイ

Create Dockerfile

FROM python:3.7

ENV PYTHONDONTWRITEBYTECODE=1

# copy project
WORKDIR /code
COPY ./code ./

# Install Python Libraries
RUN pip install --no-cache-dir -r requirements.txt


EXPOSE 8000
CMD ["gunicorn", "-b", ":8000", "config.wsgi:application"]

Build image for Container Registory

[GCRイメージ名] = asia.gcr.io/[プロジェクトID]/[イメージ名]

$ docker build -t [GCRイメージ名] -f [Dockerfile名] [Dockerfileのパス]

Push image to Container Registory

$ docker push [GCRイメージ名]

Deploy image to Cloud Run

$ gcloud run deploy --image [GCRイメージ名] --port 8000 --platform managed

Cloud Buildでデプロイを自動化

サービスアカウント権限の認証

参考:公式サイト

Cloud Runのステータスを「有効」に変更します。

Create cloudbuild.yaml

プロジェクト直下にcloudbuild.yamlを作成します。

記述の内容としては、
build image -> push image -> deploy image
を順番に実行するような記述をしています。

steps:

  # [build or rebuild image]
  - name: 'gcr.io/cloud-builders/docker' # standard container name
    # exec command
    entrypoint: docker
    args: ['build', '-t', '[GCRイメージ名]', '-f', '[Dockerfile名]', '[Dockerfileのパス]']

  # [push image]
  - name: 'gcr.io/cloud-builders/docker'
    entrypoint: docker
    args: ['push', '[GCRイメージ名]']

  # [deploy image]
  - name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: gcloud
    args: ['run', 'deploy', '[プロジェクトID]', '--region', 'asia-northeast1', '--image', '[GCRイメージ名]', '--port', '8000', '--platform', 'managed']

  # GCR image name
  images:
    - [GCRイメージ名]

以下のコマンドでcloudbuild.yaml内の記述が実行されます。

$ gcloud builds submit

Cloud SQLとCloud Runを接続

参考:公式サイト

GCPでの操作

・Cloud SQL Admin APIを有効化
・SQLインスタンスを作成
・ユーザー作成
・データベース作成

Cloud-RunにCloud-SQLのインスタンスを登録

$ gcloud run services update [サービス名] --add-cloudsql-instances [インスタンス接続名]

環境変数を登録

$ gcloud run services update [サービス名] \
    --set-env-vars \
    INSTANCE_CONNECTION_NAME=[インスタンス接続名],\
    MYSQL_DATABASE=[データベース名],\
    MYSQL_HOST=[Cloud-SQLのパブリックIPアドレス],\
    MYSQL_PORT=5306,\
    MYSQL_USER=[ユーザー名],\
    MYSQL_PASSWORD=[パスワード],\
    MODE=production

ローカルからマイグレーション

参考:公式サイト

Cloud-SQL-proxyをインストール

$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64

$ chmod +x cloud_sql_proxy

Cloud-SQLインスタンス起動

$ ./cloud_sql_proxy -instances=”[インスタンス接続名]”=tcp:5306

インスタンスが起動したのが確認できたら、ターミナルで別のタブを開いて以下を実行して接続を確認します。

$ mysql -u [ユーザー名] -p –host 127.0.0.1 -P 5306

マイグレーションを実行

$ cd [Djangoのプロジェクト]
$ pipenv run python manage.py migrate

COMMENT

メールアドレスが公開されることはありません。