Thông tin về lớp học lập trình này
1. Giới thiệu
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à một dịch vụ không máy chủ: dịch vụ này tóm tắt tất cả hoạt động quản lý cơ sở hạ tầng để bạn có thể tập trung vào điều 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 CMS là một hệ thống quản lý nội dung (CMS) dành cho doanh nghiệp, được xây dựng dựa trên Django. 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 CMS nhỏ.
Lưu ý: Lần gần nhất lớp học lập trình này được xác minh là với Django CMS 4.1.2 thông qua django-cms/cms-template v4.1.
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 Cloud Storage
- Cách tạo khoá bí mật trong Secret Manager
- Cách sử dụng Khoá bí mật trong nhiều dịch vụ của Google Cloud
- Cách kết nối các thành phần của Google Cloud với một dịch vụ Cloud Run
- Cách sử dụng Container Registry để lưu trữ vùng chứa đã đóng
- Cách triển khai lên Cloud Run
- Cách chạy hoạt động di chuyển giản đồ cơ sở dữ liệu trong Cloud Build
2. Cách thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đă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.
- Tên dự án là tên hiển thị cho 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 trên 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 bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (thường được xác định là
PROJECT_ID
). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng 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. - Xin lưu ý rằng có một giá trị thứ ba là Mã 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 này.
- 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 phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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ể vận hành 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 trong Đám mây.
Kích hoạt Cloud Shell
- Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.
Nếu đây là lần đầu tiên bạ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 thấy một màn hình trung gian, hãy nhấp vào Tiếp tục.
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
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 của bạn.
- 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`
- 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ả của 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ả của 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ẽ chỉ 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 một dự án mẫu
Bạn sẽ sử dụng cms-template của Django CMS làm dự án Django CMS mẫu của mình.
Để 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à djangocms-cloudrun
rồi chuyển đến thư mục đó:
mkdir ~/djangocms-cloudrun cd ~/djangocms-cloudrun
Cài đặt gói django-cms vào một môi trường ảo tạm thời:
virtualenv venv source venv/bin/activate pip install djangocms-frontend\[cms-4]
Tạo bản sao của dự án cms-template:
django-admin startproject --template https://github.com/django-cms/cms-template/archive/4.1.zip myproject .
Bây giờ, bạn đã có một dự án Django CMS mẫu trong thư mục tên là myproject
:
ls -F
manage.py* media/ myproject/ project.db requirements.in requirements.txt static/ venv/
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 CMS sẽ được gọi trong vùng chứa.
Bạn cũng có thể xoá tệp yêu cầu được sao chép tự động (do pip-tools sử dụng để tạo tệp yêu cầu.txt). Phương thức này sẽ không được dùng cho lớp học lập trình này:
rm requirements.in
5. Tạo các 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 các giá trị của mật khẩu dùng trong quá trình triển khai rất quan trọng đối với tính bảo mật của mọi dự án và đảm bảo rằng không ai vô tình đặt mật khẩu vào nơi không phù hợp (ví dụ: trực tiếp trong tệp cài đặt hoặ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ừ nhật ký).
Để bắt đầu, hãy đặt hai 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 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 chiếu tài khoản này theo 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 Artifact Registry
Để 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 một thực thể đó, hãy tạo một 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 ý tên phải là duy nhất trên toàn cầu):
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
Vì các đối tượng được lưu trữ trong bộ chứa sẽ có nguồn gốc khác (URL bộ chứa thay vì URL Cloud Run), nên bạn cần định cấu hình chế độ cài đặt Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS).
Tạo một tệp mới có tên là cors.json
, với nội dung sau:
touch cors.json cloudshell edit cors.json
cors.json
[
{
"origin": ["*"],
"responseHeader": ["Content-Type"],
"method": ["GET"],
"maxAgeSeconds": 3600
}
]
Áp dụng cấu hình CORS này cho bộ chứa lưu trữ mới tạo:
gsutil cors set cors.json gs://$GS_BUCKET_NAME
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ý khoá 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. Phương thức này hoạt động hiệu quả để lưu trữ thông tin cấu hình 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 phương tiện, khoá bí mật cho Django (dùng để ký phiên và mã thông báo bằng mật mã) 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 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, hãy tạo một tệp settings.py
mới bằng 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",
},
}
Dành thời gian đọc phần bình luận được thêm về mỗi cấu hình.
Xin lưu ý rằng bạn có thể thấy 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ó bối cảnh về các yêu cầu của dự án này, nên có thể báo cáo các tệp nhập không hợp lệ và các tệp nhập không dùng đến.
Các 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 (thêm vào)
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. Các bản 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.
Để đóng gói dự án mẫu, trước tiên, hãy tạo một tệp mới có tên là 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
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 migrate
và collectstatic
.
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 sẽ cần chạy createsuperuser
để tạo tài khoản quản trị viên nhằm đăng nhập vào quản trị viên Django.
Để thực hiện việc này, bạn sẽ dùng Cloud Run Job để 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 dành cho siêu người dùng Django
Để tạo người dùng cấp cao, 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 trở nên rõ ràng hơn, hãy tạo lối tắt trong Procfile của bạn, thêm các điểm nhậ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, khi hình ảnh đã tồn tại, bạn có thể tạo công việc trên Cloud Run bằng hình ảnh đó.
Các công việc này sử dụng hình ảnh đã tạo trước đó, nhưng sử dụng các giá trị command
khác nhau. 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 cho quá trình 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 quá trình 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 vào lúc khác khi cập nhật ứng dụng.
Khi thiết lập cơ sở dữ liệu, hãy tạo người dùng bằng cách sử dụ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ụ đó.
Quá trình triển khai ban đầu của ứng dụng trong vùng chứa lên Cloud Run được tạo bằng lệnh sau:
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
Hãy đợi vài phút cho đến khi quá trình triển khai hoàn tất. Nếu thành công, dòng lệnh sẽ hiển thị URL của dịch vụ:
Service [djangocms-cloudrun] revision [djangocms-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic. Service URL: https://djangocms-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:
Vì đây là lần cài đặt mới nên bạn sẽ được tự động chuyển hướng đến trang đăng nhập.
9. Truy cập vào trang quản trị Django
Một trong những tính năng chính của Django CMS là trang quản trị tương tác.
Cập nhật chế độ cài đặt CSRF
Django cung cấp 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 một 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 trang quản trị Django, chế độ cài đặt Nguồn gốc đáng tin cậy sẽ được đánh dấu. 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_ORIGINS
và ALLOWED_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ì bạn cần 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 tính năng định dạng và tách biệt của gcloud.
Truy xuất URL dịch vụ của bạn:
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
Đặt giá trị này làm biến môi trường trên dịch vụ Cloud Run:
gcloud run services update djangocms-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 ""
10. Áp dụng bản cập nhật ứng dụng
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 việc đó, bạn cần kết nối với cơ sở dữ liệu Cloud SQL ("phiên 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. Có một số tính năng PostgreSQL có mà SQLite không có, nhưng trong nhiều trường hợp, chức năng 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 hoàn thành công việc.
Tạo quá trình di chuyển
Khi thực hiện thay đổi đối với các mô hình cơ sở dữ liệu, bạn có thể cần tạo 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 chính thức hoặc thử nghiệm. 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
Áp dụng bản cập nhật ứng dụng
Để áp dụng các thay đổi cho đơn đăng ký, bạn cần phải:
- tạo các thay đổi thành hình ảnh mới,
- áp dụng bất kỳ cơ sở dữ liệu hoặc quá trình 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 djangocms-cloudrun \ --platform managed \ --region $REGION \ --image gcr.io/${PROJECT_ID}/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 và theo chiều ngang mở rộng hình ảnh vùng chứa để xử lý các yêu cầu đã nhận được, sau đó thu hẹp 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 cho phép bạn có bộ nhớ trên đám mây theo cách 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
- Django trên Cloud Run: https://cloud.google.com/python/django/run
- Xin chào Cloud Run với Python: https://codelabs.developers.google.com/codelabs/cloud-run-hello-python3
- Python trên Google Cloud: https://cloud.google.com/python
- Ứng dụng Google Cloud Python: https://github.com/googleapis/google-cloud-python