Django CMS di Cloud Run

1. Pengantar

89eb4723767d4525.png

Cloud Run adalah platform komputasi terkelola yang memungkinkan Anda untuk menjalankan container stateless yang dapat dipanggil melalui permintaan HTTP. Cloud Run bersifat serverless. Platform ini memisahkan semua pengelolaan infrastruktur di lokasi lain, sehingga Anda dapat fokus pada hal terpenting, yakni membuat aplikasi yang andal.

Cloud Run juga berinteraksi secara native dengan banyak bagian lain dari ekosistem Google Cloud, termasuk Cloud SQL untuk database terkelola, Cloud Storage untuk penyimpanan objek terpadu, dan Secret Manager untuk mengelola secret.

Django CMS adalah sistem pengelolaan konten (CMS) tingkat perusahaan yang dibangun di atas Django. Django adalah framework web Python tingkat tinggi.

Dalam tutorial ini, Anda akan menggunakan komponen ini untuk men-deploy project Django CMS kecil.

Catatan: Codelab ini terakhir kali diverifikasi dengan Django CMS 4.1.2 melalui django-cms/cms-template v4.1.

Yang akan Anda pelajari

  • Cara menggunakan Cloud Shell
  • Cara membuat database Cloud SQL
  • Cara membuat bucket Cloud Storage
  • Cara membuat secret Secret Manager
  • Cara menggunakan Secret dari berbagai layanan Google Cloud
  • Cara menghubungkan komponen Google Cloud ke layanan Cloud Run
  • Cara menggunakan Container Registry untuk menyimpan container yang dibuat
  • Cara men-deploy ke Cloud Run
  • Cara menjalankan migrasi skema database di Cloud Build

2. Penyiapan dan persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Google Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, kita akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jika ini adalah pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Continue.

d95252b003979716.png

Perlu waktu beberapa saat untuk menyediakan dan terhubung ke Cloud Shell.

7833d5e1c5d18f54.png

Virtual machine ini dilengkapi dengan semua alat pengembangan yang diperlukan. VM ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project telah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Aktifkan Cloud API

Dari Cloud Shell, aktifkan Cloud API untuk komponen yang akan digunakan:

gcloud services enable \
  run.googleapis.com \
  sql-component.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  cloudbuild.googleapis.com \
  secretmanager.googleapis.com \
  artifactregistry.googleapis.com

Karena ini adalah pertama kalinya Anda memanggil API dari gcloud, Anda akan diminta untuk memberikan otorisasi menggunakan kredensial Anda untuk membuat permintaan ini. Hal ini akan terjadi sekali per sesi Cloud Shell.

Operasi ini mungkin memerlukan waktu beberapa saat sampai selesai.

Setelah selesai, akan muncul pesan sukses yang mirip dengan yang berikut ini:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

4. Membuat project template

Anda akan menggunakan cms-template Django CMS sebagai contoh project Django CMS Anda.

Untuk membuat project template ini, gunakan Cloud Shell guna membuat direktori baru bernama djangocms-cloudrun, lalu buka direktori tersebut:

mkdir ~/djangocms-cloudrun
cd ~/djangocms-cloudrun

Instal paket django-cms ke lingkungan virtual sementara:

virtualenv venv
source venv/bin/activate
pip install djangocms-frontend\[cms-4]

Buat salinan project cms-template:

django-admin startproject --template https://github.com/django-cms/cms-template/archive/4.1.zip myproject .

Ganti nama file requirements.in menjadi requirements.txt. (File .in digunakan oleh pip-tools untuk membuat file requirements.txt, tetapi dapat digunakan apa adanya jika ekstensinya diubah. Pada langkah selanjutnya, pip mengharapkan ekstensi .txt.)

mv requirements.in requirements.txt

Sekarang Anda akan memiliki project Django CMS template di folder bernama myproject:

ls -F
manage.py*  media/  myproject/  project.db requirements.txt  static/ venv/

Anda kini dapat keluar dan menghapus lingkungan virtual sementara Anda:

deactivate
rm -rf venv

Dari sini, Django CMS akan dipanggil dalam container.

5. Buat layanan pendukung

Sekarang Anda akan membuat layanan pendukung: akun layanan khusus, Artifact Registry, database Cloud SQL, bucket Cloud Storage, dan sejumlah nilai Secret Manager.

Mengamankan nilai sandi yang digunakan dalam deployment penting untuk keamanan project apa pun, dan memastikan tidak ada yang secara tidak sengaja menempatkan sandi di tempat yang tidak seharusnya (misalnya, langsung di file setelan, atau diketik langsung ke terminal tempat sandi dapat diambil dari histori).

Untuk memulai, tetapkan dua variabel lingkungan dasar, satu untuk Project ID:

PROJECT_ID=$(gcloud config get-value core/project)

Dan satu untuk region:

REGION=us-central1

Membuat akun layanan

Untuk membatasi akses yang akan dimiliki layanan ke bagian Google Cloud lainnya, buat akun layanan khusus:

gcloud iam service-accounts create cloudrun-serviceaccount

Anda akan mereferensikan akun ini berdasarkan emailnya di bagian selanjutnya dari codelab ini. Tetapkan nilai tersebut dalam variabel lingkungan:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
    --filter cloudrun-serviceaccount --format "value(email)")

Membuat Artifact Registry

Untuk menyimpan image container yang di-build, buat container registry di region yang Anda pilih:

gcloud artifacts repositories create containers --repository-format docker --location $REGION

Anda akan mereferensikan registri ini berdasarkan nama di bagian selanjutnya dari codelab ini:

ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/containers

Membuat database

Buat instance Cloud SQL:

gcloud sql instances create myinstance --project $PROJECT_ID \
  --database-version POSTGRES_14 --tier db-f1-micro --region $REGION

Operasi ini mungkin memerlukan waktu beberapa menit hingga selesai.

Pada instance tersebut, buat database:

gcloud sql databases create mydatabase --instance myinstance

Di instance yang sama, buat pengguna:

DJPASS="$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1)"
gcloud sql users create djuser --instance myinstance --password $DJPASS

Beri akun layanan izin untuk terhubung ke instance:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/cloudsql.client

Buat bucket penyimpanan

Buat bucket Cloud Storage (perhatikan bahwa nama harus unik secara global):

GS_BUCKET_NAME=${PROJECT_ID}-media
gcloud storage buckets create gs://${GS_BUCKET_NAME} --location ${REGION} 

Berikan izin untuk akun layanan agar dapat mengelola bucket:

gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET_NAME} \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/storage.admin

Karena objek yang disimpan di bucket akan memiliki asal yang berbeda (URL bucket, bukan URL Cloud Run), Anda perlu mengonfigurasi setelan Cross Origin Resource Sharing (CORS).

Buat file baru bernama cors.json, dengan konten berikut:

touch cors.json
cloudshell edit cors.json

cors.json

[
    {
      "origin": ["*"],
      "responseHeader": ["Content-Type"],
      "method": ["GET"],
      "maxAgeSeconds": 3600
    }
]

Terapkan konfigurasi CORS ini ke bucket penyimpanan yang baru dibuat:

gsutil cors set cors.json gs://$GS_BUCKET_NAME

Menyimpan konfigurasi sebagai rahasia

Setelah menyiapkan layanan pendukung, Anda akan menyimpan nilai ini dalam file yang dilindungi menggunakan Secret Manager.

Dengan Secret Manager, Anda dapat menyimpan, mengelola, dan mengakses secret sebagai blob biner atau string teks. Secret Manager berfungsi dengan baik untuk menyimpan informasi konfigurasi seperti sandi database, kunci API, atau sertifikat TLS yang diperlukan oleh aplikasi saat runtime.

Pertama, buat file dengan nilai untuk string koneksi database, bucket media, kunci rahasia untuk Django (digunakan untuk penandatanganan kriptografi sesi dan token), dan untuk mengaktifkan proses debug:

echo DATABASE_URL=\"postgres://djuser:${DJPASS}@//cloudsql/${PROJECT_ID}:${REGION}:myinstance/mydatabase\" > .env

echo GS_BUCKET_NAME=\"${GS_BUCKET_NAME}\" >> .env

echo SECRET_KEY=\"$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 50 | head -n 1)\" >> .env

echo DEBUG=True >> .env

Kemudian, buat secret bernama application_settings, menggunakan file tersebut sebagai secret:

gcloud secrets create application_settings --data-file .env

Izinkan akun layanan mengakses secret ini:

gcloud secrets add-iam-policy-binding application_settings \
  --member serviceAccount:${SERVICE_ACCOUNT} --role roles/secretmanager.secretAccessor

Konfirmasi bahwa secret telah dibuat dengan mencantumkan secret:

gcloud secrets versions list application_settings

Setelah mengonfirmasi bahwa secret telah dibuat, hapus file lokal:

rm .env

6. Konfigurasi aplikasi Anda

Mengingat layanan pendukung yang baru saja Anda buat, Anda harus melakukan beberapa perubahan pada project template agar sesuai.

Hal ini akan mencakup pengenalan django-environ untuk menggunakan variabel lingkungan sebagai setelan konfigurasi Anda, yang akan Anda isi dengan nilai yang Anda tentukan sebagai rahasia. Untuk menerapkannya, Anda akan memperluas setelan template. Anda juga perlu menambahkan dependensi Python tambahan.

Mengonfigurasi setelan

Pindahkan file settings.py, lalu ganti namanya menjadi basesettings.py:

mv myproject/settings.py myproject/basesettings.py

Menggunakan editor web Cloud Shell, buat file settings.py baru dengan kode berikut:

touch myproject/settings.py
cloudshell edit myproject/settings.py

myproject/settings.py

import io
import os
from urllib.parse import urlparse

import environ

# Import the original settings from each template
from .basesettings import *

# Load the settings from the environment variable
env = environ.Env()
env.read_env(io.StringIO(os.environ.get("APPLICATION_SETTINGS", None)))

# Setting this value from django-environ
SECRET_KEY = env("SECRET_KEY")

# Ensure myproject is added to the installed applications
if "myproject" not in INSTALLED_APPS:
    INSTALLED_APPS.append("myproject")

# If defined, add service URLs to Django security settings
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]
else:
    ALLOWED_HOSTS = ["*"]

# Default false. True allows default landing pages to be visible
DEBUG = env("DEBUG", default=False)

# Set this value from django-environ
DATABASES = {"default": env.db()}

# Change database settings if using the Cloud SQL Auth Proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATICFILES_DIRS = []
GS_DEFAULT_ACL = "publicRead"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}

Luangkan waktu untuk membaca komentar yang ditambahkan tentang setiap konfigurasi.

Perhatikan bahwa Anda mungkin melihat error linting pada file ini. Hal ini sudah diperkirakan. Cloud Shell tidak memiliki konteks persyaratan untuk project ini, sehingga dapat melaporkan impor yang tidak valid dan impor yang tidak digunakan.

Dependensi Python

Temukan file requirements.txt, lalu tambahkan paket berikut:

cloudshell edit requirements.txt

requirements.txt (tambahkan)

gunicorn
psycopg2-binary
django-storages[google]
django-environ

Tentukan gambar aplikasi Anda

Cloud Run akan menjalankan container apa pun selama container tersebut sesuai dengan Kontrak Container Cloud Run. Tutorial ini memilih untuk menghilangkan Dockerfile, tetapi menggunakan Buildpack Berbasis Cloud. Buildpack membantu membangun container untuk bahasa umum, termasuk Python.

Tutorial ini memilih untuk menyesuaikan Procfile yang digunakan untuk memulai aplikasi web.

Untuk memasukkan project template ke dalam container, buat file baru bernama Procfile di level teratas project Anda (di direktori yang sama dengan manage.py), lalu salin konten berikut:

touch Procfile
cloudshell edit Procfile

Procfile

web: gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application

7. Mengonfigurasi, membangun, dan menjalankan langkah-langkah migrasi

Untuk membuat skema database di database Cloud SQL dan mengisi bucket Cloud Storage dengan aset statis, Anda perlu menjalankan migrate dan collectstatic.

Perintah migrasi Django dasar ini perlu dijalankan dalam konteks image container yang Anda buat dengan akses ke database Anda.

Anda juga perlu menjalankan createsuperuser untuk membuat akun administrator agar dapat login ke admin Django.

Untuk melakukannya, Anda akan menggunakan Tugas Cloud Run untuk melakukan tugas ini. Dengan tugas Cloud Run, Anda dapat menjalankan proses yang memiliki akhir yang ditentukan, sehingga ideal untuk tugas administrasi.

Tentukan sandi superuser Django Anda

Untuk membuat pengguna super, Anda akan menggunakan perintah createsuperuser versi non-interaktif. Perintah ini memerlukan variabel lingkungan bernama khusus untuk digunakan sebagai pengganti perintah untuk memasukkan sandi.

Buat secret baru, menggunakan sandi yang dibuat secara acak:

echo -n $(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1) | gcloud secrets create django_superuser_password --data-file=-

Izinkan akun layanan Anda mengakses secret ini:

gcloud secrets add-iam-policy-binding django_superuser_password \
  --member serviceAccount:${SERVICE_ACCOUNT} \
  --role roles/secretmanager.secretAccessor

Perbarui Procfile Anda

Untuk membantu memperjelas tugas Cloud Run Anda, buat pintasan di Procfile Anda, tambahkan titik entri berikut ke Procfile:

migrate: python manage.py migrate && python manage.py collectstatic --noinput --clear
createuser: python manage.py createsuperuser --username admin --email noop@example.com --noinput

Sekarang Anda akan memiliki tiga entri: titik entri web default, titik entri migrate untuk menerapkan migrasi database, dan titik entri createuser untuk menjalankan perintah createsuperuser.

Membangun image aplikasi Anda

Setelah pembaruan Procfile diterapkan, buat image:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

Membuat tugas Cloud Run

Setelah image ada, Anda dapat membuat tugas Cloud Run menggunakan image tersebut.

Tugas ini menggunakan image yang dibuat sebelumnya, tetapi menggunakan nilai command yang berbeda. Nilai ini dipetakan ke nilai di Procfile.

Buat tugas untuk migrasi:

gcloud run jobs create migrate \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --command migrate

Buat tugas untuk pembuatan pengguna:

gcloud run jobs create createuser \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --set-secrets DJANGO_SUPERUSER_PASSWORD=django_superuser_password:latest \
  --service-account $SERVICE_ACCOUNT \
  --command createuser

Menjalankan tugas Cloud Run

Setelah konfigurasi tugas selesai, jalankan migrasi:

gcloud run jobs execute migrate --region $REGION --wait

Pastikan output perintah ini menyatakan bahwa eksekusi "berhasil diselesaikan".

Anda akan menjalankan perintah ini nanti saat melakukan update pada aplikasi.

Setelah penyiapan database, buat pengguna menggunakan tugas:

gcloud run jobs execute createuser --region $REGION --wait

Pastikan output perintah ini menyatakan bahwa eksekusi "berhasil diselesaikan".

Anda tidak perlu menjalankan perintah ini lagi.

8. Men-deploy ke Cloud Run

Setelah layanan pendukung dibuat dan diisi, Anda kini dapat membuat layanan Cloud Run untuk mengaksesnya.

Deployment awal aplikasi dalam container Anda ke Cloud Run dibuat menggunakan perintah berikut:

gcloud run deploy djangocms-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --allow-unauthenticated

Tunggu sebentar sampai proses deployment selesai. Jika berhasil, command line akan menampilkan URL layanan:

Service [djangocms-cloudrun] revision [djangocms-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://djangocms-cloudrun-...run.app

Sekarang Anda dapat melihat container yang telah di-deploy dengan membuka URL ini di browser web:

e1fb6858bf11626a.png

Karena ini adalah penginstalan baru, Anda akan otomatis dialihkan ke halaman login.

9. Mengakses Admin Django

Salah satu fitur utama Django CMS adalah admin interaktifnya.

Memperbarui setelan CSRF

Django menyertakan perlindungan terhadap Pemalsuan Permintaan Lintas Situs (CSRF). Setiap kali formulir dikirimkan di situs Django Anda, termasuk login ke admin Django, setelan Asal Tepercaya akan diperiksa. Jika tidak cocok dengan asal permintaan, Django akan menampilkan error.

Dalam file mysite/settings.py, jika variabel lingkungan CLOUDRUN_SERVICE_URL ditentukan, variabel tersebut akan digunakan dalam setelan CSRF_TRUSTED_ORIGINS dan ALLOWED_HOSTS. Meskipun tidak wajib, sebaiknya tentukan ALLOWED_HOSTS karena sudah diperlukan untuk CSRF_TRUSTED_ORIGINS.

Karena Anda memerlukan URL layanan, konfigurasi ini tidak dapat ditambahkan hingga setelah deployment pertama.

Anda harus memperbarui layanan untuk menambahkan variabel lingkungan ini. Secret ini dapat ditambahkan ke secret application_settings, atau ditambahkan langsung sebagai variabel lingkungan.

Implementasi di bawah memanfaatkan pemformatan dan pelepasan gcloud.

Ambil URL layanan Anda:

CLOUDRUN_SERVICE_URLS=$(gcloud run services describe djangocms-cloudrun \
  --region $REGION  \
  --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
echo $CLOUDRUN_SERVICE_URLS

Tetapkan nilai ini sebagai variabel lingkungan di layanan Cloud Run Anda:

gcloud run services update djangocms-cloudrun \
  --region $REGION \
  --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"

Login ke Admin Django

Untuk mengakses antarmuka admin Django, tambahkan /admin ke URL layanan Anda.

Sekarang, login dengan nama pengguna "admin" dan ambil sandi Anda menggunakan perintah berikut:

gcloud secrets versions access latest --secret django_superuser_password && echo ""

da10a148bc1c7994.png

10. Menerapkan update aplikasi

Saat mengembangkan aplikasi, Anda akan ingin mengujinya secara lokal. Untuk melakukannya, Anda harus terhubung ke database Cloud SQL ("produksi"), atau database lokal ("pengujian").

Menghubungkan ke database produksi Anda

Anda dapat terhubung ke instance Cloud SQL menggunakan Proxy Auth Cloud SQL. Aplikasi ini membuat koneksi dari komputer lokal Anda ke database.

Setelah menginstal Proxy Auth Cloud SQL, ikuti langkah-langkah berikut:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Run the Cloud SQL Auth Proxy
./cloud-sql-proxy ${PROJECT_ID}:${REGION}:myinstance

# In a new tab, start the local web server using these new settings
USE_CLOUD_SQL_AUTH_PROXY=true APPLICATION_SETTINGS=$(cat temp_settings) python manage.py runserver

Pastikan Anda menghapus file temp_settings setelah Anda menyelesaikan pekerjaan Anda.

Menghubungkan ke database SQLite lokal

Atau, Anda dapat menggunakan database lokal saat mengembangkan aplikasi. Django mendukung database PostgreSQL dan SQLite, dan ada beberapa fitur PostgreSQL yang tidak dimiliki SQLite, tetapi dalam banyak kasus, fungsinya identik.

Untuk menyiapkan SQLite, Anda harus memperbarui setelan aplikasi, untuk mengarah ke database lokal, lalu Anda harus menerapkan migrasi skema.

Untuk menyiapkan metode ini:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Edit the DATABASE_URL setting to use a local sqlite file. For example:
DATABASE_URL=sqlite:////tmp/my-tmp-sqlite.db

# Set the updated settings as an environment variable
APPLICATION_SETTINGS=$(cat temp_settings) 

# Apply migrations to the local database
python manage.py migrate

# Start the local web server
python manage.py runserver

Pastikan Anda menghapus file temp_settings setelah Anda menyelesaikan pekerjaan Anda.

Membuat migrasi

Saat membuat perubahan pada model database, Anda mungkin perlu membuat file migrasi Django dengan menjalankan python manage.py makemigrations.

Anda dapat menjalankan perintah ini setelah menyiapkan koneksi database produksi atau pengujian. Atau, Anda dapat membuat file migrasi tanpa database dengan memberikan setelan kosong:

SECRET_KEY="" DATABASE_URL="" GS_BUCKET_NAME="" python manage.py makemigrations

Menerapkan update aplikasi

Untuk menerapkan perubahan pada aplikasi, Anda harus:

  • membuat perubahan Anda menjadi image baru,
  • menerapkan migrasi database atau statis, lalu
  • perbarui layanan Cloud Run Anda untuk menggunakan image baru.

Untuk membuat image:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

Jika Anda memiliki migrasi yang akan diterapkan, jalankan tugas Cloud Run:

gcloud run jobs execute migrate --region $REGION --wait

Untuk mengupdate layanan Anda dengan image baru:

gcloud run services update djangocms-cloudrun \
  --platform managed \
  --region $REGION \
  --image gcr.io/${PROJECT_ID}/myimage

11. Selamat!

Anda baru saja men-deploy project yang kompleks ke Cloud Run.

  • Cloud Run meningkatkan skala image container secara otomatis dan horizontal untuk menangani permintaan yang diterima, lalu menurunkan skala saat permintaan berkurang. Anda hanya membayar untuk CPU, memori, dan jaringan yang terpakai selama penanganan permintaan.
  • Cloud SQL memungkinkan Anda menyediakan instance PostgreSQL terkelola yang dipertahankan secara otomatis untuk Anda, dan terintegrasi secara native ke dalam banyak sistem Google Cloud.
  • Cloud Storage memungkinkan Anda memiliki penyimpanan cloud yang dapat diakses dengan lancar di Django.
  • Secret Manager memungkinkan Anda menyimpan secret, dan membuatnya dapat diakses oleh bagian tertentu di Google Cloud, bukan yang lain.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Platform Anda untuk resource yang digunakan dalam tutorial ini:

  • Di Cloud Console, buka halaman Mengelola resource.
  • Dalam daftar project, pilih project Anda lalu klik Delete.
  • Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Pelajari lebih lanjut