Skip to content

Dockerで作成したDjangoアプリケーションをCloud Runにデプロイして公開する

こんにちは。最近は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を作成します。

  1. Cloud SQLのページに移動して、インスタンスを作成をクリックします。
  2. PostgreSQLを選択。
  3. インスタンス ID に任意のIDを入力。
  4. postgresユーザーのパスワードを入力。
  5. postgresのバージョンは13を選択。
  6. 構成は本番 を選択。
  7. [リージョンとゾーンの可用性の選択] で任意のリージョンとゾーンを選択(私はus-west1にしました)
  8. [インスタンスのカスタマイズ]からマシンスペックを選びます。一応私は、AlwaysFree枠に収まるようにコア数、メモリ、ストレージはすべて最小構成にしました。
  9. [インスタンスを作成]をクリックします。数分かかりました。

データベースの作成

  1. Cloud SQLのページから作成したインスタンスを選択します。
  2. 左のメニューからデータベースを選択し、[データベースの作成]をクリックします。
  3. 任意のデータベース名を設定して作成します。

サービスアカウントの作成

次にDockerイメージをアップロードする権限を持ったアカウントを作成します。

  1. サービスアカウント作成ページにアクセスします。
  2. アカウント名とプロジェクトIDを設定します。
  3. サービスアカウントキーを作成します。
  4. 作成したキーはJSONを選択してローカルマシンにコピーしておきます。
  5. 以下のコマンドを実行します。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(コールドスタートするため、誰もアクセスしないときは、リソースを消費しないため料金が発生しません)

dc160146 image

次に環境変数を設定します。

  • DATABASE_ENGINE: “django.db.backends.postgresql”
  • DATABASE_NAME: [作成したデータベースの名前]
  • DATABASE_USER: [作成したデータベースのユーザー名]
  • DATABASE_PASSWORD: [作成したデータベースのパスワード]
  • DATABASE_HOST: /cloudsql/[プロジェクト名]:[リージョン]:[SQLインスタンス名]/[データベース名]
2ec51a4e image

最後に、[デプロイ]をクリックしたら終了です。

カテゴリプログラミング

Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントは日本語で入力してください。(スパム対策)

CAPTCHA