こんにちは。最近はDjangoの勉強を兼ねてWebアプリケーションを作成しました。アプリはDocker + Djangoで構築しました。Django + Cloud Runの情報は多くありますが、Docker環境のが少なかったため、手順をメモしておきます。
Google CloudのAlwaysFree枠を活用して、料金を抑えることができますが、CloudSQLは無料枠がないため注意してください。
本記事では、Google Cloudのコンソールにアクセスして新規プロジェクトを作成した状態を想定しています。
アプリ環境
私の環境について簡単に説明します。OSはUbuntu 22.04.2 LTSを使用しており、Djangoのデータベースはpostgre:13です。また、デフォルトの8000ポートを使用しています。以下にdocker-compose.ymlとDockerfileを載せます。
こちらの環境構築については、DockerでDjangoを立ち上げる + 顔認識ライブラリをインストールをご確認ください。
docker-compose.yml
version: '3'
services:
db:
image: postgres:13
environment:
POSTGRES_HOST_AUTH_METHOD: 'trust'
container_name: "postgre"
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
Dockerfile
FROM python:3.9-buster
# 環境変数
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
# 作業ディレクトリ
WORKDIR /code
RUN apt-get -y update
RUN apt-get install -y libboost-all-dev \
cmake \
build-essential \
libx11-dev \
libopenblas-dev liblapack-dev
# req.txt
COPY req.txt ./
# pipアップグレード
RUN pip install --upgrade pip
# パッケージ追加
RUN pip install -r req.txt
RUN apt-get update \
&& apt-get install -y libsm6 libxext6 libxrender-dev \
&& rm -rf /var/lib/apt/lists/*
# ローカルのディレクトリを/codeに追加
ADD . /code
# ポートを開放
EXPOSE 8000
CMD python3 manage.py migrate
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 config.wsgi:application
Cloud Runにデプロイする
まずはGoogle CloudのAPIを有効にする必要があります。
Cloud Run, Cloud SQL, Container Registry等の API を有効にしてください。以下の手順でAPIが有効になっていない場合は、APIを有効にしてください。
Google Cloud SDKのインストール
まずはコンテナをアップロードする前に、ローカル環境にGoogle Cloud SDKをインストールします。
必要なパッケージをインストール。
sudo apt install apt-transport-https ca-certificates gnupg
gcloud CLIの配布URIを追加。
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
Google Cloud の公開鍵を追加。
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
gcloud CLI をインストール。
sudo apt-get update && sudo apt-get install google-cloud-cli
インストールに成功すれば、以下のコマンドで初期設定を開始。
gcloud init
新規作成を選択(2)
Pick configuration to use:
[1] Re-initialize this configuration [xxxxxx] with new settings
[2] Create a new configuration
Please enter your numeric choice: 2
アカウントを選択するとURLが表示されるので、URLをコピペしてブラウザに貼り付けます。選択したGoogleアカウントでログインして進めると、verification codeが表示されます。このコードをコンソールに入力すると認証が完了します。
プロジェクトについて訊かれるため、作成したプロジェクトを指定します。(1)
You are logged in as: [***@hoge.com]].
Pick cloud project to use:
[1] <project id>
[2] Enter a project ID
[3] Create a new project
Please enter numeric choice or text value (must exactly match list item): 1
すると画面が進み、初期設定が完了します。
Cloud SQLインスタンスの作成
次にGoogle Cloud ConsoleからCloud SQLを作成します。
- Cloud SQLのページに移動して、
インスタンスを作成
をクリックします。 - PostgreSQLを選択。
インスタンス ID
に任意のIDを入力。- postgresユーザーのパスワードを入力。
- postgresのバージョンは13を選択。
- 構成は
本番
を選択。 - [リージョンとゾーンの可用性の選択] で任意のリージョンとゾーンを選択(私はus-west1にしました)
- [インスタンスのカスタマイズ]からマシンスペックを選びます。一応私は、AlwaysFree枠に収まるようにコア数、メモリ、ストレージはすべて最小構成にしました。
- [インスタンスを作成]をクリックします。数分かかりました。
データベースの作成
- Cloud SQLのページから作成したインスタンスを選択します。
- 左のメニューからデータベースを選択し、[データベースの作成]をクリックします。
- 任意の
データベース名
を設定して作成します。
サービスアカウントの作成
次にDockerイメージをアップロードする権限を持ったアカウントを作成します。
- サービスアカウント作成ページにアクセスします。
- アカウント名とプロジェクトIDを設定します。
- サービスアカウントキーを作成します。
- 作成したキーはJSONを選択してローカルマシンにコピーしておきます。
- 以下のコマンドを実行します。ACCOUNTは作成したサービスアカウント名([email protected]のhogehoge)、KEY-FILEはコピーしたJSONファイルのパスを入力します。
gcloud auth activate-service-account ACCOUNT --key-file=KEY-FILE
詳しくは公式ページをご覧ください。
次に、gcloudでDockerを有効化します。
gcloud auth configure-docker
認証情報は以下に作成されます。
$HOME/.docker/config.json
Dockerイメージのビルド
次はローカルの作業です。
Cloud SQLでポート番号を認識させるには、gunicornを使ってDockerfile内で変数を明示する必要があります。プロジェクトのDockerfileの末尾に以下を追加します。
CMD python3 manage.py migrate
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 config.wsgi:application
gunicornをインストールするため、requirements.txtに以下を追加します。
gunicorn==20.0.4
プロジェクトのルートディレクトリ(Dockerfileがある階層)で以下のコマンドを実行します。[IMAGE_NAME]は任意の名前を入れてください。
docker build -t [IMAGE_NAME] .
ビルドが完了したら、Container Registryにイメージをプッシュします。
IMAGE_NAMEは任意の名前、PROJECT_IDはプロジェクトIDです。
docker tag [IMAGE_NAME] gcr.io/[PROJECT_ID]/[IMAGE_NAME]
docker push gcr.io/[PROJECT_ID]/[IMAGE_NAME]
Dockerイメージの容量によって料金が発生するので注意してください。
私の場合は顔認識ライブラリのおかげで850MBほどありましたが、1回のデプロイで300円ほどかかっていました。登録してから一定期間はGoogle Cloudの初回クレジットが39000円分ほど付与されるので、安心です。
Cloud Runにデプロイする
DockerイメージをプッシュできたらようやくCloud Runにデプロイする作業です。
Cloud Runページに移動して、[サービスの作成]をクリックします。
コンテナイメージのURLの選択をクリックして、CONTAINER REGISTRYからツリーを展開して、先程プッシュしたイメージを選択します。
コンテナポート:8000
CPUの割当と料金:リクエストの処理中にのみCPUを割り当てる
容量:メモリは1GiB, CPUは1(お好みで)
実行環境:デフォルト
自動スケーリング:0(コールドスタートするため、誰もアクセスしないときは、リソースを消費しないため料金が発生しません)
次に環境変数を設定します。
- DATABASE_ENGINE: “django.db.backends.postgresql”
- DATABASE_NAME: [作成したデータベースの名前]
- DATABASE_USER: [作成したデータベースのユーザー名]
- DATABASE_PASSWORD: [作成したデータベースのパスワード]
- DATABASE_HOST: /cloudsql/[プロジェクト名]:[リージョン]:[SQLインスタンス名]/[データベース名]
最後に、[デプロイ]をクリックしたら終了です。
Be First to Comment