פריסת אפליקציות עם מצב (stateful) ב-Cloud Run, כמו Django, כוללת שילוב של שירותים כדי ליצור אינטראקציה ביניהם וליצור פרויקט מגובש.
במדריך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את פיתוח האתרים של Django. אם אתם חדשים בפיתוח Django, מומלץ לעבור על כתיבת אפליקציית Django הראשונה לפני שתמשיכו.
במדריך הזה נדגים את Django באופן ספציפי, אבל אפשר להשתמש בתהליך הפריסה הזה עם מסגרות אחרות שמבוססות על Django, כמו Wagtail ו-Django CMS.
במדריך הזה משתמשים ב-Django 5, שמחייב לפחות Python 3.10.
מטרות
במדריך הזה תלמדו:
- יצירה וחיבור של מסד נתונים ב-Cloud SQL.
- יצירה ושימוש בערכי סודות ב-Secret Manager.
פריסת אפליקציית Django ב-Cloud Run.
אירוח קבצים סטטיים ב-Cloud Storage.
משתמשים ב-Cloud Build כדי לבצע אוטומציה של הפריסה.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, Artifact Registry, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, Artifact Registry, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init - חשוב לוודא שיש הרשאות מספיקות בחשבון שבו משתמשים במדריך הזה.
הכנת הסביבה
שכפול של אפליקציה לדוגמה
הקוד של אפליקציית Django לדוגמה נמצא במאגר GoogleCloudPlatform/python-docs-samples ב-GitHub.
אפשר להוריד את הדוגמה כקובץ ZIP ולחלץ אותה, או לשכפל את המאגר למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.gitעוברים לספרייה שמכילה את הקוד לדוגמה:
Linux/macOS
cd python-docs-samples/run/djangoWindows
cd python-docs-samples\run\django
אישור הגדרת Python
המדריך הזה מסתמך על Python להרצת האפליקציה לדוגמה במחשב שלכם. כדי להשתמש בקוד לדוגמה צריך גם להתקין יחסי תלות
פרטים נוספים זמינים במדריך לסביבת פיתוח בשפת Python.
מוודאים שגרסת Python היא 3.10 לפחות.
python -Vהגרסה שמופיעה צריכה להיות
Python 3.10.0ומעלה.יוצרים סביבה וירטואלית של Python ומתקינים את יחסי התלות:
Linux/macOS
python -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txtWindows
python -m venv venv venv\scripts\activate pip install --upgrade pip pip install -r requirements.txt
הורדת Cloud SQL Auth Proxy כדי להתחבר ל-Cloud SQL מהמחשב המקומי
אחרי הפריסה, האפליקציה משתמשת בשרת ה-proxy ל-Cloud SQL Auth שמוטמע בסביבת Cloud Run כדי לתקשר עם מכונת Cloud SQL. עם זאת, כדי לבדוק את האפליקציה באופן מקומי, צריך להתקין ולהשתמש בעותק מקומי של ה-proxy בסביבת הפיתוח. פרטים נוספים זמינים במדריך לשרת proxy ל-Cloud SQL Auth.
שרת proxy ל-Cloud SQL Auth משתמש ב-Cloud SQL API כדי ליצור אינטראקציה עם מופע SQL. כדי לעשות את זה, צריך לאמת את האפליקציה באמצעות ה-CLI של gcloud.
אימות וקבלת פרטי כניסה ל-API:
gcloud auth application-default loginמורידים ומתקינים את Cloud SQL Auth Proxy במחשב המקומי.
לפני שמתחילים, צריך לקבוע את הארכיטקטורה של המכונה.
אם מריצים את הפקודה ב-Linux או ב-Mac, אפשר למצוא את המידע הזה באמצעות הפקודה הבאה:
uname -a
Linux 64 סיביות
- מורידים את שרת ה-proxy ל-Cloud SQL Auth:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.22.1/cloud-sql-proxy.linux.amd64
- הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
chmod +x cloud-sql-proxy
Linux 32 סיביות
- מורידים את שרת ה-proxy ל-Cloud SQL Auth:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.22.1/cloud-sql-proxy.linux.386
- אם הפקודה
curlלא נמצאה, מריצים את הפקודהsudo apt install curlוחוזרים על פקודת ההורדה. - הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
chmod +x cloud-sql-proxy
macOS 64 סיביות
- מורידים את שרת ה-proxy ל-Cloud SQL Auth:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.22.1/cloud-sql-proxy.darwin.amd64
- הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
chmod +x cloud-sql-proxy
Mac M1
- מורידים את שרת ה-proxy ל-Cloud SQL Auth:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.22.1/cloud-sql-proxy.darwin.arm64
- הופכים את שרת ה-proxy ל-Cloud SQL Auth לקובץ הפעלה:
chmod +x cloud-sql-proxy
Windows 64 סיביות
לוחצים לחיצה ימנית על https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.22.1/cloud-sql-proxy.x64.exe ובוחרים באפשרות שמירת קישור בשם כדי להוריד את שרת ה-proxy ל-Cloud SQL Auth. משנים את שם הקובץ ל-cloud-sql-proxy.exe.Windows 32 סיביות
לוחצים לחיצה ימנית על https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.22.1/cloud-sql-proxy.x86.exe ובוחרים באפשרות שמירת קישור בשם כדי להוריד את שרת ה-proxy ל-Cloud SQL Auth. משנים את שם הקובץ ל-cloud-sql-proxy.exe.קובץ אימג' של Docker לשרת proxy ל-Cloud SQL Auth
לשרת ה-proxy ל-Cloud SQL Auth יש תמונות קונטיינר שונות, כמו
distroless,alpineו-buster. קובץ האימג' של קונטיינר ברירת המחדל של שרת proxy ל-Cloud SQL Auth משתמש ב-distroless, שלא מכיל מעטפת. אם אתם צריכים מעטפת או כלים קשורים, אתם יכולים להוריד תמונה שמבוססת עלalpineאו עלbuster. מידע נוסף זמין במאמר תמונות קונטיינר של Cloud SQL Auth Proxy.אפשר למשוך את התמונה העדכנית ביותר למחשב המקומי באמצעות Docker באמצעות הפקודה הבאה:
docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.22.1
מערכת הפעלה אחרת
במערכות הפעלה אחרות שלא נכללות כאן, אפשר לקמפל את Cloud SQL Auth Proxy מהמקור.אתם יכולים להעביר את ההורדה למיקום נפוץ, כמו מיקום ב
PATHאו בספריית הבית. אם תבחרו לעשות את זה, כשתפעילו את שרת ה-proxy ל-Cloud SQL Auth בהמשך המדריך, תצטרכו לציין את המיקום שבחרתם כשמשתמשים בפקודותcloud-sql-proxy.- מורידים את שרת ה-proxy ל-Cloud SQL Auth:
יצירת שירותי גיבוי
במדריך הזה נעשה שימוש בכמה Google Cloud שירותים כדי לספק את מסד הנתונים, אחסון המדיה ואחסון הסודות שתומכים בפרויקט Django שנפרס. השירותים האלה פרוסים באזור ספציפי. כדי לשפר את היעילות בין השירותים, מומלץ לפרוס את כל השירותים באותו אזור. מידע נוסף על האזור הקרוב ביותר אליכם זמין במאמר מוצרים שזמינים לפי אזור.
במדריך הזה נעשה שימוש במנגנוני אירוח נכסים סטטיים שמשולבים ב-Cloud Run.הגדרת מכונה של Cloud SQL ל-PostgreSQL
Django תומך רשמית במספר מסדי נתונים רלציוניים, אבל התמיכה הכי טובה היא ב-PostgreSQL. Cloud SQL תומך ב-PostgreSQL, ולכן במדריך הזה נבחר להשתמש בסוג הזה של מסד נתונים.
בקטע הבא מתואר תהליך היצירה של מכונת PostgreSQL, מסד נתונים ומשתמש במסד הנתונים עבור האפליקציה.
יוצרים את מכונת PostgreSQL:
המסוף
נכנסים לדף Cloud SQL Instances במסוף Google Cloud .
לוחצים על Create Instance.
לוחצים על Choose PostgreSQL (בחירת PostgreSQL).
ב-SQL Edition, בוחרים באפשרות Enterprise.
בקטע Edition Preset (הגדרות קבועות מראש של מהדורה), בוחרים באפשרות Sandbox (ארגז חול).
בשדה Instance ID (מזהה המופע), מזינים את הערך
INSTANCE_NAME.מזינים סיסמה למשתמש postgres.
משאירים את ערכי ברירת המחדל בשאר השדות.
לוחצים על Create Instance.
לוקח כמה דקות עד שהמכונה מוכנה לשימוש.
gcloud
יוצרים את מכונת PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --project PROJECT_ID \ --database-version POSTGRES_16 \ --tier db-n1-standard-2 \ --region REGION
מחליפים את מה שכתוב בשדות הבאים:
-
INSTANCE_NAME: שם המכונה של Cloud SQL -
PROJECT_ID: מזהה הפרויקט Google Cloud -
REGION: Google Cloud האזור
יצירת המכונה והכנתה לשימוש נמשכות כמה דקות.
במכונה שנוצרה, יוצרים מסד נתונים:
המסוף
- בדף של האינסטנס, עוברים לכרטיסייה Databases (מסדי נתונים).
- לוחצים על יצירת מסד נתונים.
- בתיבת הדו-שיח Database Name, מזינים
DATABASE_NAME. - לוחצים על יצירה.
gcloud
יוצרים את מסד הנתונים במופע שנוצר לאחרונה:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAMEמחליפים את
DATABASE_NAMEבשם של מסד הנתונים בתוך המכונה.
יוצרים משתמש במסד הנתונים:
המסוף
- בדף של המופע, עוברים לכרטיסייה משתמשים.
- לוחצים על הוספת חשבון משתמש.
- בתיבת הדו-שיח בחירת שיטת האימות בקטע 'אימות מובנה':
- מזינים את שם המשתמש
DATABASE_USERNAME. - מזינים את הסיסמה
DATABASE_PASSWORD - לוחצים על הוספה.
gcloud
יוצרים את המשתמש במכונה שנוצרה לאחרונה:
gcloud sql users create DATABASE_USERNAME \ --instance INSTANCE_NAME \ --password DATABASE_PASSWORDמחליפים את
PASSWORDבסיסמה מאובטחת.
הגדרת Artifact Registry
משתמשים ב-Artifact Registry כדי ליצור מאגר לאחסון קובץ האימג' של הקונטיינר.
המסוף
נכנסים לדף Artifact Registry במסוף Google Cloud .
לוחצים על Create Repository (יצירת מאגר).
כתבו:
- בשדה Name (שם), מזינים cloud-run-source-deploy.
- בקטע Format (פורמט), בוחרים באפשרות Docker.
- בשדה אזור, בוחרים באפשרות REGION.
משאירים את ערכי ברירת המחדל בשאר השדות.
לוחצים על יצירה.
gcloud
- יוצרים Artifact Registry:
gcloud artifacts repositories create cloud-run-source-deploy \
--repository-format docker \
--location REGION
הגדרת קטגוריה של Cloud Storage
אתם יכולים לאחסן נכסים סטטיים שכלולים ב-Django, וגם מדיה שהמשתמשים העלו, באחסון אובייקטים עם זמינות גבוהה באמצעות Cloud Storage.
חבילת django-storages[google] מטפלת באינטראקציה של Django עם קצה העורפי של האחסון הזה.
המסוף
פותחים את הדף Cloud Storage במסוף Google Cloud .
לוחצים על Create Bucket.
מזינים את הפרטים הבאים (לוחצים על 'המשך' כשצריך):
- בשדה שם, מזינים 'PROJECT_ID_MEDIA_BUCKET'.
- בשדה אזור, בוחרים באפשרות REGION.
- בקטע Storage Class, משאירים את הגדרות ברירת המחדל.
- בקטע Prevent public access, מסירים את הסימון מהתיבה 'Enforce public access prevention'.
- בשדה Access Control, בוחרים באפשרות Fine-grained.
משאירים את ערכי ברירת המחדל בשאר השדות.
לוחצים על יצירה.
gcloud
יוצרים קטגוריה של Cloud Storage:
gcloud storage buckets create gs://PROJECT_ID_MEDIA_BUCKET --location=REGIONמחליפים את
MEDIA_BUCKETבסיומת של קטגוריית המדיה. השם הזה, בשילוב עם מזהה הפרויקט, יוצר שם ייחודי לקטגוריה.
אחסון ערכי סוד ב-Secret Manager
עכשיו, אחרי שהגדרתם את שירותי הגיבוי, Django צריך מידע על השירותים האלה. במקום להזין את הערכים האלה ישירות בקוד המקור של Django, במדריך הזה נעשה שימוש ב-Secret Manager כדי לאחסן את המידע הזה בצורה מאובטחת.
יצירת קובץ סביבה של Django כסוד ב-Secret Manager
ההגדרות שנדרשות להפעלת Django מאוחסנות בקובץ env מאובטח.
אפליקציית הדוגמה משתמשת ב-Secret Manager API כדי לאחזר את ערך הסוד, ובחבילה django-environ כדי לטעון את הערכים לסביבת Django. הסוד מוגדר כך ש-Cloud Run ו-Cloud Build יוכלו לגשת אליו.
יוצרים קובץ בשם
.env, מגדירים את מחרוזת החיבור למסד הנתונים, את שם קטגוריית המדיה ואת הערך החדש שלSECRET_KEY:echo DATABASE_URL=postgres://DATABASE_USERNAME:DATABASE_PASSWORD@//cloudsql/PROJECT_ID:REGION:INSTANCE_NAME/DATABASE_NAME > .env echo GS_BUCKET_NAME=PROJECT_ID_MEDIA_BUCKET >> .env echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1) >> .envמאחסנים את הסוד ב-Secret Manager:
המסוף
נכנסים לדף Secret Manager במסוף Google Cloud .
לוחצים על יצירת סוד.
בשדה שם מזינים
django_settings.בתיבת הדו-שיח Secret value, מדביקים את התוכן של קובץ
.env.לוחצים על Create secret (יצירת סוד).
כדי למנוע שינוי של הגדרות מקומיות, צריך למחוק את הקובץ המקומי.
gcloud
יוצרים סוד חדש,
django_settings, עם הערך של הקובץ.env:gcloud secrets create django_settings --data-file .envכדי למנוע ביטול של הגדרות מקומיות, צריך למחוק את הקובץ המקומי:
rm .env
הגדרת הגישה לסוד:
המסוף
לפני שמגדירים גישה לסוד, כדאי לשים לב למספר הפרויקט בסוד: django_settings:
projects/PROJECTNUM/secrets/django_settings- לוחצים על הכרטיסייה Permissions.
- לוחצים על הענקת גישה.
- בשדה New Members (חברים חדשים), מזינים
PROJECTNUM-compute@developer.gserviceaccount.comולוחצים עלEnter. - בתפריט הנפתח Role, בוחרים באפשרות Secret Manager Secret Accessor.
- לוחצים על Save.
gcloud
נותנים גישה לסוד לחשבון השירות של Cloud Run:
gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessorאפשר לקבל את הערך של מספר הפרויקט (
PROJECTNUM) באמצעות הפקודה הבאה:gcloud projects describe PROJECT_ID --format='value(projectNumber)'בפלט, מוודאים שחשבון השירות החדש מופיע ברשימה
bindings.
יצירת סוד לסיסמת האדמין של Django
משתמש האדמין של Django נוצר בדרך כלל על ידי הפעלת פקודת הניהול האינטראקטיבית createsuperuser.
במדריך הזה נעשה שימוש בהעברת נתונים כדי ליצור את משתמש האדמין, ואחזור סיסמת האדמין מ-Secret Manager.
המסוף
- נכנסים לדף Secret Manager במסוף Google Cloud .
לוחצים על Create secret (יצירת סוד).
בשדה שם מזינים
superuser_password.בשדה ערך סודי, מזינים סיסמה אקראית וייחודית.
לוחצים על Create secret (יצירת סוד).
בקטע פרטים על
superuser_password, רושמים את מספר הפרויקט (projects/PROJECTNUM/secrets/superuser_password).לוחצים על הכרטיסייה Permissions.
לוחצים על הוספה.
בשדה New Members (חברים חדשים), מזינים
PROJECTNUM-compute@developer.gserviceaccount.comולוחצים עלEnter.בתפריט הנפתח Role, בוחרים באפשרות Secret Manager Secret Accessor.
לוחצים על שמירה
gcloud
יצירת סוד חדש,
superuser_password, מסיסמה שנוצרה באופן אקראי:echo -n "$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 30 | head -n1)" | gcloud secrets create superuser_password --data-file -נותנים ל-Cloud Build גישה לסוד:
gcloud secrets add-iam-policy-binding superuser_password \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessorבפלט, מוודאים ש-
bindingsמופיע רק כחבר ב-Cloud Build.
הפעלת האפליקציה במחשב המקומי
אחרי שמגדירים את שירותי הגיבוי, אפשר להריץ את האפליקציה במחשב. ההגדרה הזו מאפשרת פיתוח מקומי והחלת העברות של מסדי נתונים. הערה: העברות של מסדי נתונים מתבצעות גם ב-Cloud Build, אבל תצטרכו להגדיר את ההגדרה המקומית הזו כדי makemigrations.
במסוף נפרד, מפעילים את שרת ה-proxy ל-Cloud SQL Auth:
Linux/macOS
./cloud-sql-proxy PROJECT_ID:REGION:INSTANCE_NAMEWindows
cloud-sql-proxy.exe PROJECT_ID:REGION:INSTANCE_NAMEבשלב הזה נוצר חיבור מהמחשב המקומי למכונת Cloud SQL לצורך בדיקות מקומיות. חשוב להשאיר את שרת ה-proxy ל-Cloud SQL Auth פועל כל הזמן שבודקים את האפליקציה באופן מקומי. הפעלת התהליך הזה בטרמינל נפרד מאפשרת לכם להמשיך לעבוד בזמן שהתהליך הזה פועל.
במסוף המקורי, מגדירים את מזהה הפרויקט באופן מקומי (משמש את Secret Manager API):
Linux/macOS
export GOOGLE_CLOUD_PROJECT=PROJECT_IDWindows
set GOOGLE_CLOUD_PROJECT=PROJECT_IDמגדירים משתנה סביבה כדי לציין שאתם משתמשים בשרת proxy ל-Cloud SQL Auth (הערך הזה מזוהה בקוד):
Linux/macOS
export USE_CLOUD_SQL_AUTH_PROXY=trueWindows
set USE_CLOUD_SQL_AUTH_PROXY=trueמריצים את ההעברות של Django כדי להגדיר את המודלים והנכסים:
python manage.py makemigrations python manage.py makemigrations polls python manage.py migrate python manage.py collectstaticמפעילים את שרת האינטרנט של Django:
python manage.py runserver 8080בדפדפן, עוברים אל http://localhost:8080.
אם אתם ב-Cloud Shell, לוחצים על הלחצן Web Preview (תצוגה מקדימה של אתר) ובוחרים באפשרות Preview on port 8080 (תצוגה מקדימה ביציאה 8080).
בדף מוצג הטקסט: "Hello, world. אתה נמצא במדד הסקרים". שרת האינטרנט של Django שפועל במחשב שלכם מספק את דפי האפליקציה לדוגמה.
מקישים על
Ctrl/Cmd+Cכדי לעצור את שרת האינטרנט המקומי.
פריסת האפליקציה ב-Cloud Run
אחרי שמגדירים את שירותי הגיבוי, אפשר לפרוס את שירות Cloud Run.
באמצעות
cloudmigrate.yamlשסופק, משתמשים ב-Cloud Build כדי ליצור את התמונה, להפעיל את העברות מסד הנתונים ולאכלס את הנכסים הסטטיים:gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGIONהגרסה הראשונה תיבנה תוך כמה דקות.
אם הבנייה הצליחה, פורסים את שירות Cloud Run בפעם הראשונה, ומגדירים את אזור השירות, קובץ האימג' הבסיסי ומופע Cloud SQL המחובר:
gcloud run deploy polls-service \ --region REGION \ --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/polls-service \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticatedאמור להופיע פלט שמראה שהפריסה הצליחה, עם כתובת URL של שירות:
Service [polls-service] revision [polls-service-00001-tug] has been deployed and is serving 100 percent of traffic. Service URL: https://polls-service-PROJECT_ID.REGION.run.appמעדכנים את השירות לכתובות ה-URL של השירות כמשתנה סביבה.
CLOUDRUN_SERVICE_URLS=$(gcloud run services describe polls-service \ --region $REGION \ --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]') gcloud run services update polls-service \ --region REGION \ --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"כדי לראות את השירות שנפרס, עוברים לכתובת ה-URL של השירות.
כדי להתחבר לממשק הניהול של Django, מוסיפים את המחרוזת
/adminלכתובת ה-URL ומתחברים באמצעות שם המשתמשadminוהסיסמה שהוגדרו קודם.כדי לאחזר את סיסמת משתמש העל מ-Secret Manager:
gcloud secrets versions access latest --secret superuser_password && echo ""
עדכון האפליקציה
השלבים הראשוניים של הקצאת הרשאות ופריסה היו מורכבים, אבל תהליך העדכון פשוט יותר:
מריצים את סקריפט המיגרציה ואת ה-build של Cloud Build:
gcloud builds submit --config cloudmigrate.yaml \ --substitutions _INSTANCE_NAME=INSTANCE_NAME,_REGION=REGIONמפעילים את השירות, ומציינים רק את האזור והתמונה:
gcloud run deploy polls-service \ --region REGION \ --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/polls-service
הגדרת סביבת הייצור
עכשיו יש לכם פריסת Django פעילה, אבל יש עוד שלבים שאפשר לבצע כדי לוודא שהאפליקציה מוכנה לייצור.
השבתת ניפוי באגים
מוודאים שהמשתנה DEBUG ב-mysite/settings.py מוגדר לערך False. ההגדרה הזו תמנע הצגה של דפי שגיאה מפורטים למשתמש, שיכולים לחשוף מידע על ההגדרות.
הגבלת ההרשאות של משתמש מסד הנתונים
לכל המשתמשים שנוצרים באמצעות Cloud SQL יש את ההרשאות שמשויכות לתפקיד cloudsqlsuperuser: CREATEROLE, CREATEDB ו-LOGIN.
כדי למנוע ממשתמש מסד הנתונים של Django לקבל את ההרשאות האלה, צריך ליצור את המשתמש ב-PostgreSQL באופן ידני. צריך להתקין את psql הטרמינל האינטראקטיבי או להשתמש ב-Cloud Shell שבו הכלי הזה מותקן מראש.
המסוף
-
במסוף Google Cloud , מפעילים את Cloud Shell.
ב-Cloud Shell, משתמשים בטרמינל המובנה כדי להתחבר למופע
INSTANCE_NAME:gcloud sql connect INSTANCE_NAME --user postgresמזינים את הסיסמה של משתמש postgres.
המודל שלך כרגע הוא
psql. אמורה להופיע ההודעהpostgres=>.יצירת משתמש:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';מחליפים את
PASSWORDבסיסמה אקראית וייחודית.מעניקים למשתמש החדש הרשאות מלאות במסד הנתונים החדש:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;יציאה מ-
psql:\q
gcloud
מתחילים חיבור למכונת SQL:
gcloud sql connect INSTANCE_NAME --user postgresמחליפים את
INSTANCE_NAMEבמכונה של Cloud SQL שנוצרה.מזינים את הסיסמה של משתמש postgres.
המודל שלך כרגע הוא
psql. אמורה להופיע ההודעהpostgres=>.יצירת משתמש:
CREATE USER DATABASE_USERNAME WITH PASSWORD 'DATABASE_PASSWORD';מעניקים למשתמש החדש הרשאות מלאות במסד הנתונים החדש:
GRANT ALL PRIVILEGES ON DATABASE DATABASE_NAME TO DATABASE_USERNAME;יציאה מ-
psql:\q
הגדרת הרשאות מינימליות
כברירת מחדל, השירות הזה נפרס עם חשבון השירות שמוגדר כברירת מחדל ב-Compute. עם זאת, במקרים מסוימים, שימוש בחשבון השירות שמוגדר כברירת מחדל יכול לספק יותר מדי הרשאות. אם אתם רוצים להגביל את ההרשאות יותר, אתם צריכים ליצור חשבון שירות משלכם ולהקצות רק את ההרשאות שנדרשות לשירות שלכם. ההרשאות הנדרשות עשויות להשתנות משירות לשירות, בהתאם למשאבים שבהם נעשה שימוש בשירות מסוים.
אלה תפקידי הפרויקט המינימליים שנדרשים בשירות הזה:
- Cloud Run Invoker
- לקוח Cloud SQL
- אדמין אחסון, בדלי המדיה
- Secret Manager Accessor, on the Django settings secret. (השירות עצמו לא דורש גישה לסוד של Django Admin).
כדי ליצור חשבון שירות עם ההרשאות הנדרשות ולהקצות אותו לשירות, מריצים את הפקודה הבאה:
ב-CLI של gcloud, יוצרים חשבון שירות עם התפקידים הנדרשים:
gcloud iam service-accounts create polls-service-account SERVICE_ACCOUNT=polls-service-account@PROJECT_ID.iam.gserviceaccount.com # Cloud SQL Client gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/cloudsql.client # Storage Admin, on the media bucket gcloud storage buckets add-iam-policy-binding gs://MEDIA_BUCKET \ --member=serviceAccount:${SERVICE_ACCOUNT} \ --role=roles/storage.objectAdmin # Secret Accessor, on the Django settings secret. gcloud secrets add-iam-policy-binding django_settings \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/secretmanager.secretAccessor # Secret Accessor, on the Django super user password. gcloud secrets add-iam-policy-binding superuser_password \ --member serviceAccount:${SERVICE_ACCOUNT} \ --role roles/secretmanager.secretAccessorפורסים את השירות ומקשרים אותו לחשבון השירות החדש:
gcloud run services update polls-service \ --region REGION \ --service-account ${SERVICE_ACCOUNT}מעדכנים את משימות Cloud Run ב-
cloudmigrate.yamlכך שגם הן יכללו את ההגדרה--service-account.
הסבר על הקוד
אפליקציה לדוגמה
אפליקציית הדוגמה של Django נוצרה באמצעות כלי Django רגילים. הפקודות הבאות יוצרות את הפרויקט ואת אפליקציית הסקרים:
django-admin startproject mysite
python manage.py startapp polls
התצוגות, המודלים והגדרות המסלול הבסיסיים הועתקו מתוך כתיבת האפליקציה הראשונה ב-Django (חלק 1 וחלק 2).
סודות מ-Secret Manager
הקובץ settings.py מכיל קוד שמשתמש ב-Secret Manager API בשפת Python כדי לאחזר את הגרסה העדכנית של הסוד שצוין, ולשלוף אותו לסביבה (באמצעות django-environ):
הסוד משמש לאחסון של כמה ערכי סוד כדי לצמצם את מספר הסודות השונים שצריך להגדיר.
הגדרות CSRF
ל-Django יש הגנה מובנית מפני זיוף בקשות בין אתרים (CSRF). החל מ-Django 4.0, שינויים באופן הפעולה של המערכת מחייבים לציין ל-Django מה כתובת ה-URL שבה היא מתארחת, כדי שהיא תוכל להציע את ההגנות הטובות ביותר למשתמשים ששולחים נתונים.
אתם מספקים את כתובת ה-URL של האפליקציה כמשתנה סביבה בקובץ settings.py. זה הערך ש-Django משתמשת בו להגדרות הרלוונטיות.
שינויים מקומיים מברירת המחדל של סודות
אם נמצא קובץ .env במערכת הקבצים המקומית, הוא ישמש במקום הערך מ-Secret Manager. יצירת קובץ .env באופן מקומי יכולה לעזור בבדיקות מקומיות (למשל, פיתוח מקומי מול מסד נתונים של SQLite או הגדרות מקומיות אחרות).
חיבור למסד נתונים
הקובץ settings.py מכיל את ההגדרות של מסד הנתונים של SQL. הוא משתמש בעזר env.db() מ-django-environ כדי לטעון את מחרוזת החיבור שהוגדרה ב-DATABASE_URL להגדרה DATABASES.
כשמריצים את האפליקציה באופן מקומי ומשתמשים בשרת proxy ל-Cloud SQL Auth כדי לגשת למסד הנתונים המתארח, הדגל USE_CLOUD_SQL_AUTH_PROXY מתאים את הגדרות מסד הנתונים לשימוש בשרת ה-proxy.
תוכן סטטי שמאוחסן בענן
קובץ settings.py משתמש גם ב-django-storages כדי לשלב את קטגוריית המדיה של Cloud Storage ישירות בפרויקט:
אוטומציה באמצעות Cloud Build
cloudmigrate.yaml מטפל בכל השלבים שנדרשים ליצירת תמונת קונטיינר חדשה, ומשתמש בה כדי להחיל העברות של מסדי נתונים.
במדריך הזה בחרנו להשתמש ב-buildpacks כדי ליצור את קובץ האימג' של הקונטיינר, ובנקודות כניסה מותאמות אישית ב-Procfile כדי לטפל בפקודות ניהול. אחר כך אפשר להפנות אליהם ממשימות של Cloud Run כדי לבצע את הפקודות.
משתני החלפה משמשים בהגדרה הזו.
יצירת משתמש על באמצעות משימות Cloud Run
אפשר להריץ את פקודת הניהול של Django createsuperuser באופן לא אינטראקטיבי על ידי הגדרת DJANGO_SUPERUSER_EMAIL ו-DJANGO_SUPERUSER_PASSWORD.
במדריך הזה בחרנו להשתמש ב-Cloud Run Jobs כדי להריץ את הפקודה הזו. כדי לעשות את זה, מוסיפים רשומה בהתאמה אישית ל-Procfile שמריץ את createsuperuser.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
המאמרים הבאים
- איך מגדירים את PostgreSQL לייצור
- מידע נוסף על Django ב- Google Cloud