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 được thông 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 kho lưu trữ đối tượng hợp nhất và Trình quản lý bí mật để quản lý bí mật.
Wagtail là một hệ thống quản lý nội dung (CMS) nguồn mở đượ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 Wagtail nhỏ.
Lưu ý: Lần gần đây nhất lớp học lập trình này được xác minh bằng Wagtail 5.2.2, phiên bản này hỗ trợ Django 5.
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á truy cập 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 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 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 tốc độ của riêng bạn
- Đă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 thông tin này.
- 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 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ử 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.
- 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
- 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. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và xác thực. Bạn có thể thực hiện hầu hết (nếu không phải tất cả) công việc trong lớp học lập trình này 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ả của 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 không, bạn có thể đặt giá trị 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 API từ gcloud, nên bạn sẽ được yêu cầu uỷ quyền sử dụng thông tin xác thực 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ư sau 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 Wagtail mặc định làm dự án Wagtail mẫu. Để làm việc này, bạn sẽ tạm thời cài đặt Wagtail để tạo mẫu.
Để tạo dự án mẫu này, hãy sử dụng Cloud Shell để tạo một thư mục mới có tên wagtail-cloudrun
rồi chuyển đến thư mục đó:
mkdir ~/wagtail-cloudrun cd ~/wagtail-cloudrun
Sau đó, hãy cài đặt Wagtail vào một môi trường ảo tạm thời:
virtualenv venv source venv/bin/activate pip install wagtail
Sau đó, hãy tạo một dự án mẫu mới trong thư mục hiện tại:
wagtail start myproject .
Bây giờ, bạn sẽ có một dự án Wagtail mẫu trong thư mục hiện tại:
ls -F
Dockerfile home/ manage.py* myproject/ requirements.txt search/ 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, Wagtail sẽ được gọi 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 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ộ nhớ được tạo mới:
gsutil cors set cors.json gs://$GS_BUCKET_NAME
Lưu cấu hình dưới dạng khoá 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 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
, sử dụng tệp đó làm khoá 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 đã tạo khoá bí mật, hãy xoá tệp cục bộ:
rm .env
6. Định cấu hình ứng dụng
Dự án mẫu mà bạn đã tạo trước đó hiện cần một số thay đổi. Những thay đổi này sẽ làm giảm độ phức tạp của cấu hình cài đặt mẫu đi kèm với Wagtail, đồng thời tích hợp Wagtail với các dịch vụ sao lưu mà bạn đã tạo trước đó.
Thiết lập chế độ cài đặt
Tìm tệp cài đặt base.py
đã tạo rồi đổi tên tệp đó thành basesettings.py
trong thư mục myproject
chính:
mv myproject/settings/base.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",
},
}
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 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.
Sau đó, hãy xoá thư mục cài đặt cũ.
rm -rf myproject/settings/
Sau đó, bạn sẽ có hai tệp cài đặt: một tệp từ Wagtail và một tệp bạn vừa tạo được tạo từ các chế độ cài đặt này:
ls myproject/*settings*
myproject/basesettings.py myproject/settings.py
Cuối cùng, hãy mở tệp cài đặt manage.py
và cập nhật cấu hình để yêu cầu Wagtail trỏ đến tệp settings.py
chính.
cloudshell edit manage.py
Dòng manage.py (trước đây)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev")
Dòng manage.py (sau)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
Thực hiện thay đổi cấu hình tương tự cho tệp myproject/wsgi.py
:
cloudshell edit myproject/wsgi.py
Dòng myproject/wsgi.py (trước)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev")
dòng myproject/wsgi.py (sau)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
Xoá Dockerfile được tạo tự động:
rm Dockerfile
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. 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.
Để đó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 các thành phần tĩnh vào bộ chứa Cloud Storage, bạn cần chạy migrate
và collectstatic
.
Bạn cần chạy các lệnh di chuyển Django cơ sở nà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.
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ông việc trên Cloud Run cho phép bạn chạy các quy trình có điểm kết thúc xác định, giúp công việc này trở nên lý tưởng cho các tác vụ quản trị.
Xác định mật khẩu của người dùng cấp cao 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ụ truy cập vào khoá 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
Sau khi cập nhật Procfile, 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 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 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ẽ không phải chạy lại lệnh này.
8. Triển khai lên Cloud Run
Giờ đây, khi các dịch vụ sao lưu đã được tạo và điền sẵn, bạn có thể tạo dịch vụ Cloud Run để truy cập vào các dịch vụ đó.
Bạn có thể tạo bản triển khai ban đầu của ứng dụng được đóng gói trong vùng chứa lên Cloud Run bằng lệnh sau:
gcloud run deploy wagtail-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 [wagtail-cloudrun] revision [wagtail-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic. Service URL: https://wagtail-cloudrun-...run.app
Giờ đây, bạn có thể truy cập vào vùng chứa đã triển khai bằng cách mở URL này trong trình duyệt web:
9. Truy cập vào trang quản trị Django
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 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ụ để thêm biến môi trường này. Bạn có thể thêm khoá này vào khoá 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ụ:
CLOUDRUN_SERVICE_URLS=$(gcloud run services describe wagtail-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 wagtail-cloudrun \ --region $REGION \ --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"
Đăng nhập vào trang quản trị Django
Để truy cập vào giao diện quản trị 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. Phát triển ứng dụng
Khi phát triển ứng dụng, bạn sẽ muốn kiểm thử ứng dụng đó trên máy. Để 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 chính thức
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 một kết nối từ máy cục bộ của bạn đến 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 bạn hoàn tất 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. 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 chế độ cài đặt ứng dụng để trỏ đến cơ sở dữ liệu cục bộ, sau đó bạn sẽ phải áp dụng các hoạt động 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 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 ứng dụng, bạn cần:
- tạo các 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ụ bằng hình ảnh mới:
gcloud run services update wagtail-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 lê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à mạng được sử dụng trong quá trình xử lý yêu cầu.
- Cloud SQL cho phép bạn cấp phép một phiên bản PostgreSQL được quản lý được tự động bảo trì cho bạn và tích hợp sẵn 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 bị tính phí cho tài khoản Google Cloud Platform của bạn đối với các tài nguyên được sử dụng trong hướng dẫn này, hãy làm như sau:
- 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 bằng 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
/