1. บทนำ

Cloud Run เป็นแพลตฟอร์มคำนวณที่มีการจัดการซึ่งทำให้คุณเรียกใช้คอนเทนเนอร์แบบไม่เก็บสถานะที่เรียกใช้ผ่านคำขอ HTTP ได้ Cloud Run เป็นแบบ Serverless ด้วยการตัดการจัดการโครงสร้างพื้นฐานทั้งหมดออก คุณจึงมุ่งเน้นไปที่การสร้างแอปพลิเคชันที่ยอดเยี่ยม ซึ่งเป็นสิ่งที่สำคัญที่สุดได้
นอกจากนี้ยังเชื่อมต่อกับส่วนอื่นๆ ของระบบนิเวศ Google Cloud ได้โดยตรง ซึ่งรวมถึง Cloud SQL สำหรับฐานข้อมูลที่มีการจัดการ, Cloud Storage สำหรับที่เก็บข้อมูลออบเจ็กต์แบบรวม และ Secret Manager สำหรับการจัดการข้อมูลลับ
Django CMS คือระบบจัดการเนื้อหา (CMS) ระดับองค์กรที่สร้างขึ้นบน Django Django เป็นเฟรมเวิร์กเว็บ Python ระดับสูง
ในบทแนะนำนี้ คุณจะได้ใช้คอมโพเนนต์เหล่านี้เพื่อทำให้โปรเจ็กต์ Django CMS ขนาดเล็กใช้งานได้
หมายเหตุ: Codelab นี้ได้รับการยืนยันครั้งล่าสุดกับ Django CMS 4.1.2 ผ่าน django-cms/cms-template v4.1
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ Cloud Shell
- วิธีสร้างฐานข้อมูล Cloud SQL
- วิธีสร้างที่เก็บข้อมูล Cloud Storage
- วิธีสร้างข้อมูลลับของ Secret Manager
- วิธีใช้ Secret จากบริการต่างๆ ของ Google Cloud
- วิธีเชื่อมต่อคอมโพเนนต์ Google Cloud กับบริการ Cloud Run
- วิธีใช้ Container Registry เพื่อจัดเก็บคอนเทนเนอร์ที่สร้างขึ้น
- วิธีทำให้ใช้งานได้กับ Cloud Run
- วิธีเรียกใช้การย้ายข้อมูลสคีมาฐานข้อมูลใน Cloud Build
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
Google Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากแล็ปท็อปได้จากระยะไกล แต่ใน Codelab นี้เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell


หากคุณเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า Cloud Shell คืออะไร หากเห็นหน้าจอระดับกลาง ให้คลิกต่อไป

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

เครื่องเสมือนนี้โหลดเครื่องมือพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานส่วนใหญ่หรือทั้งหมดในโค้ดแล็บนี้ได้ด้วยเบราว์เซอร์
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์และระบบได้ตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์ของคุณ
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list
เอาต์พุตของคำสั่ง
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
เอาต์พุตของคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตของคำสั่ง
Updated property [core/project].
3. เปิดใช้ Cloud API
จาก Cloud Shell ให้เปิดใช้ Cloud API สำหรับคอมโพเนนต์ที่จะใช้
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
เนื่องจากคุณเรียก API จาก gcloud เป็นครั้งแรก ระบบจะขอให้คุณให้สิทธิ์โดยใช้ข้อมูลเข้าสู่ระบบเพื่อส่งคำขอนี้ โดยจะเกิดขึ้น 1 ครั้งต่อเซสชัน Cloud Shell
การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์
เมื่อเสร็จสมบูรณ์แล้ว คุณควรเห็นข้อความแสดงความสำเร็จที่คล้ายกับข้อความนี้
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
4. สร้างโปรเจ็กต์เทมเพลต
คุณจะใช้ Django CMS cms-template เป็นโปรเจ็กต์ Django CMS ตัวอย่าง
หากต้องการสร้างโปรเจ็กต์เทมเพลตนี้ ให้ใช้ Cloud Shell เพื่อสร้างไดเรกทอรีใหม่ชื่อ djangocms-cloudrun แล้วไปที่ไดเรกทอรีดังกล่าว
mkdir ~/djangocms-cloudrun cd ~/djangocms-cloudrun
ติดตั้งแพ็กเกจ django-cms ในสภาพแวดล้อมเสมือนชั่วคราวโดยทำดังนี้
virtualenv venv source venv/bin/activate pip install djangocms-frontend\[cms-4]
สร้างสำเนาโปรเจ็กต์ cms-template
django-admin startproject --template https://github.com/django-cms/cms-template/archive/4.1.zip myproject .
เปลี่ยนชื่อไฟล์ requirements.in เป็น requirements.txt (.in ไฟล์นี้สร้างขึ้นโดย pip-tools เพื่อสร้างไฟล์ requirements.txt แต่สามารถใช้ได้เลยหากเปลี่ยนนามสกุล ในขั้นตอนต่อๆ ไป pip คาดหวังส่วนขยาย .txt)
mv requirements.in requirements.txt
ตอนนี้คุณจะมีโปรเจ็กต์เทมเพลต Django CMS ในโฟลเดอร์ชื่อ myproject
ls -F
manage.py* media/ myproject/ project.db requirements.txt static/ venv/
ตอนนี้คุณสามารถออกและนำสภาพแวดล้อมเสมือนชั่วคราวออกได้โดยทำดังนี้
deactivate rm -rf venv
จากนั้นจะเรียกใช้ Django CMS ภายในคอนเทนเนอร์
5. สร้างบริการแบ็กเอนด์
ตอนนี้คุณจะสร้างบริการสนับสนุน ได้แก่ บัญชีบริการเฉพาะ, Artifact Registry, ฐานข้อมูล Cloud SQL, ที่เก็บข้อมูล Cloud Storage และค่า Secret Manager จำนวนหนึ่ง
การรักษาความปลอดภัยของค่ารหัสผ่านที่ใช้ในการติดตั้งใช้งานเป็นสิ่งสำคัญต่อความปลอดภัยของโปรเจ็กต์ และช่วยให้มั่นใจได้ว่าจะไม่มีใครป้อนรหัสผ่านในตำแหน่งที่ไม่ควร (เช่น ในไฟล์การตั้งค่าโดยตรง หรือพิมพ์ลงในเทอร์มินัลโดยตรง ซึ่งอาจดึงข้อมูลจากประวัติได้)
เริ่มต้นด้วยการตั้งค่าตัวแปรสภาพแวดล้อมพื้นฐาน 2 ตัว โดยตัวแปรหนึ่งสำหรับรหัสโปรเจ็กต์
PROJECT_ID=$(gcloud config get-value core/project)
และอีก 1 รายการสำหรับภูมิภาค
REGION=us-central1
สร้างบัญชีบริการ
หากต้องการจำกัดสิทธิ์เข้าถึงที่บริการจะมีต่อส่วนอื่นๆ ของ Google Cloud ให้สร้างบัญชีบริการเฉพาะ
gcloud iam service-accounts create cloudrun-serviceaccount
คุณจะอ้างอิงบัญชีนี้ด้วยอีเมลในส่วนต่างๆ ของโค้ดแล็บนี้ในอนาคต ตั้งค่าดังกล่าวในตัวแปรสภาพแวดล้อม
SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
--filter cloudrun-serviceaccount --format "value(email)")
สร้าง Artifact Registry
หากต้องการจัดเก็บอิมเมจคอนเทนเนอร์ที่สร้างขึ้น ให้สร้างรีจิสทรีคอนเทนเนอร์ในภูมิภาคที่คุณเลือก
gcloud artifacts repositories create containers --repository-format docker --location $REGION
คุณจะอ้างอิงรีจิสทรีนี้ตามชื่อในส่วนต่างๆ ของโค้ดแล็บนี้ในอนาคต
ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/containers
สร้างฐานข้อมูล
สร้างอินสแตนซ์ Cloud SQL
gcloud sql instances create myinstance --project $PROJECT_ID \ --database-version POSTGRES_14 --tier db-f1-micro --region $REGION
การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์
ในกรณีดังกล่าว ให้สร้างฐานข้อมูลโดยทำดังนี้
gcloud sql databases create mydatabase --instance myinstance
ในอินสแตนซ์เดียวกัน ให้สร้างผู้ใช้โดยทำดังนี้
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
ให้สิทธิ์บัญชีบริการในการเชื่อมต่อกับอินสแตนซ์
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:${SERVICE_ACCOUNT} \
--role roles/cloudsql.client
สร้างที่เก็บข้อมูล
สร้างที่เก็บข้อมูล Cloud Storage (โปรดทราบว่าชื่อต้องไม่ซ้ำกันทั่วโลก)
GS_BUCKET_NAME=${PROJECT_ID}-media
gcloud storage buckets create gs://${GS_BUCKET_NAME} --location ${REGION}
ให้สิทธิ์แก่บัญชีบริการในการดูแลที่เก็บข้อมูลโดยทำดังนี้
gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET_NAME} \
--member serviceAccount:${SERVICE_ACCOUNT} \
--role roles/storage.admin
เนื่องจากออบเจ็กต์ที่จัดเก็บไว้ในที่เก็บข้อมูลจะมีต้นทางที่แตกต่างกัน (URL ของที่เก็บข้อมูลแทนที่จะเป็น URL ของ Cloud Run) คุณจึงต้องกำหนดค่าการตั้งค่าการแชร์ทรัพยากรข้ามโดเมน (CORS)
สร้างไฟล์ใหม่ชื่อ cors.json โดยมีเนื้อหาดังนี้
touch cors.json cloudshell edit cors.json
cors.json
[
{
"origin": ["*"],
"responseHeader": ["Content-Type"],
"method": ["GET"],
"maxAgeSeconds": 3600
}
]
ใช้การกำหนดค่า CORS นี้กับที่เก็บข้อมูลที่สร้างขึ้นใหม่
gsutil cors set cors.json gs://$GS_BUCKET_NAME
จัดเก็บการกำหนดค่าเป็นข้อมูลลับ
เมื่อตั้งค่าบริการสนับสนุนแล้ว ตอนนี้คุณจะจัดเก็บค่าเหล่านี้ไว้ในไฟล์ที่ได้รับการปกป้องโดยใช้ Secret Manager
Secret Manager ช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับเป็น Blob แบบไบนารีหรือสตริงข้อความได้ ซึ่งเหมาะสำหรับการจัดเก็บข้อมูลการกำหนดค่า เช่น รหัสผ่านฐานข้อมูล คีย์ API หรือใบรับรอง TLS ที่แอปพลิเคชันต้องการในขณะรันไทม์
ก่อนอื่นให้สร้างไฟล์ที่มีค่าสำหรับสตริงการเชื่อมต่อฐานข้อมูล ถังสื่อ คีย์ลับสำหรับ Django (ใช้สำหรับการลงนามแบบเข้ารหัสของเซสชันและโทเค็น) และเพื่อเปิดใช้การแก้ไขข้อบกพร่อง ให้ทำดังนี้
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
จากนั้นสร้างข้อมูลลับชื่อ application_settings โดยใช้ไฟล์ดังกล่าวเป็นข้อมูลลับ
gcloud secrets create application_settings --data-file .env
อนุญาตให้บัญชีบริการเข้าถึงข้อมูลลับนี้
gcloud secrets add-iam-policy-binding application_settings \
--member serviceAccount:${SERVICE_ACCOUNT} --role roles/secretmanager.secretAccessor
ยืนยันว่ามีการสร้างข้อมูลลับโดยแสดงรายการข้อมูลลับ
gcloud secrets versions list application_settings
หลังจากยืนยันว่าสร้างข้อมูลลับแล้ว ให้นำไฟล์ในเครื่องออกโดยทำดังนี้
rm .env
6. กำหนดค่าแอปพลิเคชัน
เนื่องจากบริการแบ็กเอนด์ที่คุณเพิ่งสร้าง คุณจะต้องทำการเปลี่ยนแปลงบางอย่างกับโปรเจ็กต์เทมเพลตเพื่อให้เหมาะสม
ซึ่งรวมถึงการแนะนํา django-environ เพื่อใช้ตัวแปรสภาพแวดล้อมเป็นการตั้งค่าการกําหนดค่า ซึ่งคุณจะเริ่มต้นด้วยค่าที่กําหนดเป็นข้อมูลลับ หากต้องการใช้ฟีเจอร์นี้ คุณจะต้องขยายการตั้งค่าเทมเพลต นอกจากนี้ คุณยังต้องเพิ่มการอ้างอิง Python เพิ่มเติมด้วย
กำหนดการตั้งค่า
ย้ายไฟล์ settings.py แล้วเปลี่ยนชื่อเป็น basesettings.py:
mv myproject/settings.py myproject/basesettings.py
สร้างไฟล์ settings.py ใหม่โดยใช้โปรแกรมแก้ไขเว็บของ Cloud Shell ด้วยโค้ดต่อไปนี้
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",
},
}
โปรดสละเวลาอ่านความคิดเห็นที่เพิ่มเกี่ยวกับการกำหนดค่าแต่ละรายการ
โปรดทราบว่าคุณอาจเห็นข้อผิดพลาดในการตรวจสอบโค้ดในไฟล์นี้ กรณีนี้เป็นสิ่งที่คาดว่าจะเกิดอยู่แล้ว Cloud Shell ไม่มีบริบทของข้อกำหนดสำหรับโปรเจ็กต์นี้ จึงอาจรายงานการนำเข้าที่ไม่ถูกต้องและการนำเข้าที่ไม่ได้ใช้
ทรัพยากร Dependency ของ Python
ค้นหาไฟล์ requirements.txt แล้วเพิ่มแพ็กเกจต่อไปนี้
cloudshell edit requirements.txt
requirements.txt (ต่อท้าย)
gunicorn psycopg2-binary django-storages[google] django-environ
กำหนดรูปภาพแอปพลิเคชัน
Cloud Run จะเรียกใช้คอนเทนเนอร์ใดก็ได้ตราบใดที่เป็นไปตามสัญญาคอนเทนเนอร์ของ Cloud Run บทแนะนำนี้เลือกที่จะไม่ใช้ Dockerfile แต่ใช้ Cloud Native Buildpacks แทน Buildpack ช่วยในการสร้างคอนเทนเนอร์สำหรับภาษาที่ใช้กันทั่วไป ซึ่งรวมถึง Python
บทแนะนำนี้เลือกที่จะปรับแต่งProcfileที่ใช้เพื่อเริ่มเว็บแอปพลิเคชัน
หากต้องการสร้างคอนเทนเนอร์โปรเจ็กต์เทมเพลต ให้สร้างไฟล์ใหม่ชื่อ Procfile ในระดับบนสุดของโปรเจ็กต์ก่อน (ในไดเรกทอรีเดียวกับ manage.py) แล้วคัดลอกเนื้อหาต่อไปนี้
touch Procfile cloudshell edit Procfile
Procfile
web: gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application
7. กำหนดค่า สร้าง และเรียกใช้ขั้นตอนการย้ายข้อมูล
หากต้องการสร้างสคีมาฐานข้อมูลในฐานข้อมูล Cloud SQL และป้อนข้อมูลลงในที่เก็บข้อมูล Cloud Storage ด้วยชิ้นงานแบบคงที่ คุณต้องเรียกใช้ migrate และ collectstatic
คำสั่งการย้ายข้อมูล Django พื้นฐานเหล่านี้ต้องเรียกใช้ภายในบริบทของอิมเมจคอนเทนเนอร์ที่สร้างขึ้นพร้อมสิทธิ์เข้าถึงฐานข้อมูล
นอกจากนี้ คุณยังต้องเรียกใช้ createsuperuser เพื่อสร้างบัญชีผู้ดูแลระบบสำหรับเข้าสู่ระบบผู้ดูแลระบบ Django
โดยคุณจะใช้ Cloud Run Jobs เพื่อทำงานเหล่านี้ งาน Cloud Run ช่วยให้คุณเรียกใช้กระบวนการที่มีจุดสิ้นสุดที่กำหนดไว้ได้ จึงเหมาะสำหรับงานด้านการดูแลระบบ
กำหนดรหัสผ่านของผู้ดูแลระบบ Django
หากต้องการสร้างผู้ใช้ขั้นสูง คุณจะต้องใช้คำสั่ง createsuperuser เวอร์ชันที่ไม่โต้ตอบ คำสั่งนี้ต้องใช้ตัวแปรสภาพแวดล้อมที่มีชื่อเฉพาะเพื่อใช้แทนพรอมต์ในการป้อนรหัสผ่าน
สร้างข้อมูลลับใหม่โดยใช้รหัสผ่านที่สร้างขึ้นแบบสุ่ม
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=-
อนุญาตให้บัญชีบริการเข้าถึงข้อมูลลับนี้
gcloud secrets add-iam-policy-binding django_superuser_password \
--member serviceAccount:${SERVICE_ACCOUNT} \
--role roles/secretmanager.secretAccessor
อัปเดต Procfile
หากต้องการช่วยให้งาน Cloud Run ชัดเจนยิ่งขึ้น ให้สร้างทางลัดใน Procfile โดยต่อจุดแรกเข้าต่อไปนี้เข้ากับ Procfile
migrate: python manage.py migrate && python manage.py collectstatic --noinput --clear createuser: python manage.py createsuperuser --username admin --email noop@example.com --noinput
ตอนนี้คุณควรมีรายการ 3 รายการ ได้แก่ จุดแรกเข้า web เริ่มต้น จุดแรกเข้า migrate เพื่อใช้การย้ายข้อมูลฐานข้อมูล และจุดแรกเข้า createuser เพื่อเรียกใช้คำสั่ง createsuperuser
สร้างรูปภาพแอปพลิเคชัน
เมื่ออัปเดต Procfile แล้ว ให้สร้างอิมเมจโดยทำดังนี้
gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage
สร้างงาน Cloud Run
เมื่อมีอิมเมจแล้ว คุณจะสร้างงาน Cloud Run โดยใช้อิมเมจดังกล่าวได้
งานเหล่านี้จะใช้รูปภาพที่สร้างไว้ก่อนหน้านี้ แต่ใช้ค่า command ที่แตกต่างกัน ซึ่งจะแมปกับค่าใน Procfile
สร้างงานสำหรับการย้ายข้อมูล
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
สร้างงานสำหรับการสร้างผู้ใช้
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
เรียกใช้งานงาน Cloud Run
เมื่อกำหนดค่างานแล้ว ให้เรียกใช้การย้ายข้อมูลโดยทำดังนี้
gcloud run jobs execute migrate --region $REGION --wait
ตรวจสอบว่าเอาต์พุตของคำสั่งนี้ระบุว่าการดำเนินการ "เสร็จสมบูรณ์แล้ว"
คุณจะเรียกใช้คำสั่งนี้ในภายหลังเมื่ออัปเดตแอปพลิเคชัน
เมื่อตั้งค่าฐานข้อมูลแล้ว ให้สร้างผู้ใช้โดยใช้คำสั่งต่อไปนี้
gcloud run jobs execute createuser --region $REGION --wait
ตรวจสอบว่าเอาต์พุตของคำสั่งนี้ระบุว่าการดำเนินการ "เสร็จสมบูรณ์แล้ว"
คุณไม่ต้องเรียกใช้คำสั่งนี้อีก
8. ทำให้ใช้งานได้กับ Cloud Run
เมื่อสร้างและป้อนข้อมูลบริการสนับสนุนแล้ว คุณจะสร้างบริการ Cloud Run เพื่อเข้าถึงบริการเหล่านั้นได้
การทําให้แอปพลิเคชันที่อยู่ในคอนเทนเนอร์ใช้งานได้ครั้งแรกใน Cloud Run จะสร้างขึ้นโดยใช้คําสั่งต่อไปนี้
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
โปรดรอสักครู่จนกว่าการติดตั้งใช้งานจะเสร็จสมบูรณ์ เมื่อสำเร็จ บรรทัดคำสั่งจะแสดง URL ของบริการดังนี้
Service [djangocms-cloudrun] revision [djangocms-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic. Service URL: https://djangocms-cloudrun-...run.app
ตอนนี้คุณสามารถไปที่คอนเทนเนอร์ที่ติดตั้งใช้งานได้โดยเปิด URL นี้ในเว็บเบราว์เซอร์

เนื่องจากเป็นการติดตั้งใหม่ ระบบจะเปลี่ยนเส้นทางคุณไปยังหน้าเข้าสู่ระบบโดยอัตโนมัติ
9. การเข้าถึง Django Admin
ฟีเจอร์หลักอย่างหนึ่งของ Django CMS คือผู้ดูแลระบบแบบโต้ตอบ
การอัปเดตการตั้งค่า CSRF
Django มีการป้องกันการปลอมแปลง Cross-Site Request (CSRF) ทุกครั้งที่มีการส่งแบบฟอร์มในเว็บไซต์ Django รวมถึงการเข้าสู่ระบบผู้ดูแลระบบ Django ระบบจะตรวจสอบการตั้งค่าแหล่งที่มาที่เชื่อถือได้ หากไม่ตรงกับต้นทางของคำขอ Django จะแสดงข้อผิดพลาด
ในไฟล์ mysite/settings.py หากมีการกำหนดตัวแปรสภาพแวดล้อม CLOUDRUN_SERVICE_URL จะมีการใช้ตัวแปรดังกล่าวในการตั้งค่า CSRF_TRUSTED_ORIGINS และ ALLOWED_HOSTS แม้ว่าการกำหนด ALLOWED_HOSTS จะไม่บังคับ แต่คุณควรเพิ่มพารามิเตอร์นี้เนื่องจากจำเป็นสำหรับ CSRF_TRUSTED_ORIGINS อยู่แล้ว
เนื่องจากคุณต้องใช้ URL ของบริการ จึงจะเพิ่มการกำหนดค่านี้ได้หลังจากที่ติดตั้งใช้งานครั้งแรก
คุณจะต้องอัปเดตบริการเพื่อเพิ่มตัวแปรสภาพแวดล้อมนี้ โดยอาจเพิ่มลงในข้อมูลลับ application_settings หรือเพิ่มเป็นตัวแปรสภาพแวดล้อมโดยตรงก็ได้
การติดตั้งใช้งานด้านล่างใช้ประโยชน์จากการจัดรูปแบบและการหลีกของ gcloud
เรียกดู URL ของบริการ
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
ตั้งค่านี้เป็นตัวแปรสภาพแวดล้อมในบริการ Cloud Run
gcloud run services update djangocms-cloudrun \ --region $REGION \ --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"
การเข้าสู่ระบบ Django Admin
หากต้องการเข้าถึงอินเทอร์เฟซผู้ดูแลระบบ Django ให้ต่อท้าย /admin ใน URL ของบริการ
ตอนนี้ให้เข้าสู่ระบบด้วยชื่อผู้ใช้ "admin" และดึงรหัสผ่านโดยใช้คำสั่งต่อไปนี้
gcloud secrets versions access latest --secret django_superuser_password && echo ""

10. การใช้การอัปเดตแอปพลิเคชัน
ในระหว่างการพัฒนาแอปพลิเคชัน คุณอาจต้องการทดสอบแอปพลิเคชันในเครื่อง โดยคุณจะต้องเชื่อมต่อกับฐานข้อมูล Cloud SQL ("การผลิต") หรือฐานข้อมูลภายใน ("การทดสอบ")
เชื่อมต่อกับฐานข้อมูลที่ใช้งานจริง
คุณเชื่อมต่อกับอินสแตนซ์ Cloud SQL ได้โดยใช้พร็อกซีการตรวจสอบสิทธิ์ Cloud SQL แอปพลิเคชันนี้สร้างการเชื่อมต่อจากเครื่องภายในไปยังฐานข้อมูล
เมื่อติดตั้งพร็อกซีการตรวจสอบสิทธิ์ Cloud SQL แล้ว ให้ทำตามขั้นตอนต่อไปนี้
# 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
โปรดตรวจสอบว่าคุณได้นำไฟล์ temp_settings ออกหลังจากทำงานเสร็จแล้ว
เชื่อมต่อกับฐานข้อมูล SQLite ในเครื่อง
หรือจะใช้ฐานข้อมูลในเครื่องเมื่อพัฒนาแอปพลิเคชันก็ได้ Django รองรับทั้งฐานข้อมูล PostgreSQL และ SQLite และมีฟีเจอร์บางอย่างที่ PostgreSQL มีแต่ SQLite ไม่มี แต่ในหลายๆ กรณี ฟังก์ชันการทำงานจะเหมือนกัน
หากต้องการตั้งค่า SQLite คุณจะต้องอัปเดตการตั้งค่าแอปพลิเคชันให้ชี้ไปยังฐานข้อมูลในเครื่อง จากนั้นจึงจะใช้การย้ายข้อมูลสคีมาได้
วิธีตั้งค่าการชำระเงินด้วยวิธีนี้
# 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
โปรดตรวจสอบว่าคุณได้นำไฟล์ temp_settings ออกหลังจากทำงานเสร็จแล้ว
การสร้างการย้ายข้อมูล
เมื่อทำการเปลี่ยนแปลงโมเดลฐานข้อมูล คุณอาจต้องสร้างไฟล์การย้ายข้อมูลของ Django โดยเรียกใช้ python manage.py makemigrations
คุณเรียกใช้คำสั่งนี้ได้หลังจากตั้งค่าการเชื่อมต่อฐานข้อมูลการทดสอบหรือการเชื่อมต่อฐานข้อมูลที่ใช้งานจริง หรือจะสร้างไฟล์การย้ายข้อมูลโดยไม่ต้องใช้ฐานข้อมูลด้วยการตั้งค่าที่ว่างเปล่าก็ได้
SECRET_KEY="" DATABASE_URL="" GS_BUCKET_NAME="" python manage.py makemigrations
การใช้การอัปเดตแอปพลิเคชัน
หากต้องการใช้การเปลี่ยนแปลงกับแอปพลิเคชัน คุณจะต้องทำดังนี้
- สร้างการเปลี่ยนแปลงเป็นรูปภาพใหม่
- ใช้การย้ายข้อมูลฐานข้อมูลหรือการย้ายข้อมูลแบบคงที่ แล้ว
- อัปเดตบริการ Cloud Run ให้ใช้อิมเมจใหม่
วิธีสร้างอิมเมจ
gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage
หากมีการย้ายข้อมูลที่ต้องใช้ ให้เรียกใช้ Cloud Run Job ดังนี้
gcloud run jobs execute migrate --region $REGION --wait
วิธีอัปเดตบริการด้วยรูปภาพใหม่
gcloud run services update djangocms-cloudrun \
--platform managed \
--region $REGION \
--image gcr.io/${PROJECT_ID}/myimage
11. ยินดีด้วย
คุณเพิ่งติดตั้งใช้งานโปรเจ็กต์ที่ซับซ้อนใน Cloud Run
- Cloud Run จะปรับขนาดรูปภาพคอนเทนเนอร์ในแนวนอนโดยอัตโนมัติเพื่อจัดการคำขอที่ได้รับ จากนั้นจะปรับขนาดลงเมื่อความต้องการลดลง คุณจะจ่ายเฉพาะค่า CPU, หน่วยความจำ และเครือข่ายที่ใช้ไปในระหว่างการจัดการคำขอ
- Cloud SQL ช่วยให้คุณจัดสรรอินสแตนซ์ PostgreSQL ที่มีการจัดการซึ่งได้รับการบำรุงรักษาโดยอัตโนมัติ และผสานรวมเข้ากับระบบ Google Cloud หลายระบบได้โดยตรง
- Cloud Storage ช่วยให้คุณมีพื้นที่เก็บข้อมูลระบบคลาวด์ในลักษณะที่เข้าถึงได้ใน Django อย่างราบรื่น
- Secret Manager ช่วยให้คุณจัดเก็บข้อมูลลับและทำให้บางส่วนของ Google Cloud เข้าถึงได้ แต่บางส่วนเข้าถึงไม่ได้
ล้างข้อมูล
โปรดดำเนินการดังนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud Platform สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
- ใน Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
- เลือกโปรเจ็กต์ในรายการโปรเจ็กต์ แล้วคลิกลบ
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์
ดูข้อมูลเพิ่มเติม
- Django ใน Cloud Run: https://cloud.google.com/python/django/run
- Hello Cloud Run with Python: https://codelabs.developers.google.com/codelabs/cloud-run-hello-python3
- Python ใน Google Cloud: https://cloud.google.com/python
- ไคลเอ็นต์ Python ของ Google Cloud: https://github.com/googleapis/google-cloud-python