Django trên Cloud Run

Django trên Cloud Run

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 10 15, 2024
account_circleTác giả: Katie McLaughlin

1. Giới thiệu

894762ebb681671c.png

Cloud Run là một nền tảng điện toán được quản lý cho phép bạn chạy các vùng chứa không có trạng thái có thể gọi qua các yêu cầu HTTP. Cloud Run là giải pháp không máy chủ: loại bỏ mọi hoạt động quản lý cơ sở hạ tầng, vì vậy, bạn có thể tập trung vào công việc quan trọng nhất — xây dựng các ứng dụng tuyệt vời.

Dịch vụ này cũng có giao diện gốc với nhiều phần khác trong hệ sinh thái Google Cloud, bao gồm Cloud SQL cho cơ sở dữ liệu được quản lý, Cloud Storage cho bộ nhớ đối tượng hợp nhất và Trình quản lý bí mật để quản lý bí mật.

Django là một khung web Python cấp cao.

Trong hướng dẫn này, bạn sẽ sử dụng các thành phần này để triển khai một dự án Django nhỏ.

Lưu ý: Lần gần đây nhất lớp học lập trình này được xác minh là với Django 5.0. Trừ phi có thay đổi nào gây lỗi trong các bản cập nhật trong tương lai, lớp học lập trình này sẽ tiếp tục hoạt động. Hãy kiểm tra các ghi chú phát hành Django trong tương lai.

Kiến thức bạn sẽ học được

  • Cách sử dụng Cloud Shell
  • Cách tạo cơ sở dữ liệu Cloud SQL
  • Cách tạo bộ chứa trên Cloud Storage
  • Cách tạo khoá bí mật trong Secret Manager
  • Cách sử dụng Khoá bí mật từ các dịch vụ khác nhau của Google Cloud
  • Cách kết nối các thành phần của Google Cloud với dịch vụ Cloud Run
  • Cách sử dụng Container Registry để lưu trữ các vùng chứa đã tạo
  • Cách triển khai Cloud Run
  • Cách chạy di chuyển giản đồ cơ sở dữ liệu trong Cloud Build

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png.

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Google Cloud Shell

Mặc dù bạn có thể điều khiển Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

3c1dabeca90e44e5.png

Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật Cloud API

Trong Cloud Shell, hãy bật API đám mây cho các thành phần sẽ được sử dụng:

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

Vì đây là lần đầu tiên bạn gọi các API từ gcloud, nên bạn sẽ được yêu cầu cho phép bằng thông tin đăng nhập của mình để đưa ra yêu cầu này. Quá trình này sẽ diễn ra một lần cho mỗi phiên Cloud Shell.

Thao tác này có thể mất vài phút để hoàn tất.

Sau khi hoàn tất, một thông báo thành công tương tự như thông báo này sẽ xuất hiện:

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

4. Tạo dự án mẫu

Bạn sẽ sử dụng mẫu dự án Django mặc định làm dự án Django mẫu.

Để tạo dự án mẫu này, hãy dùng Cloud Shell để tạo một thư mục mới có tên là django-cloudrun rồi chuyển đến thư mục đó:

mkdir ~/django-cloudrun
cd ~/django-cloudrun

Sau đó, cài đặt Django vào một môi trường ảo tạm thời:

virtualenv venv
source venv/bin/activate
pip install Django

Lưu danh sách các gói đã cài đặt vào requirements.txt

pip freeze > requirements.txt

Danh sách này phải bao gồm Django và các phần phụ thuộc của nó: sqlparseasgiref.

Sau đó, hãy tạo một dự án mẫu mới:

django-admin startproject myproject .

Bạn sẽ thấy một tệp mới có tên manage.py và một thư mục mới có tên myproject. Thư mục này sẽ chứa một số tệp, bao gồm cả settings.py.

Xác nhận nội dung của thư mục cấp cao nhất đúng như dự kiến:

ls -F
manage.py myproject/ requirements.txt venv/

Xác nhận nội dung của thư mục myproject đúng như dự kiến:

ls -F myproject/
__init__.py asgi.py settings.py  urls.py  wsgi.py

Giờ đây, bạn có thể thoát và xoá môi trường ảo tạm thời:

deactivate
rm -rf venv

Từ đây, Django sẽ được gọi bên trong vùng chứa.

5. Tạo dịch vụ sao lưu

Bây giờ, bạn sẽ tạo các dịch vụ sao lưu: một tài khoản dịch vụ chuyên dụng, một Cấu phần phần mềm lưu trữ, một cơ sở dữ liệu Cloud SQL, một bộ chứa Cloud Storage và một số giá trị của Trình quản lý bí mật.

Việc bảo mật giá trị của các mật khẩu dùng trong quá trình triển khai là rất quan trọng đối với tính bảo mật của mọi dự án, đồng thời đảm bảo rằng không ai vô tình đặt mật khẩu ở nơi không thuộc về (ví dụ: trực tiếp trong tệp cài đặt hoặc được nhập trực tiếp vào thiết bị đầu cuối nơi có thể truy xuất mật khẩu từ lịch sử).

Để bắt đầu, hãy đặt 2 biến môi trường cơ sở, một biến cho Mã dự án:

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

Và một tuỳ chọn cho khu vực:

REGION=us-central1

Tạo một tài khoản dịch vụ

Để giới hạn quyền truy cập của dịch vụ vào các phần khác của Google Cloud, hãy tạo một tài khoản dịch vụ chuyên dụng:

gcloud iam service-accounts create cloudrun-serviceaccount

Bạn sẽ tham khảo tài khoản này bằng email của tài khoản trong các phần sau của lớp học lập trình này. Đặt giá trị đó trong một biến môi trường:

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

Tạo sổ đăng ký Artifact

Để lưu trữ hình ảnh vùng chứa đã tạo, hãy tạo một kho lưu trữ vùng chứa ở khu vực bạn đã chọn:

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

Bạn sẽ tham chiếu sổ đăng ký này theo tên trong các phần sau của lớp học lập trình này:

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

Tạo cơ sở dữ liệu

Tạo phiên bản Cloud SQL:

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

Thao tác này có thể mất vài phút để hoàn tất.

Trong trường hợp đó, hãy tạo một cơ sở dữ liệu:

gcloud sql databases create mydatabase --instance myinstance

Trong cùng trường hợp đó, hãy tạo người dùng:

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

Cấp quyền cho tài khoản dịch vụ để kết nối với thực thể:

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

Tạo bộ chứa bộ nhớ

Tạo một bộ chứa Cloud Storage (lưu ý rằng tên phải là duy nhất trên toàn hệ thống):

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

Cấp quyền cho tài khoản dịch vụ để quản trị bộ chứa:

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

Lưu trữ cấu hình ở dạng bí mật

Sau khi thiết lập các dịch vụ sao lưu, bạn sẽ lưu trữ các giá trị này trong một tệp được bảo vệ bằng Trình quản lý bí mật.

Secret Manager cho phép bạn lưu trữ, quản lý và truy cập vào các thông tin bí mật dưới dạng tệp nhị phân hoặc chuỗi văn bản. Thư viện này hoạt động tốt để lưu trữ thông tin cấu hình, chẳng hạn như mật khẩu cơ sở dữ liệu, khoá API hoặc chứng chỉ TLS mà ứng dụng cần trong thời gian chạy.

Trước tiên, hãy tạo một tệp có các giá trị cho chuỗi kết nối cơ sở dữ liệu, bộ chứa nội dung nghe nhìn, khoá bí mật cho Django (dùng để ký mã hoá các phiên và mã thông báo) và để bật tính năng gỡ lỗi:

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

Sau đó, hãy tạo một khoá bí mật có tên là application_settings, dùng tệp đó làm mã bí mật:

gcloud secrets create application_settings --data-file .env

Cho phép tài khoản dịch vụ truy cập vào khoá bí mật này:

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

Xác nhận khoá bí mật đã được tạo bằng cách liệt kê các khoá bí mật:

gcloud secrets versions list application_settings

Sau khi xác nhận khoá bí mật đã được tạo, hãy xoá tệp trên máy bằng cách làm như sau:

rm .env

6. Định cấu hình ứng dụng

Do các dịch vụ sao lưu mà bạn vừa tạo, bạn cần thực hiện một số thay đổi cho dự án mẫu cho phù hợp.

Điều này sẽ bao gồm việc giới thiệu django-environ để sử dụng các biến môi trường làm chế độ cài đặt cấu hình. Bạn sẽ tạo giá trị ban đầu bằng các giá trị mà bạn đã xác định là bí mật. Để triển khai việc này, bạn sẽ mở rộng chế độ cài đặt mẫu. Bạn cũng sẽ cần thêm các phần phụ thuộc Python khác.

Định cấu hình chế độ cài đặt

Di chuyển tệp settings.py, đổi tên tệp thành basesettings.py:

mv myproject/settings.py myproject/basesettings.py

Sử dụng trình chỉnh sửa web Cloud Shell, tạo một tệp settings.py mới có đoạn mã sau:

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",
   
},
}

Hãy dành thời gian đọc phần bình luận được thêm vào về từng cấu hình.

Xin lưu ý rằng bạn có thể thấy các lỗi tìm lỗi mã nguồn trên tệp này. Lỗi này có thể xảy ra. Cloud Shell không có ngữ cảnh về các yêu cầu đối với dự án này, do đó có thể báo cáo các lệnh nhập không hợp lệ và các lệnh nhập không dùng đến.

Phần phụ thuộc Python

Tìm tệp requirements.txt rồi thêm các gói sau:

cloudshell edit requirements.txt

requirements.txt (nối thêm)

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

Xác định hình ảnh ứng dụng

Cloud Run sẽ chạy mọi vùng chứa miễn là vùng chứa đó tuân thủ Hợp đồng vùng chứa Cloud Run. Hướng dẫn này chọn bỏ qua Dockerfile, thay vào đó sử dụng Cloud Native Buildpacks. Gói xây dựng hỗ trợ việc tạo vùng chứa cho các ngôn ngữ phổ biến, bao gồm cả Python.

Hướng dẫn này chọn tuỳ chỉnh Procfile dùng để khởi động ứng dụng web.

Để chứa dự án mẫu, trước tiên hãy tạo một tệp mới có tên Procfile ở cấp cao nhất của dự án (trong cùng thư mục với manage.py), rồi sao chép nội dung sau:

touch Procfile
cloudshell edit Procfile

Tệp Procfile

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

7. Định cấu hình, tạo và chạy các bước di chuyển

Để tạo giản đồ cơ sở dữ liệu trong cơ sở dữ liệu Cloud SQL và điền tài sản tĩnh vào bộ chứa của Cloud Storage, bạn cần chạy migratecollectstatic.

Các lệnh di chuyển Django cơ sở này cần được chạy trong ngữ cảnh của hình ảnh vùng chứa đã tạo có quyền truy cập vào cơ sở dữ liệu của bạn.

Bạn cũng cần chạy createsuperuser để tạo tài khoản quản trị viên nhằm đăng nhập vào trang quản trị Django.

Để thực hiện việc này, bạn sẽ sử dụng Công việc trên Cloud Run để thực hiện các tác vụ này. Các công việc trong Cloud Run giúp bạn chạy các quy trình có phần cuối xác định sẵn, nên rất phù hợp với các công việc quản trị.

Xác định mật khẩu của người dùng cấp cao Django

Để tạo siêu người dùng, bạn sẽ sử dụng phiên bản không tương tác của lệnh createsuperuser. Lệnh này yêu cầu một biến môi trường được đặt tên đặc biệt để sử dụng thay cho lời nhắc nhập mật khẩu.

Tạo một khoá bí mật mới bằng mật khẩu được tạo ngẫu nhiên:

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=-

Cho phép tài khoản dịch vụ của bạn truy cập vào mã thông báo bí mật này:

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

Cập nhật Procfile

Để giúp các công việc trên Cloud Run rõ ràng hơn, hãy tạo lối tắt trong Procfile, thêm các điểm truy cập sau vào Procfile:

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

Bây giờ, bạn sẽ có 3 mục nhập: điểm truy cập web mặc định, điểm truy cập migrate để áp dụng các hoạt động di chuyển cơ sở dữ liệu và điểm truy cập createuser để chạy lệnh createsuperuser.

Tạo hình ảnh ứng dụng

Với các bản cập nhật Procfile tại chỗ, hãy tạo hình ảnh:

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

Tạo công việc trên Cloud Run

Giờ đây, hình ảnh này đã tồn tại, bạn có thể sử dụng hình ảnh này để tạo các công việc trên Cloud Run.

Các công việc này sử dụng hình ảnh được tạo trước đó, nhưng sử dụng các giá trị command khác. Các giá trị này liên kết với các giá trị trong Procfile.

Tạo một công việc để di chuyển:

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

Tạo một công việc để tạo người dùng:

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

Thực thi công việc trên Cloud Run

Khi đã thiết lập cấu hình công việc, hãy chạy các hoạt động di chuyển:

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

Đảm bảo kết quả của lệnh này cho biết quá trình thực thi "đã hoàn tất thành công".

Bạn sẽ chạy lệnh này sau khi cập nhật ứng dụng.

Với chế độ thiết lập cơ sở dữ liệu, hãy tạo người dùng bằng công việc:

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

Đảm bảo rằng kết quả lệnh này cho biết quá trình thực thi "đã hoàn tất thành công".

Bạn sẽ không phải chạy lại lệnh này.

8. Triển khai lên Cloud Run

Sau khi các dịch vụ sao lưu được tạo và điền sẵn, giờ đây bạn có thể tạo dịch vụ Cloud Run để truy cập vào các dịch vụ đó.

Triển khai dịch vụ này cho Cloud Run bằng hình ảnh bạn đã tạo trước đó, với lệnh sau:

gcloud run deploy django-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

Khi thành công, dòng lệnh sẽ hiển thị URL dịch vụ:

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

Giờ đây, bạn có thể truy cập vùng chứa đã triển khai bằng cách mở URL này trong trình duyệt web:

d2dfaf668baabfcc.png

9. Truy cập vào Bảng điều khiển dành cho quản trị viên của Django

Một trong những tính năng chính của Django là quản trị tương tác.

Cập nhật chế độ cài đặt CSRF

Django có các biện pháp bảo vệ chống lại Hành vi giả mạo yêu cầu trên nhiều trang web (CSRF). Bất cứ khi nào biểu mẫu được gửi trên trang web Django của bạn, bao gồm cả việc đăng nhập vào quản trị viên Django, cài đặt Nguồn gốc đáng tin cậy sẽ được kiểm tra. Nếu không khớp với nguồn gốc của yêu cầu, Django sẽ trả về lỗi.

Trong tệp mysite/settings.py, nếu biến môi trường CLOUDRUN_SERVICE_URL được xác định, thì biến này sẽ được dùng trong chế độ cài đặt CSRF_TRUSTED_ORIGINSALLOWED_HOSTS. Mặc dù không bắt buộc phải xác định ALLOWED_HOSTS, nhưng bạn nên thêm thuộc tính này vì thuộc tính này là bắt buộc đối với CSRF_TRUSTED_ORIGINS.

Vì cần có URL dịch vụ nên bạn không thể thêm cấu hình này cho đến sau lần triển khai đầu tiên.

Bạn sẽ phải cập nhật dịch vụ của mình để thêm biến môi trường này. Bạn có thể thêm mã này vào mã thông báo bí mật application_settings hoặc thêm trực tiếp dưới dạng biến môi trường.

Cách triển khai bên dưới tận dụng định dạngthoát của gcloud.

Truy xuất URL dịch vụ của bạn:

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

Đặt giá trị này làm biến môi trường trên dịch vụ Cloud Run:

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

Đăng nhập vào Bảng điều khiển dành cho quản trị viên của Django

Để truy cập vào giao diện quản trị của Django, hãy thêm /admin vào URL dịch vụ của bạn.

Bây giờ, hãy đăng nhập bằng tên người dùng "admin" và truy xuất mật khẩu bằng lệnh sau:

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

678cd382b7039769.pngS

de755ef7a1779dc6.png

10. Phát triển ứng dụng của bạn

Khi phát triển ứng dụng, bạn sẽ muốn kiểm thử ứng dụng trên thiết bị. Để làm được việc đó, bạn cần kết nối với cơ sở dữ liệu Cloud SQL ("bản chính thức") hoặc cơ sở dữ liệu cục bộ ("kiểm thử").

Kết nối với cơ sở dữ liệu sản xuất

Bạn có thể kết nối với các phiên bản Cloud SQL bằng cách sử dụng Proxy xác thực Cloud SQL. Ứng dụng này tạo kết nối từ máy cục bộ của bạn với cơ sở dữ liệu.

Sau khi bạn cài đặt Proxy xác thực Cloud SQL, hãy làm theo các bước sau:

# 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

Hãy nhớ xoá tệp temp_settings sau khi hoàn thành công việc.

Kết nối với cơ sở dữ liệu SQLite cục bộ

Ngoài ra, bạn có thể sử dụng cơ sở dữ liệu cục bộ khi phát triển ứng dụng của mình. Django hỗ trợ cả cơ sở dữ liệu PostgreSQL và SQLite. PostgreSQL có một số tính năng mà SQLite không có, nhưng trong nhiều trường hợp, chức năng của hai cơ sở dữ liệu này giống hệt nhau.

Để thiết lập SQLite, bạn sẽ phải cập nhật các chế độ cài đặt ứng dụng của mình để trỏ đến một cơ sở dữ liệu cục bộ, sau đó, bạn sẽ phải áp dụng việc di chuyển giản đồ.

Cách thiết lập phương thức này:

# 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

Hãy nhớ xoá tệp temp_settings sau khi bạn hoàn tất công việc.

Tạo quá trình di chuyển

Khi thay đổi mô hình cơ sở dữ liệu, có thể bạn cần tạo các tệp di chuyển của Django bằng cách chạy python manage.py makemigrations.

Bạn có thể chạy lệnh này sau khi thiết lập kết nối cơ sở dữ liệu kiểm thử hoặc sản xuất. Ngoài ra, bạn có thể tạo các tệp di chuyển mà không cần cơ sở dữ liệu bằng cách cung cấp chế độ cài đặt trống:

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

Đang áp dụng các bản cập nhật ứng dụng

Để áp dụng các thay đổi cho ứng dụng, bạn cần:

  • tạo thay đổi thành một hình ảnh mới,
  • áp dụng bất kỳ cơ sở dữ liệu hoặc di chuyển tĩnh nào, sau đó
  • cập nhật dịch vụ Cloud Run để sử dụng hình ảnh mới.

Cách tạo hình ảnh:

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

Nếu bạn có bất kỳ quá trình di chuyển nào cần áp dụng, hãy chạy công việc trên Cloud Run:

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

Cách cập nhật dịch vụ của bạn bằng hình ảnh mới:

gcloud run services update django-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage

11. Xin chúc mừng!

Bạn vừa triển khai một dự án phức tạp trên Cloud Run!

  • Cloud Run tự động điều chỉnh tỷ lệ hình ảnh vùng chứa theo chiều ngang để xử lý các yêu cầu đã nhận được, sau đó thu nhỏ khi nhu cầu giảm. Bạn chỉ phải trả phí cho CPU, bộ nhớ và kết nối mạng được sử dụng trong quá trình xử lý yêu cầu.
  • Cloud SQL cho phép bạn cung cấp một phiên bản PostgreSQL được quản lý (được duy trì tự động cho bạn) và tích hợp nguyên gốc vào nhiều hệ thống của Google Cloud.
  • Cloud Storage hỗ trợ bạn sử dụng bộ nhớ trên đám mây theo cách có thể truy cập liền mạch trong Django.
  • Secret Manager cho phép bạn lưu trữ các dữ liệu bí mật và chỉ cho phép một số phần của Google Cloud truy cập vào các dữ liệu đó.

Dọn dẹp

Để tránh phát sinh phí vào tài khoản Google Cloud Platform của bạn cho các tài nguyên được sử dụng trong hướng dẫn này:

  • Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  • Trong danh sách dự án, hãy chọn dự án của bạn rồi nhấp vào Xoá.
  • Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Shut down (Tắt) để xoá dự án.

Tìm hiểu thêm