במדריך הזה מוסבר איך להעביר אפליקציות אינטרנט של Node.js שפועלות ב-Heroku ל-Cloud Run ב- Google Cloud. המדריך הזה מיועד לארכיטקטים ולבעלי מוצרים שרוצים להעביר את האפליקציות שלהם מ-Heroku לשירותים מנוהלים ב- Google Cloud.
Cloud Run היא פלטפורמת מחשוב מנוהלת שמאפשרת להריץ קונטיינרים בלי שמירת מצב שאפשר להפעיל באמצעות בקשות HTTP. הוא מבוסס על Knative בקוד פתוח, שמאפשר ניידות בין פלטפורמות ותומך בתהליכי עבודה של קונטיינרים ובסטנדרטים של פיתוח רציף. פלטפורמת Cloud Run משולבת היטב עם חבילת המוצרים של Google Cloud, ומאפשרת לכם לעצב ולפתח בקלות אפליקציות ניידות, ניתנות להרחבה ועמידות. Google Cloud
במדריך הזה נסביר איך להעביר אפליקציה שנכתבה ב-Node.js ומשתמשת ב-Heroku Postgres כשירות עורפי ב-Heroku. Google Cloud אפליקציית האינטרנט מועברת לקונטיינר ומתארחת ב-Cloud Run, והיא משתמשת ב-Cloud SQL ל-PostgreSQL כשכבת העקביות שלה.
במדריך הזה משתמשים באפליקציה פשוטה בשם Tasks, שמאפשרת לראות וליצור משימות. המשימות האלה מאוחסנות ב-Heroku Postgres בפריסה הנוכחית של האפליקציה ב-Heroku.
במדריך הזה אנחנו מניחים שאתם מכירים את הפונקציונליות הבסיסית של Heroku ושיש לכם חשבון Heroku (או גישה לחשבון כזה). בנוסף, המדריך מתבסס על ההנחה שאתם מכירים את Cloud Run, Cloud SQL, Docker ו-Node.js.
מטרות
- יוצרים קובץ אימג' של Docker כדי לפרוס את האפליקציה ב-Cloud Run.
- יוצרים מכונה של Cloud SQL ל-PostgreSQL שתשמש כקצה העורפי אחרי המיגרציה אל Google Cloud.
- בודקים את קוד Node.js כדי להבין איך Cloud Run מתחבר ל-Cloud SQL, ולראות את השינויים בקוד (אם יש כאלה) שנדרשים כדי לבצע מיגרציה מ-Heroku ל-Cloud Run.
- העברת נתונים מ-Heroku Postgres ל-Cloud SQL ל-PostgreSQL.
- פורסים את האפליקציה ב-Cloud Run.
- בודקים את האפליקציה שפרסתם.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
יכול להיות שתחויבו גם על המשאבים שבהם אתם משתמשים ב-Heroku.
לפני שמתחילים
- נכנסים לחשבון 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 SQL, Cloud Build, Cloud Run, Container Registry, Service Networking, Serverless VPC Access 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.-
Make sure that you have the following role or roles on the project: Cloud Run > Cloud Run Admin, Cloud Storage > Storage Admin, Cloud SQL > Cloud SQL Admin, Compute Engine > Compute Network Admin, Resource Manager > Project IAM Admin, Cloud Build > Cloud Build Editor, Serverless VPC Access > Serverless VPC Access Admin, Logging > Logs Viewer, Service Accounts > Service Account Admin, Service Accounts > Service Account User, and Service Usage > Service Usage Consumer
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
- Click Grant access.
-
In the New principals field, enter your user identifier. This is typically the email address for a Google Account.
- Click Select a role, then search for the role.
- To grant additional roles, click Add another role and add each additional role.
- Click Save.
-
-
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 SQL, Cloud Build, Cloud Run, Container Registry, Service Networking, Serverless VPC Access 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.-
Make sure that you have the following role or roles on the project: Cloud Run > Cloud Run Admin, Cloud Storage > Storage Admin, Cloud SQL > Cloud SQL Admin, Compute Engine > Compute Network Admin, Resource Manager > Project IAM Admin, Cloud Build > Cloud Build Editor, Serverless VPC Access > Serverless VPC Access Admin, Logging > Logs Viewer, Service Accounts > Service Account Admin, Service Accounts > Service Account User, and Service Usage > Service Usage Consumer
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
- Click Grant access.
-
In the New principals field, enter your user identifier. This is typically the email address for a Google Account.
- Click Select a role, then search for the role.
- To grant additional roles, click Add another role and add each additional role.
- Click Save.
-
מגדירים את הסביבה
פותחים את Cloud Shell.
ב-Cloud Shell, מגדירים משתני סביבה וערכי ברירת מחדל ל-Google Cloud CLI שמשמש במדריך הזה.
gcloud config set project PROJECT_ID gcloud config set run/region us-central1
מחליפים את
PROJECT_IDבמזהה הפרויקט.
ארכיטקטורה
באיורים הבאים מוצגת הארכיטקטורה של אפליקציית האינטרנט ב-Heroku (כמו שהיא) ופריסת הארכיטקטורה שלה ב- Google Cloud (שתבנו).
אפליקציית המשימות שמוצבת כרגע ב-Heroku מורכבת מדינמו אחד או יותר של אינטרנט. דינמו אינטרנט יכול לקבל תנועת HTTP ולהגיב לה, בניגוד לדינמו עובד, שמתאים יותר למשימות ברקע ולמשימות מתוזמנות. האפליקציה מציגה דף אינדקס עם משימות שמאוחסנות במסד נתונים של Postgres, באמצעות ספריית התבניות Mustache ל-Node.js.
אפשר לגשת לאפליקציה בכתובת URL מסוג HTTPS. מסלול /tasks בכתובת ה-URL הזו מאפשר לכם ליצור משימות חדשות.
ב- Google Cloud, נעשה שימוש ב-Cloud Run כפלטפורמה ללא שרת (serverless) לפריסת אפליקציית Tasks. Cloud Run מיועד להפעלת קונטיינרים ללא מצב (stateless) שמבוססים על בקשות. הוא מתאים במיוחד למקרים שבהם אתם צריכים שהשירות המנוהל שלכם יתמוך באפליקציות מבוססות-קונטיינרים שמתרחבות אוטומטית וגם מצטמצמות לאפס כשהן לא משרתות תנועה.
רכיבי מפה שמשמשים ב-Heroku ל Google Cloud
בטבלה הבאה מופיע מיפוי של רכיבים בפלטפורמת Heroku אל Google Cloud. המיפוי הזה עוזר לכם לתרגם את הארכיטקטורה שמתוארת במדריך הזה מ-Heroku ל- Google Cloud.
| רכיב | פלטפורמת Heroku | Google Cloud |
|---|---|---|
| קונטיינרים | Dynos: Heroku משתמשת במודל של קונטיינר כדי ליצור ולהרחיב אפליקציות של Heroku. הקונטיינרים האלה של Linux נקראים dynos, ואפשר להגדיל את מספרם עד למספר שאתם מציינים כדי לתמוך בדרישות המשאבים של אפליקציית Heroku. אתם יכולים לבחור מתוך מגוון סוגי dynos על סמך דרישות הזיכרון וה-CPU של האפליקציה. | קונטיינרים של Cloud Run: Google Cloud תומך בהרצת עומסי עבודה בקונטיינרים ללא שמירת מצב, שאפשר להריץ אותם בסביבה מנוהלת או באשכולות של Google Kubernetes Engine (GKE). |
| אפליקציית אינטרנט | אפליקציית Heroku: דינמו הם אבני הבניין של אפליקציות Heroku. אפליקציות מורכבות בדרך כלל מסוג אחד או יותר של dyno, בדרך כלל שילוב של dyno מסוג web ו-dyno מסוג worker. | שירות Cloud Run: אפשר ליצור מודל של אפליקציית אינטרנט כשירות Cloud Run. לכל שירות יש נקודת קצה משלו של HTTPS, והוא יכול להגדיל או להקטין את הקיבולת שלו באופן אוטומטי מ-0 ל-N על סמך התנועה לנקודת הקצה של השירות. |
| מסד נתונים | Heroku Postgres הוא מסד נתונים כשירות (DaaS) של Heroku שמבוסס על PostgreSQL. | Cloud SQL הוא שירות מנוהל של מסדי נתונים רלציוניים ב- Google Cloud. |
פריסת אפליקציית האינטרנט לדוגמה של Tasks ב-Heroku
בקטעים הבאים מוסבר איך להגדיר את ממשק שורת הפקודה (CLI) של Heroku, לשכפל את מאגר המקור של GitHub ולפרוס את האפליקציה ב-Heroku.
הגדרת ממשק שורת הפקודה של Heroku
במדריך הזה מריצים את Heroku CLI ב-Cloud Shell, וצריך לאמת באמצעות מפתח Heroku API. כשמריצים את Heroku CLI ב-Cloud Shell, אי אפשר לבצע אימות באמצעות סיסמה או אימות מבוסס-אינטרנט.
לחלופין, אם מריצים את הדוגמה במסוף מקומי, אפשר להשתמש בכל שיטת אימות של Heroku CLI. כשמריצים את המדריך בטרמינל מקומי, צריך גם להתקין את Google Cloud CLI, git ו-Docker.
מתחברים אל מסוף האינטרנט של Heroku, ואז מעתיקים את הערך של מפתח ה-API מדף הגדרות החשבון.
ב-Cloud Shell, מתקינים את Heroku CLI.
ב-Cloud Shell, מאמתים את Heroku CLI. כשמוצגת בקשה להזנת הסיסמה, מזינים את הערך של מפתח ה-API שהעתקתם ממסוף Heroku, ולא את הסיסמה שבה אתם משתמשים כדי להיכנס למסוף.
heroku login --interactive
שכפול מאגר המקור
ב-Cloud Shell, משכפלים את מאגר הנתונים של אפליקציית Tasks לדוגמה ב-GitHub:
git clone https://github.com/GoogleCloudPlatform/migrate-webapp-heroku-to-cloudrun-node.git
עוברים לספרייה שנוצרה על ידי שיבוט המאגר:
cd migrate-webapp-heroku-to-cloudrun-node
הספרייה מכילה את הקבצים הבאים:
- סקריפט Node.js בשם
index.jsעם הקוד של המסלולים שמוצגים על ידי אפליקציית האינטרנט. - קובצי
package.jsonו-package-lock.jsonשמפרטים את התלות של אפליקציית האינטרנט. כדי שהאפליקציה תפעל, צריך להתקין את התלויות האלה. - קובץ
Procfileשמציין את הפקודה שהאפליקציה מריצה בהפעלה. יוצרים קובץProcfileכדי לפרוס את האפליקציה ב-Heroku. - ספרייה
views, עם תוכן ה-HTML שמוצג על ידי אפליקציית האינטרנט בנתיב '/'. - קובץ
.gitignore.
- סקריפט Node.js בשם
פריסת אפליקציה ב-Heroku
ב-Cloud Shell, יוצרים אפליקציית Heroku:
heroku create
חשוב לשים לב לשם שנוצר לאפליקציה, כי תצטרכו להזין אותו בשלב הבא.
יוצרים משתנה סביבה לשם האפליקציה ב-Heroku:
export APP_NAME=APP_NAME
מחליפים את
APP_NAMEבשם האפליקציה שהוחזר על ידי הפקודהheroku create.מוסיפים את התוסף Heroku Postgres כדי להקצות מסד נתונים של PostgreSQL:
heroku addons:create heroku-postgresql:mini
מוודאים שהתוסף נוסף בהצלחה:
heroku addons
אם תוסף Postgres נוסף בהצלחה, תוצג הודעה דומה לזו:
Add-on Plan Price State ----------------- ----- -------- ----- heroku-postgresql mini 5$/month created
פורסים את האפליקציה ב-Heroku:
git push heroku master
מריצים את הפקודה הבאה כדי לאשר את הערך של DATABASE_URL.
heroku config
חשוב לזכור את הערך שמאוחזר עבור DATABASE_URL. תצטרכו את הערך הזה בשלב הבא.
מריצים קונטיינר של Docker.
docker run -it --rm postgres psql "DATABASE_URL"
מחליפים את
DATABASE_URLבכתובת ה-URL של Heroku Postgres שרשמתם בשלב הקודם.בקונטיינר Docker, יוצרים את הטבלה
TASKSבאמצעות הפקודה הבאה:CREATE TABLE TASKS (DESCRIPTION TEXT NOT NULL);
יוצאים מהקונטיינר:
exitב-Cloud Shell, מריצים את הפקודה הבאה כדי לקבל את כתובת האתר של אפליקציית Heroku:
heroku info
פותחים את כתובת ה-URL של האתר בחלון דפדפן. האפליקציה נראית כמו בצילום המסך הבא (אבל בגרסה שלך לא יופיעו המשימות):
ליצור משימות לדוגמה באפליקציה מהדפדפן. מוודאים שהמשימות מאוחזרות ממסד הנתונים ומוצגות בממשק המשתמש.
הכנת הקוד של אפליקציית האינטרנט להעברה אל Cloud Run
בקטע הזה מפורטים השלבים שצריך לבצע כדי להכין את אפליקציית האינטרנט לפריסה ב-Cloud Run.
איך יוצרים ומפרסמים את קונטיינר Docker ב-Container Registry
כדי ליצור את קונטיינר האפליקציה ולהריץ אותו ב-Cloud Run, צריך קובץ אימג' של Docker. אפשר ליצור את הקונטיינר באופן ידני או באמצעות Buildpacks.
יצירת קונטיינר באופן ידני
ב-Cloud Shell, יוצרים קובץ Dockerfile בספרייה שנוצרה על ידי שיבוט המאגר של המדריך הזה:
cat <<"EOF" > Dockerfile # Use the official Node image. # https://hub.docker.com/_/node FROM node:10-alpine # Create and change to the app directory. WORKDIR /app # Copying this separately prevents re-running npm install on every code change. COPY package*.json ./ RUN npm install # Copy local code to the container image. COPY . /app # Configure and document the service HTTP port. ENV PORT 8080 EXPOSE $PORT # Run the web service on container startup. CMD ["npm", "start"] EOF
יוצרים את הקונטיינר באמצעות Cloud Build ומפרסמים את קובץ האימג' ב-Container Registry:
gcloud builds submit --tag gcr.io/PROJECT_ID/APP_NAME:1 \ --gcs-log-dir=gs://PROJECT_ID_cloudbuild
יוצרים משתנה סביבה שיכיל את השם של תמונת Docker שיצרתם:
export IMAGE_NAME="gcr.io/PROJECT_ID/APP_NAME:1"
פיתוח קונטיינר באמצעות Buildpacks
ב-Cloud Shell, מתקינים את pack CLI.
מגדירים את pack CLI כך שישתמש ב-Heroku builder כברירת מחדל:
pack config default-builder heroku/buildpacks:22
יוצרים משתנה סביבה שיכיל את השם של קובץ האימג' של Docker:
export IMAGE_NAME=gcr.io/PROJECT_ID/APP_NAME:1
יוצרים את קובץ האימג' באמצעות הפקודה
packומעבירים אותו בדחיפה או מפרסמים אותו ב-Container Registry:pack build --publish $IMAGE_NAME
יצירת מכונות של Cloud SQL ל-PostgreSQL
יוצרים מופע של Cloud SQL ל-PostgreSQL שישמש כקצה העורפי של אפליקציית האינטרנט. במדריך הזה, PostgreSQL מתאים במיוחד כאפליקציית הדוגמה שנפרסת ב-Heroku, שמשתמשת במסד נתונים של Postgres כקצה העורפי שלה. לצורך השימוש באפליקציה הזו, לא צריך לבצע שינויים בסכימה כדי לעבור לשירות מנוהל של Postgres ב-Cloud SQL ל-PostgreSQL.
מכינים את הרשת ל-Cloud SQL עם כתובת IP פרטית.
gcloud compute addresses create google-managed-services-default \ --global \ --purpose=VPC_PEERING \ --prefix-length=16 \ --description="peering range for CloudSQL Private Service Access" \ --network=default gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=google-managed-services-default \ --network=default \ --project=PROJECT_ID
יוצרים משתנה סביבה בשם
CLOUDSQL_DB_NAMEכדי לשמור את השם של מופע מסד הנתונים שיוצרים בשלב הבא:export CLOUDSQL_DB_NAME=tasks-db
יוצרים את מסד הנתונים:
gcloud sql instances create $CLOUDSQL_DB_NAME \ --cpu=1 \ --memory=4352Mib \ --database-version=POSTGRES_15 \ --region=us-central1 \ --network default \ --no-assign-ip
יכול להיות שיחלפו כמה דקות עד שהמופע יאותחל.
מגדירים סיסמה למשתמש Postgres:
gcloud sql users set-password postgres \ --instance=$CLOUDSQL_DB_NAME \ --password=POSTGRES_PASSWORDמחליפים את
POSTGRES_PASSWORDבסיסמה שבה רוצים להשתמש למסד הנתונים של Postgres.
ייבוא נתונים אל Cloud SQL מ-Heroku Postgres
יש כמה דפוסי העברה שבהם אפשר להשתמש כדי להעביר נתונים ל-Cloud SQL. בדרך כלל, הגישה הכי טובה שלא דורשת זמן השבתה או דורשת זמן השבתה קצר היא להגדיר את Cloud SQL כרפליקה של מסד הנתונים שמועבר, ולהפוך את Cloud SQL למופע הראשי אחרי ההעברה. Heroku Postgres לא תומך בעותקים חיצוניים (followers), ולכן במדריך הזה משתמשים בכלים בקוד פתוח כדי להעביר את הסכימה של האפליקציה.
במדריך הזה, כדי לייצא נתונים מ-Heroku Postgres לקטגוריה של Cloud Storage ואז לייבא אותם ל-Cloud SQL, משתמשים בכלי pg_dump של אפליקציית Tasks. אפשר להשתמש בכלי הזה כדי להעביר נתונים בין גרסאות הומוגניות או אם הגרסה של מסד הנתונים של היעד חדשה יותר מהגרסה של מסד הנתונים של המקור.
ב-Cloud Shell, מאחזרים את פרטי הכניסה למסד הנתונים של Heroku Postgres שמצורף לאפליקציית הדוגמה. תצטרכו את פרטי הכניסה האלה בשלב הבא.
heroku pg:credentials:url
הפקודה הזו מחזירה את מחרוזת פרטי החיבור ואת כתובת ה-URL של החיבור לאפליקציה. מחרוזת פרטי החיבור היא בפורמט הבא:
"dbname=DATABASE_NAME host=FQDN port=5432 user=USER_NAME password=PASSWORD_STRING sslmode=require"
תצטרכו את הערכים שמוצגים במחרוזת החיבור בשלב הבא.
דוגמה לערך של FQDN (שם דומיין שמוגדר במלואו) במחרוזת של פרטי חיבור מופיעה במאמרי העזרה של Heroku.
מגדירים משתני סביבה שיכילו את הערכים של Heroku שבהם משתמשים בשלבים הבאים:
export HEROKU_PG_DBNAME=DATABASE_NAME export HEROKU_PG_HOST=FQDN export HEROKU_PG_USER=USER_NAME export HEROKU_PG_PASSWORD=PASSWORD_STRING
מחליפים את מה שכתוב בשדות הבאים:
-
DATABASE_NAME: שם מסד הנתונים שמוצג במחרוזת המידע. -
FQDN: ה-FQDN שמוצג במחרוזת המידע. -
USER_NAME: שם המשתמש שמוצג במחרוזת המידע. -
PASSWORD_STRING: מחרוזת הסיסמה שמוצגת במחרוזת המידע.
-
יוצרים גיבוי בפורמט SQL של מסד הנתונים של Heroku Postgres:
docker run \ -it --rm \ -e PGPASSWORD=$HEROKU_PG_PASSWORD \ -v $(pwd):/tmp \ --entrypoint "pg_dump" \ postgres \ -Fp \ --no-acl \ --no-owner \ -h $HEROKU_PG_HOST \ -U $HEROKU_PG_USER \ $HEROKU_PG_DBNAME > herokudump.sql
יוצרים משתנה סביבה שיכיל את השם של קטגוריה של Cloud Storage:
export PG_BACKUP_BUCKET=gs://PROJECT_ID-pg-backup-bucket
יוצרים קטגוריה של Cloud Storage:
gcloud storage buckets create $PG_BACKUP_BUCKET \ --location=us-central1 \ --public-access-prevention \ --uniform-bucket-level-access
מעלים את קובץ ה-SQL לקטגוריה הזו:
gcloud storage cp herokudump.sql $PG_BACKUP_BUCKET/herokudump.sql
נותנים למכונה של Cloud SQL את התפקידים הנדרשים לייבוא קובץ ה-SQL מקטגוריה של Cloud Storage:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='get("serviceAccountEmailAddress")') \ --role=roles/storage.objectAdmin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='get("serviceAccountEmailAddress")') \ --role=roles/cloudsql.editorמייבאים את קובץ ה-SQL למכונה של Cloud SQL:
gcloud sql import sql $CLOUDSQL_DB_NAME $PG_BACKUP_BUCKET/herokudump.sql \ --database=postgres \ --user=postgres
כשמופיעה בקשה
do you want to continue (y/n), מזינים y.
איך Cloud Run ניגש למסד הנתונים של Cloud SQL
כמו שאפליקציית האינטרנט שנפרסה ב-Heroku צריכה להתחבר למופע המנוהל של Heroku Postgres, גם ל-Cloud Run נדרשת גישה ל-Cloud SQL כדי לקרוא ולכתוב נתונים.
Cloud Run מתקשר עם Cloud SQL באמצעות שרת ה-proxy של Cloud SQL, שמופעל ומגודר באופן אוטומטי כשפורסים את הקונטיינר ב-Cloud Run. אין צורך לאשר כתובות IP חיצוניות במסד הנתונים, כי כל התקשורת שהוא מקבל היא מה-proxy באמצעות TCP מאובטח.
הקוד צריך להפעיל פעולות במסד הנתונים (כמו אחזור נתונים ממסד הנתונים או כתיבה אליו) על ידי הפעלת ה-proxy דרך שקע UNIX.
אפליקציית האינטרנט הזו כתובה ב-Node.js, ולכן משתמשים בספרייה pg-connection-string כדי לנתח כתובת URL של מסד נתונים וליצור אובייקט config. היתרון בגישה הזו הוא שהיא מאפשרת חיבור חלק למסד הנתונים של הבק-אנד ב-Heroku וב-Cloud Run.
בשלב הבא, מעבירים את כתובת ה-URL של מסד הנתונים כמשתנה סביבה כשמפעילים את אפליקציית האינטרנט.
פריסת אפליקציית הדוגמה ב-Cloud Run
ב-Cloud Shell, מגדירים גישה ל-VPC ללא שרת כדי לאפשר תעבורה פרטית מ-Cloud Run ל-Cloud SQL:
gcloud compute networks subnets create serverless-connector-subnet \ --network=default \ --range=10.0.0.0/28 \ --region=us-central1 gcloud compute networks vpc-access connectors create serverless-connector \ --region=us-central1 \ --subnet=serverless-connector-subnet
ב-Cloud Shell, יוצרים משתנה סביבה שמכיל את שם החיבור של מכונת Cloud SQL שיצרתם:
export DB_CONN_NAME=$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='value(connectionName)')
יוצרים משתנה סביבה בשם
DATABASE_URLכדי לאחסן את מחרוזת החיבור לחיבור ל-Cloud SQL Proxy דרך יציאת UNIX.export DATABASE_URL="socket:/cloudsql/${DB_CONN_NAME}?db=postgres&user=postgres&password=POSTGRES_PASSWORD"יוצרים חשבון שירות בשביל Cloud Run עם תפקיד IAM כדי להתחבר למסד הנתונים:
gcloud iam service-accounts create sa-run-db-client gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:sa-run-db-client@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudsql.clientפורסים את אפליקציית האינטרנט ב-Cloud Run:
gcloud run deploy tasksapp-PROJECT_ID \ --image=$IMAGE_NAME \ --service-account=sa-run-db-client@PROJECT_ID.iam.gserviceaccount.com \ --set-env-vars=DATABASE_URL=$DATABASE_URL \ --add-cloudsql-instances $DB_CONN_NAME \ --vpc-connector serverless-connector \ --allow-unauthenticatedהפקודה הקודמת גם מקשרת את מאגר Cloud Run למכונת מסד הנתונים של Cloud SQL שיצרתם. הפקודה מגדירה משתנה סביבה ל-Cloud Run כדי להפנות למחרוזת
DATABASE_URLשיצרתם בשלב הקודם.
בדיקת האפליקציה
ב-Cloud Shell, מאתרים את כתובת ה-URL שבה Cloud Run מציג תנועת גולשים:
gcloud run services list
אפשר גם לבדוק את שירות Cloud Run במסוףGoogle Cloud .
כדי לוודא שאפליקציית האינטרנט מקבלת בקשות HTTP, עוברים לכתובת ה-URL של שירות Cloud Run.
Cloud Run יוצר קונטיינר חדש, או מפעיל קונטיינר חדש, כשבקשת HTTP נשלחת לנקודת הקצה של ההצגה, ואם קונטיינר עדיין לא פועל. המשמעות היא שהבקשה שגורמת להתחלת הרצה של קונטיינר חדש עשויה להימשך קצת יותר זמן. בזמן הנוסף הזה, צריך לקחת בחשבון את מספר הבקשות המקבילות שהאפליקציה יכולה לתמוך בהן ודרישות זיכרון ספציפיות שיכולות להיות לה.
באפליקציה הזו, משתמשים בהגדרות ברירת המחדל של מקביליות, שמאפשרות לשירות Cloud Run לטפל ב-80 בקשות בו-זמנית ממכולה אחת.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה. כדאי גם למחוק את המשאבים שנוצרו ב-Heroku לצורך המדריך הזה.
מחיקת הפרויקט Google Cloud
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת אפליקציית Heroku
כדי למחוק את האפליקציה לדוגמה שפרסתם ב-Heroku ואת התוסף המשויך של PostgreSQL, מריצים את הפקודה הבאה:
heroku apps:destroy -a APP_NAME