Wagtail ใน Cloud Run

1. บทนำ

894762ebb681671c.png

Cloud Run เป็นแพลตฟอร์มการประมวลผลที่มีการจัดการซึ่งทำให้คุณเรียกใช้คอนเทนเนอร์แบบไม่เก็บสถานะที่เรียกใช้ผ่านคำขอ HTTP ได้ Cloud Run เป็นแบบ Serverless ด้วยการตัดการจัดการโครงสร้างพื้นฐานทั้งหมดออก คุณจึงมุ่งเน้นไปที่การสร้างแอปพลิเคชันที่ยอดเยี่ยม ซึ่งเป็นสิ่งที่สำคัญที่สุดได้

นอกจากนี้ ยังเชื่อมต่อกับส่วนอื่นๆ ของระบบนิเวศ Google Cloud อีกหลายส่วนโดยค่าเริ่มต้น ซึ่งรวมถึง Cloud SQL สำหรับฐานข้อมูลที่จัดการ Cloud Storage สำหรับพื้นที่เก็บข้อมูลออบเจ็กต์แบบรวม และ Secret Manager สำหรับการจัดการข้อมูลลับ

Wagtail เป็นระบบจัดการเนื้อหา (CMS) แบบโอเพนซอร์สที่สร้างขึ้นบน Django Django เป็นเฟรมเวิร์กเว็บระดับสูงของ Python

ในบทแนะนำนี้ คุณจะใช้คอมโพเนนต์เหล่านี้เพื่อทำให้โปรเจ็กต์ Wagtail ขนาดเล็กใช้งานได้

หมายเหตุ: Codelab นี้ได้รับการยืนยันครั้งล่าสุดกับ Wagtail 5.2.2 ซึ่งรองรับ Django 5

สิ่งที่จะได้เรียนรู้

  • วิธีใช้ Cloud Shell
  • วิธีสร้างฐานข้อมูล Cloud SQL
  • วิธีสร้างที่เก็บข้อมูล Cloud Storage
  • วิธีสร้างข้อมูลลับใน Secret Manager
  • วิธีใช้ข้อมูลลับจากบริการต่างๆ ของ Google Cloud
  • วิธีเชื่อมต่อคอมโพเนนต์ Google Cloud กับบริการ Cloud Run
  • วิธีใช้ Container Registry เพื่อจัดเก็บคอนเทนเนอร์ที่สร้างขึ้น
  • วิธีทำให้ใช้งานได้กับ Cloud Run
  • วิธีเรียกใช้การย้ายสคีมาฐานข้อมูลใน Cloud Build

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Google Cloud Shell

แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาที่จำเป็นทั้งหมดไว้แล้ว ซึ่งจะมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการรับรองได้อย่างมีประสิทธิภาพ คุณทํางานส่วนใหญ่หรือทั้งหมดในโค้ดแล็บนี้ได้โดยใช้เบราว์เซอร์

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

  1. เรียกใช้คําสั่งต่อไปนี้ใน 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`
  1. เรียกใช้คำสั่งต่อไปนี้ใน 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. สร้างโปรเจ็กต์เทมเพลต

คุณจะใช้เทมเพลตโปรเจ็กต์ Wagtail เริ่มต้นเป็นโปรเจ็กต์ Wagtail ตัวอย่าง โดยคุณจะต้องติดตั้ง Wagtail ชั่วคราวเพื่อสร้างเทมเพลต

หากต้องการสร้างโปรเจ็กต์เทมเพลตนี้ ให้ใช้ Cloud Shell เพื่อสร้างไดเรกทอรีใหม่ชื่อ wagtail-cloudrun แล้วไปที่ไดเรกทอรีดังกล่าว

mkdir ~/wagtail-cloudrun
cd ~/wagtail-cloudrun

จากนั้นติดตั้ง Wagtail ในสภาพแวดล้อมเสมือนชั่วคราว โดยทำดังนี้

virtualenv venv
source venv/bin/activate
pip install wagtail

จากนั้นสร้างโปรเจ็กต์เทมเพลตใหม่ในโฟลเดอร์ปัจจุบันโดยทำดังนี้

wagtail start myproject .

ตอนนี้คุณจะมีโปรเจ็กต์ Wagtail เทมเพลตในโฟลเดอร์ปัจจุบัน

ls -F
Dockerfile  home/  manage.py*  myproject/  requirements.txt  search/ venv/

ตอนนี้คุณออกจากและนำสภาพแวดล้อมเสมือนชั่วคราวออกได้แล้ว โดยทำดังนี้

deactivate
rm -rf venv

จากตรงนี้ ระบบจะเรียกใช้ Wagtail ภายในคอนเทนเนอร์

5. สร้างบริการสำรอง

ตอนนี้คุณจะต้องสร้างบริการสำรอง ซึ่งได้แก่ บัญชีบริการเฉพาะ, Artifact Registry, ฐานข้อมูล Cloud SQL, ที่เก็บข้อมูล Cloud Storage และค่า Secret Manager จำนวนหนึ่ง

การรักษาความปลอดภัยของค่ารหัสผ่านที่ใช้ในการติดตั้งใช้งานมีความสำคัญต่อความปลอดภัยของโปรเจ็กต์ และช่วยให้มั่นใจว่าไม่มีใครใส่รหัสผ่านไว้ในที่ที่ไม่ถูกต้องโดยไม่ตั้งใจ (เช่น ในไฟล์การตั้งค่าโดยตรง หรือพิมพ์ลงในเทอร์มินัลโดยตรงซึ่งอาจดึงข้อมูลรหัสผ่านจากประวัติได้)

ในการเริ่มต้น ให้ตั้งค่าตัวแปรสภาพแวดล้อมพื้นฐาน 2 รายการ โดย 1 รายการสำหรับรหัสโปรเจ็กต์

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)")

สร้างรีจิสทรีอาร์ติแฟกต์

หากต้องการจัดเก็บอิมเมจคอนเทนเนอร์ที่สร้างขึ้น ให้สร้างที่เก็บข้อมูลคอนเทนเนอร์ในภูมิภาคที่คุณเลือก โดยทำดังนี้

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

เครื่องมือจัดการข้อมูลลับช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับในรูปแบบบล็อกไบนารีหรือสตริงข้อความได้ ซึ่งเหมาะสําหรับการจัดเก็บข้อมูลการกําหนดค่า เช่น รหัสผ่านฐานข้อมูล คีย์ 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. กำหนดค่าแอปพลิเคชัน

โปรเจ็กต์เทมเพลตที่คุณสร้างก่อนหน้านี้ต้องได้รับการแก้ไขเล็กน้อย การเปลี่ยนแปลงเหล่านี้จะลดความซับซ้อนของการกำหนดค่าการตั้งค่าเทมเพลตที่มาพร้อมกับ Wagtail และผสานรวม Wagtail กับบริการสนับสนุนที่คุณสร้างไว้ก่อนหน้านี้

กำหนดการตั้งค่า

ค้นหาไฟล์การตั้งค่า base.py ที่สร้างขึ้น แล้วเปลี่ยนชื่อเป็น basesettings.py ในโฟลเดอร์ myproject หลัก

mv myproject/settings/base.py myproject/basesettings.py

ใช้เครื่องมือแก้ไขเว็บของ Cloud Shell เพื่อสร้างไฟล์ settings.py ใหม่โดยใช้โค้ดต่อไปนี้

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 ไม่มีบริบทของข้อกําหนดสําหรับโปรเจ็กต์นี้ จึงอาจรายงานการนําเข้าที่ไม่ถูกต้องและการนําเข้าที่ไม่ได้ใช้

จากนั้นนำโฟลเดอร์การตั้งค่าเดิมออก

rm -rf myproject/settings/

จากนั้นคุณจะมีไฟล์การตั้งค่า 2 ไฟล์ ได้แก่ ไฟล์จาก Wagtail และไฟล์ที่คุณเพิ่งสร้างขึ้นซึ่งสร้างขึ้นจากการตั้งค่าเหล่านี้

ls myproject/*settings*
myproject/basesettings.py  myproject/settings.py

สุดท้าย ให้เปิดไฟล์การตั้งค่า manage.py แล้วอัปเดตการกําหนดค่าเพื่อบอกให้ Wagtail ชี้ไปยังไฟล์ settings.py หลัก

cloudshell edit manage.py

บรรทัด manage.py (ก่อน)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev")

บรรทัด manage.py (หลังจาก)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

ทำการเปลี่ยนแปลงการกำหนดค่าเดียวกันสำหรับไฟล์ myproject/wsgi.py

cloudshell edit myproject/wsgi.py

บรรทัด myproject/wsgi.py (ก่อน)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings.dev")

myproject/wsgi.py line (after)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

นำ Dockerfile ที่สร้างขึ้นโดยอัตโนมัติออกโดยทำดังนี้

rm Dockerfile

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 แทน บิลด์แพ็กจะช่วยสร้างคอนเทนเนอร์สำหรับภาษาทั่วไป ซึ่งรวมถึง 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 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

โปรดรอสักครู่จนกว่าการติดตั้งใช้งานจะเสร็จสมบูรณ์ หากดำเนินการสำเร็จ บรรทัดคำสั่งจะแสดง URL ของบริการดังนี้

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

ตอนนี้คุณเข้าชมคอนเทนเนอร์ที่ติดตั้งใช้งานแล้วได้โดยเปิด URL นี้ในเว็บเบราว์เซอร์

c2f23d1f5b97a79a.png

9. การเข้าถึง Django Admin

อัปเดตการตั้งค่า CSRF

Django มีการป้องกันการปลอมแปลงคําขอข้ามเว็บไซต์ (CSRF) เมื่อใดก็ตามที่มีการส่งแบบฟอร์มในเว็บไซต์ Django รวมถึงการเข้าสู่ระบบผู้ดูแลระบบ Django ระบบจะตรวจสอบการตั้งค่าต้นทางที่เชื่อถือ หากไม่ตรงกับต้นทางของคำขอ Django จะแสดงข้อผิดพลาด

ในไฟล์ mysite/settings.py หากมีการกําหนดตัวแปรสภาพแวดล้อม CLOUDRUN_SERVICE_URL ระบบจะใช้ตัวแปรนั้นในการตั้งค่า CSRF_TRUSTED_ORIGINS และ ALLOWED_HOSTS แม้ว่าการกำหนด ALLOWED_HOSTS จะไม่บังคับ แต่คุณควรเพิ่ม ALLOWED_HOSTS เนื่องจาก CSRF_TRUSTED_ORIGINS จำเป็นต้องมีอยู่แล้ว

เนื่องจากคุณต้องใช้ URL ของบริการ คุณจึงเพิ่มการกําหนดค่านี้ไม่ได้จนกว่าจะทําการติดตั้งใช้งานครั้งแรก

คุณจะต้องอัปเดตบริการเพื่อเพิ่มตัวแปรสภาพแวดล้อมนี้ โดยอาจเพิ่มลงในข้อมูลลับ application_settings หรือเพิ่มเป็นตัวแปรสภาพแวดล้อมโดยตรง

การใช้งานด้านล่างใช้ประโยชน์จากการจัดรูปแบบและการหลีกของ gcloud

เรียกดู URL ของบริการ

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

ตั้งค่านี้เป็นตัวแปรสภาพแวดล้อมในบริการ Cloud Run

gcloud run services update wagtail-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 ""

2b9139acc7208827.png

8ad565366c53ba3c.png

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 ดังนี้

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

วิธีอัปเดตบริการด้วยรูปภาพใหม่

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

11. ยินดีด้วย

คุณเพิ่งทำให้โปรเจ็กต์ที่ซับซ้อนทํางานใน Cloud Run

  • Cloud Run จะปรับขนาดรูปภาพคอนเทนเนอร์ในแนวนอนโดยอัตโนมัติเพื่อจัดการกับคำขอที่ได้รับ จากนั้นจะปรับขนาดลงเมื่อดีมานด์ลดลง คุณจะต้องชำระค่าบริการตามการใช้งาน CPU, หน่วยความจำ และเครือข่ายระหว่างการจัดการคำขอเท่านั้น
  • Cloud SQL ช่วยให้คุณจัดสรรอินสแตนซ์ PostgreSQL ที่มีการจัดการซึ่งจะได้รับการบำรุงรักษาโดยอัตโนมัติ และผสานรวมกับระบบต่างๆ ของ Google Cloud ได้อย่างราบรื่น
  • Cloud Storage ช่วยให้คุณมีพื้นที่เก็บข้อมูลระบบคลาวด์ในลักษณะที่เข้าถึงได้อย่างราบรื่นใน Django
  • เครื่องมือจัดการข้อมูลลับช่วยให้คุณจัดเก็บข้อมูลลับและกำหนดให้เข้าถึงข้อมูลลับได้เฉพาะส่วนต่างๆ ของ Google Cloud เท่านั้น

ล้างข้อมูล

โปรดดำเนินการดังนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud Platform สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

  • ใน Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
  • ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ แล้วคลิกลบ
  • ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์

ดูข้อมูลเพิ่มเติม

/