העברה של אפליקציות Node.js מ-Heroku ל-Cloud Run

במדריך הזה מוסבר איך להעביר אפליקציות אינטרנט של 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, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

יכול להיות שתחויבו גם על המשאבים שבהם אתם משתמשים ב-Heroku.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. 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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. 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.

    4. 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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. Click Grant access.
    4. In the New principals field, enter your user identifier. This is typically the email address for a Google Account.

    5. Click Select a role, then search for the role.
    6. To grant additional roles, click Add another role and add each additional role.
    7. Click Save.
  6. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  7. Verify that billing is enabled for your Google Cloud project.

  8. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  9. 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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. 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.

    4. 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

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. Click Grant access.
    4. In the New principals field, enter your user identifier. This is typically the email address for a Google Account.

    5. Click Select a role, then search for the role.
    6. To grant additional roles, click Add another role and add each additional role.
    7. Click Save.

מגדירים את הסביבה

  1. פותחים את Cloud Shell.

    פותחים את Cloud Shell.

  2. ב-Cloud Shell, מגדירים משתני סביבה וערכי ברירת מחדל ל-Google Cloud CLI שמשמש במדריך הזה.

    gcloud config set project PROJECT_ID
    gcloud config set run/region us-central1
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

ארכיטקטורה

באיורים הבאים מוצגת הארכיטקטורה של אפליקציית האינטרנט ב-Heroku (כמו שהיא) ופריסת הארכיטקטורה שלה ב- Google Cloud (שתבנו).

ארכיטקטורה כמו שהיא ב-Heroku.
איור 1. ארכיטקטורה כמו שהיא ב-Heroku

אפליקציית המשימות שמוצבת כרגע ב-Heroku מורכבת מדינמו אחד או יותר של אינטרנט. דינמו אינטרנט יכול לקבל תנועת HTTP ולהגיב לה, בניגוד לדינמו עובד, שמתאים יותר למשימות ברקע ולמשימות מתוזמנות. האפליקציה מציגה דף אינדקס עם משימות שמאוחסנות במסד נתונים של Postgres, באמצעות ספריית התבניות Mustache ל-Node.js.

אפשר לגשת לאפליקציה בכתובת URL מסוג HTTPS. מסלול /tasks בכתובת ה-URL הזו מאפשר לכם ליצור משימות חדשות.

ארכיטקטורה עתידית ב-Heroku.
איור 2. ארכיטקטורה שאתם בונים על Google Cloud

ב- 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.

  1. מתחברים אל מסוף האינטרנט של Heroku, ואז מעתיקים את הערך של מפתח ה-API מדף הגדרות החשבון.

  2. ב-Cloud Shell, מתקינים את Heroku CLI.

  3. ב-Cloud Shell, מאמתים את Heroku CLI. כשמוצגת בקשה להזנת הסיסמה, מזינים את הערך של מפתח ה-API שהעתקתם ממסוף Heroku, ולא את הסיסמה שבה אתם משתמשים כדי להיכנס למסוף.

    heroku login --interactive
    

שכפול מאגר המקור

  1. ב-Cloud Shell, משכפלים את מאגר הנתונים של אפליקציית Tasks לדוגמה ב-GitHub:

    git clone https://github.com/GoogleCloudPlatform/migrate-webapp-heroku-to-cloudrun-node.git
    
  2. עוברים לספרייה שנוצרה על ידי שיבוט המאגר:

    cd migrate-webapp-heroku-to-cloudrun-node
    

    הספרייה מכילה את הקבצים הבאים:

    • סקריפט Node.js בשם index.js עם הקוד של המסלולים שמוצגים על ידי אפליקציית האינטרנט.
    • קובצי package.json ו-package-lock.json שמפרטים את התלות של אפליקציית האינטרנט. כדי שהאפליקציה תפעל, צריך להתקין את התלויות האלה.
    • קובץ Procfile שמציין את הפקודה שהאפליקציה מריצה בהפעלה. יוצרים קובץ Procfile כדי לפרוס את האפליקציה ב-Heroku.
    • ספרייה views, עם תוכן ה-HTML שמוצג על ידי אפליקציית האינטרנט בנתיב '/'.
    • קובץ .gitignore.

פריסת אפליקציה ב-Heroku

  1. ב-Cloud Shell, יוצרים אפליקציית Heroku:

    heroku create
    

    חשוב לשים לב לשם שנוצר לאפליקציה, כי תצטרכו להזין אותו בשלב הבא.

  2. יוצרים משתנה סביבה לשם האפליקציה ב-Heroku:

    export APP_NAME=APP_NAME
    

    מחליפים את APP_NAME בשם האפליקציה שהוחזר על ידי הפקודה heroku create.

  3. מוסיפים את התוסף Heroku Postgres כדי להקצות מסד נתונים של PostgreSQL:

    heroku addons:create heroku-postgresql:mini
    
  4. מוודאים שהתוסף נוסף בהצלחה:

    heroku addons
    

    אם תוסף Postgres נוסף בהצלחה, תוצג הודעה דומה לזו:

    Add-on               Plan     Price       State
    -----------------    -----    --------    -----
    heroku-postgresql    mini     5$/month    created
    
  5. פורסים את האפליקציה ב-Heroku:

    git push heroku master
    
  6. מריצים את הפקודה הבאה כדי לאשר את הערך של DATABASE_URL.

    heroku config
    

    חשוב לזכור את הערך שמאוחזר עבור DATABASE_URL. תצטרכו את הערך הזה בשלב הבא.

  7. מריצים קונטיינר של Docker.

    docker run -it --rm postgres psql "DATABASE_URL"
    

    מחליפים את DATABASE_URL בכתובת ה-URL של Heroku Postgres שרשמתם בשלב הקודם.

  8. בקונטיינר Docker, יוצרים את הטבלה TASKS באמצעות הפקודה הבאה:

    CREATE TABLE TASKS
    (DESCRIPTION TEXT NOT NULL);
    
  9. יוצאים מהקונטיינר:

    exit
    
  10. ב-Cloud Shell, מריצים את הפקודה הבאה כדי לקבל את כתובת האתר של אפליקציית Heroku:

    heroku info
    
  11. פותחים את כתובת ה-URL של האתר בחלון דפדפן. האפליקציה נראית כמו בצילום המסך הבא (אבל בגרסה שלך לא יופיעו המשימות):

    אפליקציית מטלות בדפדפן האינטרנט.

  12. ליצור משימות לדוגמה באפליקציה מהדפדפן. מוודאים שהמשימות מאוחזרות ממסד הנתונים ומוצגות בממשק המשתמש.

הכנת הקוד של אפליקציית האינטרנט להעברה אל Cloud Run

בקטע הזה מפורטים השלבים שצריך לבצע כדי להכין את אפליקציית האינטרנט לפריסה ב-Cloud Run.

איך יוצרים ומפרסמים את קונטיינר Docker ב-Container Registry

כדי ליצור את קונטיינר האפליקציה ולהריץ אותו ב-Cloud Run, צריך קובץ אימג' של Docker. אפשר ליצור את הקונטיינר באופן ידני או באמצעות Buildpacks.

יצירת קונטיינר באופן ידני

  1. ב-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
    
  2. יוצרים את הקונטיינר באמצעות Cloud Build ומפרסמים את קובץ האימג' ב-Container Registry:

    gcloud builds submit --tag gcr.io/PROJECT_ID/APP_NAME:1 \
      --gcs-log-dir=gs://PROJECT_ID_cloudbuild
    
  3. יוצרים משתנה סביבה שיכיל את השם של תמונת Docker שיצרתם:

    export IMAGE_NAME="gcr.io/PROJECT_ID/APP_NAME:1"
    

פיתוח קונטיינר באמצעות Buildpacks

  1. ב-Cloud Shell, מתקינים את pack CLI.

  2. מגדירים את pack CLI כך שישתמש ב-Heroku builder כברירת מחדל:

    pack config default-builder heroku/buildpacks:22
    
  3. יוצרים משתנה סביבה שיכיל את השם של קובץ האימג' של Docker:

    export IMAGE_NAME=gcr.io/PROJECT_ID/APP_NAME:1
    
  4. יוצרים את קובץ האימג' באמצעות הפקודה pack ומעבירים אותו בדחיפה או מפרסמים אותו ב-Container Registry:

    pack build --publish $IMAGE_NAME
    

יצירת מכונות של Cloud SQL ל-PostgreSQL

יוצרים מופע של Cloud SQL ל-PostgreSQL שישמש כקצה העורפי של אפליקציית האינטרנט. במדריך הזה, PostgreSQL מתאים במיוחד כאפליקציית הדוגמה שנפרסת ב-Heroku, שמשתמשת במסד נתונים של Postgres כקצה העורפי שלה. לצורך השימוש באפליקציה הזו, לא צריך לבצע שינויים בסכימה כדי לעבור לשירות מנוהל של Postgres ב-Cloud SQL ל-PostgreSQL.

  1. מכינים את הרשת ל-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
    
  2. יוצרים משתנה סביבה בשם CLOUDSQL_DB_NAME כדי לשמור את השם של מופע מסד הנתונים שיוצרים בשלב הבא:

    export CLOUDSQL_DB_NAME=tasks-db
    
  3. יוצרים את מסד הנתונים:

    gcloud sql instances create $CLOUDSQL_DB_NAME \
    --cpu=1 \
    --memory=4352Mib \
    --database-version=POSTGRES_15 \
    --region=us-central1 \
    --network default \
    --no-assign-ip
    

    יכול להיות שיחלפו כמה דקות עד שהמופע יאותחל.

  4. מגדירים סיסמה למשתמש 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. אפשר להשתמש בכלי הזה כדי להעביר נתונים בין גרסאות הומוגניות או אם הגרסה של מסד הנתונים של היעד חדשה יותר מהגרסה של מסד הנתונים של המקור.

  1. ב-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.

  2. מגדירים משתני סביבה שיכילו את הערכים של 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: מחרוזת הסיסמה שמוצגת במחרוזת המידע.
  3. יוצרים גיבוי בפורמט 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
    
  4. יוצרים משתנה סביבה שיכיל את השם של קטגוריה של Cloud Storage:

    export PG_BACKUP_BUCKET=gs://PROJECT_ID-pg-backup-bucket
    
  5. יוצרים קטגוריה של Cloud Storage:

    gcloud storage buckets create $PG_BACKUP_BUCKET \
      --location=us-central1 \
      --public-access-prevention \
      --uniform-bucket-level-access
    
  6. מעלים את קובץ ה-SQL לקטגוריה הזו:

    gcloud storage cp herokudump.sql $PG_BACKUP_BUCKET/herokudump.sql
    
  7. נותנים למכונה של 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
    
  8. מייבאים את קובץ ה-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

  1. ב-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
    
  2. ב-Cloud Shell, יוצרים משתנה סביבה שמכיל את שם החיבור של מכונת Cloud SQL שיצרתם:

    export DB_CONN_NAME=$(gcloud sql instances describe $CLOUDSQL_DB_NAME --format='value(connectionName)')
    
  3. יוצרים משתנה סביבה בשם DATABASE_URL כדי לאחסן את מחרוזת החיבור לחיבור ל-Cloud SQL Proxy דרך יציאת UNIX.

    export DATABASE_URL="socket:/cloudsql/${DB_CONN_NAME}?db=postgres&user=postgres&password=POSTGRES_PASSWORD"
    
  4. יוצרים חשבון שירות בשביל 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
    
  5. פורסים את אפליקציית האינטרנט ב-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 שיצרתם בשלב הקודם.

בדיקת האפליקציה

  1. ב-Cloud Shell, מאתרים את כתובת ה-URL שבה Cloud Run מציג תנועת גולשים:

    gcloud run services list
    

    אפשר גם לבדוק את שירות Cloud Run במסוףGoogle Cloud .

  2. כדי לוודא שאפליקציית האינטרנט מקבלת בקשות HTTP, עוברים לכתובת ה-URL של שירות Cloud Run.

‫Cloud Run יוצר קונטיינר חדש, או מפעיל קונטיינר חדש, כשבקשת HTTP נשלחת לנקודת הקצה של ההצגה, ואם קונטיינר עדיין לא פועל. המשמעות היא שהבקשה שגורמת להתחלת הרצה של קונטיינר חדש עשויה להימשך קצת יותר זמן. בזמן הנוסף הזה, צריך לקחת בחשבון את מספר הבקשות המקבילות שהאפליקציה יכולה לתמוך בהן ודרישות זיכרון ספציפיות שיכולות להיות לה.

באפליקציה הזו, משתמשים בהגדרות ברירת המחדל של מקביליות, שמאפשרות לשירות Cloud Run לטפל ב-80 בקשות בו-זמנית ממכולה אחת.

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה. כדאי גם למחוק את המשאבים שנוצרו ב-Heroku לצורך המדריך הזה.

מחיקת הפרויקט Google Cloud

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת אפליקציית Heroku

כדי למחוק את האפליקציה לדוגמה שפרסתם ב-Heroku ואת התוסף המשויך של PostgreSQL, מריצים את הפקודה הבאה:

heroku apps:destroy -a APP_NAME

המאמרים הבאים