הפעלת Rails בסביבת Cloud Run

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

פריסת אפליקציות Rails כוללת שילוב של כמה שירותים יחד כדי ליצור פרויקט מגובש. במדריך הזה אנחנו מניחים שאתם מכירים את פיתוח האינטרנט ב-Rails.

כדי לבצע את ההדרכה הזו, צריך Ruby 3.0 ואילך ו-Rails 8 ואילך.

תרשים שמציג את הארכיטקטורה של הפריסה.
האתר של Rails מוגש מ-Cloud Run, שמשתמש בכמה שירותי גיבוי כדי לאחסן סוגים שונים של נתונים (מידע על מסדי נתונים רלציוניים, נכסי מדיה, סודות תצורה ותמונות של קונטיינרים). שירותי הקצה העורפי מתעדכנים על ידי Cloud Build כחלק ממשימת בנייה והעברה.

מטרות

  • יצירה של מסד נתונים ב-Cloud SQL וחיבור שלו ל-Active Record
  • יצירה של Secret Manager ושימוש בו כדי לאחסן מפתח ראשי של Rails ולגשת אליו בצורה מאובטחת
  • אירוח מדיה וקבצים שהמשתמשים העלו ב-Cloud Storage מ-Active Storage
  • שימוש ב-Cloud Build כדי לבצע אוטומציה של גרסאות build והעברות של מסדי נתונים
  • פריסת אפליקציית Rails ב-Cloud Run

עלויות

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

  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 Run, Cloud SQL, Cloud Build, Secret Manager, 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. 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

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

  10. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  14. חשוב לוודא שיש הרשאות מספיקות בחשבון שבו משתמשים במדריך הזה.

הכנת הסביבה

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

הגדרת פרויקט ואזור ברירת מחדל

  1. מגדירים את תצורת הפרויקט שמוגדרת כברירת מחדל ל-ה-CLI של gcloud באמצעות הפקודה הבאה:

    gcloud config set project PROJECT_ID
    

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

  2. הגדרת האזור:

    export REGION=REGION
    

    מחליפים את REGION במיקום המתאים. כדי לשפר את היעילות בין השירותים, מומלץ לפרוס את כל השירותים באותו אזור. מידע נוסף על האזור הקרוב ביותר אליכם זמין במאמר מוצרים שזמינים לפי מיקום.

שכפול אפליקציית Rails

הקוד של אפליקציית הדוגמה של Rails נמצא במאגר GoogleCloudPlatform/ruby-docs-samples ב-GitHub.

  1. משכפלים את המאגר:

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
    
  2. עוברים לספרייה שמכילה את הקוד לדוגמה ומריצים את הפקודות הבאות כדי לוודא שהאפליקציה מוגדרת כראוי עם אבני החן ויחסי התלות הנדרשים:

    ‫Linux/macOS

    cd ruby-docs-samples/run/rails
    bundle install
    

    Windows

    cd ruby-docs-samples\run\rails
    bundle install
    

הכנת שירותי הגיבוי

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

הגדרת מכונה של Cloud SQL ל-PostgreSQL

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

בקטעים הבאים מתוארת יצירה של מכונת PostgreSQL, מסד נתונים ומשתמש במסד הנתונים עבור אפליקציית Rails.

יצירת מכונת PostgreSQL

המסוף

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. לוחצים על Create Instance.

  3. לוחצים על Choose PostgreSQL (בחירת PostgreSQL).

  4. בשדה Instance ID (מזהה המכונה), מזינים שם למכונה (INSTANCE_NAME).

  5. בשדה סיסמה, מזינים סיסמה למשתמש postgres.

  6. משאירים את ערכי ברירת המחדל בשאר השדות.

  7. לוחצים על Create Instance.

gcloud

  • יוצרים את מכונת PostgreSQL:

    gcloud sql instances create INSTANCE_NAME \
        --database-version POSTGRES_12 \
        --tier db-f1-micro \
        --region REGION
    

    מחליפים את מה שכתוב בשדות הבאים:

    יצירת המכונה אורכת כמה דקות, ולאחר מכן היא מוכנה לשימוש.

יצירת מסד נתונים

המסוף

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. בוחרים את המופע INSTANCE_NAME.

  3. עוברים לכרטיסייה מסדי נתונים.

  4. לוחצים על יצירת מסד נתונים.

  5. בתיבת הדו-שיח שם מסד הנתונים, מזינים DATABASE_NAME.

  6. לוחצים על יצירה.

gcloud

  • יוצרים את מסד הנתונים במופע שנוצר לאחרונה:

    gcloud sql databases create DATABASE_NAME \
        --instance INSTANCE_NAME
    

    מחליפים את DATABASE_NAME בשם של מסד הנתונים בתוך המכונה.

יצירת משתמש

יוצרים סיסמה אקראית למשתמש במסד הנתונים וכותבים אותה לקובץ בשם dbpassword:

cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword

המסוף

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. בוחרים את המופע INSTANCE_NAME.

  3. עוברים לכרטיסייה משתמשים.

  4. לוחצים על הוספת חשבון משתמש.

  5. בתיבת הדו-שיח אימות מובנה:

    1. מזינים את שם המשתמש DATABASE_USERNAME.
    2. מזינים את התוכן של הקובץ dbpassword כסיסמה PASSWORD.
  6. לוחצים על הוספה.

gcloud

  • יוצרים את המשתמש במופע שנוצר לאחרונה ומגדירים את הסיסמה שלו להיות התוכן של dbpassword:

    gcloud sql users create DATABASE_USERNAME \
       --instance=INSTANCE_NAME --password=$(cat dbpassword)
    

    מחליפים את DATABASE_USERNAME בשם של המשתמש בתוך המכונה.

הגדרת מאגר Artifact Registry

משתמשים ב-Artifact Registry כדי ליצור מאגר לאחסון קובץ האימג' של הקונטיינר.

המסוף

  1. נכנסים לדף Artifact Registry במסוף Google Cloud .

    כניסה ל-Artifact Registry

  2. לוחצים על Create Repository (יצירת מאגר).

  3. כתבו:

    • בשדה Name (שם), מזינים cloud-run-source-deploy.
    • בקטע Format (פורמט), בוחרים באפשרות Docker.
    • בשדה אזור, בוחרים באפשרות REGION.
  4. משאירים את ערכי ברירת המחדל בשאר השדות.

  5. לוחצים על יצירה.

gcloud

  • יוצרים מאגר Artifact Registry:

    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format docker \
        --location REGION
    

הגדרת קטגוריה של Cloud Storage

אפשר לארח נכסים סטטיים של Rails ומדיה שהועלתה על ידי משתמשים באחסון אובייקטים עם זמינות גבוהה באמצעות Cloud Storage.

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. לוחצים על יצירה.
  3. ממלאים את פרטי הקטגוריה בדף Create a bucket. כדי לעבור לשלב הבא לוחצים על Continue.
    1. בקטע Get started (תחילת העבודה), מבצעים את הפעולות הבאות:
    2. בשדה Location בוחרים את האזור הבא: us-central1
    3. בקטע Choose how to store your data, מבצעים את הפעולות הבאות:
      1. בקטע Set a default class, בוחרים באפשרות הבאה: Standard.
      2. כדי להפעיל מרחב שמות היררכי, בקטע Optimize storage for data-intensive workloads, בוחרים באפשרות Enable hierarchical namespace on this bucket.
    4. בקטע Choose how to control access to objects, בוחרים אם הקטגוריה אוכפת public access prevention או לא, ואז בוחרים שיטת בקרת גישה לאובייקטים של הקטגוריה.
    5. בקטע Choose how to protect object data, מבצעים את הפעולות הבאות:
      • בוחרים באחת מהאפשרויות בקטע הגנה על נתונים שרוצים להגדיר לקטגוריה.
        • כדי להפעיל מחיקה עם יכולת שחזור, מסמנים את התיבה מדיניות מחיקה עם יכולת שחזור (לשחזור נתונים) ומציינים את מספר הימים שבהם רוצים לשמור אובייקטים אחרי המחיקה.
        • כדי להגדיר ניהול גרסאות של אובייקטים, מסמנים את התיבה ניהול גרסאות של אובייקטים (לשליטה בגרסאות) ומציינים את מספר הגרסאות המקסימלי לכל אובייקט ואת מספר הימים שאחריהם הגרסאות הלא עדכניות יפוגו.
        • כדי להפעיל את מדיניות שמירת הנתונים על אובייקטים וקטגוריות, לוחצים על תיבת הסימון שמירת נתונים (לצורך תאימות), ואז מבצעים את הפעולות הבאות:
          • כדי להפעיל את הנעילה של שמירת אובייקטים, מסמנים את התיבה הפעלת שמירת אובייקטים.
          • כדי להפעיל את נעילת הקטגוריה, מסמנים את תיבת הסימון הגדרת מדיניות שמירת נתונים בקטגוריה ובוחרים יחידת זמן ואת משך הזמן של תקופת השמירה.
      • כדי לבחור איך להצפין את נתוני האובייקט, מרחיבים את הקטע Data encryption () ובוחרים Data encryption method.
  4. לוחצים על יצירה.

gcloud

  • יצירת קטגוריה של Cloud Storage. כדי ליצור שם ייחודי לקטגוריה של Cloud Storage, משתמשים ב-PROJECT_ID ובסיומת לבחירתכם, MEDIA_BUCKET_SUFFIX. ב-Cloud Storage, שמות הקטגוריות חייבים להיות ייחודיים באופן גלובלי.

    gcloud storage buckets create gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \
        --location=REGION
    

אחרי שיוצרים קטגוריה, כדי שהתמונות שמעלים יהיו ציבוריות, צריך לשנות את ההרשאות של אובייקטים של תמונות כך שכולם יוכלו לקרוא אותם.

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. ברשימת הקטגוריות, לוחצים על השם של הקטגוריה שרוצים להגדיר כציבורית.

  3. לוחצים על הכרטיסייה Permissions בחלק העליון של הדף.

  4. לוחצים על הלחצן הוספת חברים.

    מופיעה תיבת הדו-שיח הוספת חברים.

  5. בשדה New members מזינים את הערך allUsers.

  6. בתפריט הנפתח Select a role, בוחרים את תפריט המשנה Cloud Storage, ולוחצים על האפשרות Storage Object Viewer.

  7. לוחצים על Save.

אחרי אישור השיתוף באופן ציבורי, מופיע סמל קישור לכל אובייקט בעמודה public access. אפשר ללחוץ על הסמל הזה כדי לקבל את כתובת ה-URL של האובייקט.

במאמר פתרון בעיות מוסבר איך מקבלים מידע מפורט על שגיאות בנושא פעולות ב-Ruby שנכשלו במסוף Google Cloud .

gcloud

  • כדי להגדיר את כל האובייקטים כציבוריים, משתמשים בפקודה gcloud storage buckets add-iam-policy-binding. משתמשים בערך של MEDIA_BUCKET_SUFFIX שבו השתמשתם כשיצרתם את הקטגוריה.

    gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \
        --member=allUsers --role=roles/storage.objectViewer
    

אחסון ערכי סוד ב-Secret Manager

עכשיו, אחרי שהגדרתם את שירותי הגיבוי, ל-Rails דרוש מידע מאובטח, כמו סיסמאות, כדי לגשת לשירותים האלה. במקום להזין את הערכים האלה ישירות בקוד המקור של Rails, במדריך הזה נעשה שימוש ב-Rails Credentials וב-Secret Manager כדי לאחסן את המידע הזה בצורה מאובטחת.

יצירת קובץ מוצפן של פרטי כניסה ואחסון המפתח כסוד ב-Secret Manager

‫Rails מאחסן סודות בקובץ מוצפן בשם config/credentials.yml.enc. אפשר לפענח את הקובץ באמצעות config/master.key המקומי או משתנה הסביבה ENV["RAILS_MASTER_KEY"]. בקובץ פרטי הכניסה אפשר לאחסן את הסיסמה למסד הנתונים של מופע Cloud SQL ומפתחות גישה אחרים לממשקי API חיצוניים.

אפשר לאחסן את המפתח הזה בצורה מאובטחת ב-Secret Manager. לאחר מכן, תוכלו להעניק גישה למפתח ל-Cloud Run ול-Cloud Build על ידי מתן גישה לחשבונות השירות שלהם. חשבונות שירות מזוהים באמצעות כתובת אימייל שמכילה את מספר הפרויקט.

  1. מריצים את הפקודה הבאה כדי ליצור את הקובץ config/credentials.yml.enc:

    bin/rails credentials:edit
    

    הפקודה תיצור קובץ config/master.key אם לא מוגדר מפתח ראשי, ותיצור קובץ config/credentials.yml.enc אם הקובץ לא קיים. ייפתח קובץ זמני ב-$EDITOR שמוגדר כברירת מחדל עם התוכן המפוענח של הסודות שרוצים להוסיף.

  2. מעתיקים את הסיסמה של מסד הנתונים של מכונת PostgreSQL שנוצרה זה עתה מהקובץ dbpassword ומדביקים אותה בקובץ של פרטי הכניסה:

    secret_key_base: GENERATED_VALUE
    gcp:
        db_password: PASSWORD
    

    אפשר לגשת לסודות באמצעות Rails.application.credentials. לדוגמה, הפקודה Rails.application.credentials.secret_key_base אמורה להחזיר את בסיס מפתח הסוד של האפליקציה, והפקודה Rails.application.credentials.gcp[:db_password] אמורה להחזיר את הסיסמה של מסד הנתונים.

  3. הערך config/credentials/yml.enc מאוחסן בצורה מוצפנת, אבל אפשר לאחסן את config/master.key ב-Secret Manager.

    המסוף

    1. נכנסים לדף Secret Manager במסוף Google Cloud .

      מעבר לדף Secret Manager

    2. לוחצים על יצירת סוד.

    3. בשדה Name, מזינים שם לסוד RAILS_SECRET_NAME.

    4. בתיבת הדו-שיח Secret value (ערך סודי), מדביקים את הערך של master.key בתיבה.

    5. לוחצים על Create secret (יצירת סוד).

    6. בדף הפרטים של הסוד, רושמים את מספר הפרויקט:

      projects/PROJECTNUM/secrets/RAILS_SECRET_NAME

    7. בכרטיסייה Permissions, לוחצים על Add Member.

    8. בשדה New Members (חברים חדשים), מזינים PROJECTNUM-compute@developer.gserviceaccount.com ולוחצים על Enter.

    9. בשדה New Members (חברים חדשים), מזינים PROJECTNUM@cloudbuild.gserviceaccount.com ולוחצים על Enter.

    10. בתפריט הנפתח Role, בוחרים באפשרות Secret Manager Secret Accessor.

    11. לוחצים על Save.

    gcloud

    1. יוצרים סוד חדש עם הערך של config/master.key:

      gcloud secrets create RAILS_SECRET_NAME --data-file config/master.key
      

      מחליפים את RAILS_SECRET_NAME בשם של הסוד החדש.

    2. כדי לוודא שהסוד נוצר, בודקים אותו:

      gcloud secrets describe RAILS_SECRET_NAME
      
      gcloud secrets versions access latest --secret RAILS_SECRET_NAME
      
    3. קבלת הערך של מספר הפרויקט:

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
      
    4. נותנים גישה לסוד לחשבון השירות של Cloud Run:

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

      מחליפים את PROJECTNUM במספר הפרויקט.

    5. נותנים לחשבון השירות ב-Cloud Build גישה לסוד:

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor
      

      בפלט, מוודאים ששני חשבונות השירות מופיעים כחברים בקבוצה bindings.

חיבור אפליקציית Rails למסד נתונים ולאחסון בייצור

במדריך הזה נעשה שימוש במופע PostgreSQL כמסד הנתונים של הייצור וב-Cloud Storage כקצה העורפי של האחסון. כדי ש-Rails יוכל להתחבר למסד הנתונים ולמאגר האחסון החדשים שנוצרו, צריך לציין את כל הפרטים שנדרשים לגישה אליהם בקובץ .env. הקובץ .env מכיל את ההגדרות של משתני הסביבה של האפליקציה. האפליקציה תקרא את הקובץ הזה באמצעות ה-Gem של dotenv. מכיוון שהסודות מאוחסנים ב-credentials.yml.enc וב-Secret Manager, אין צורך להצפין את .env כי הוא לא מכיל פרטי כניסה רגישים.

  1. כדי להגדיר את אפליקציית Rails להתחבר למסד הנתונים ולמאגר האחסון, פותחים את הקובץ .env.
  2. משנים את ההגדרות של קובץ .env להגדרות הבאות. משתמשים בערך של MEDIA_BUCKET_SUFFIX שהשתמשתם בו כשיצרתם את הדלי.

    PRODUCTION_DB_NAME: DATABASE_NAME
    PRODUCTION_DB_USERNAME: DATABASE_USERNAME
    CLOUD_SQL_CONNECTION_NAME: PROJECT_ID:REGION:INSTANCE_NAME
    GOOGLE_PROJECT_ID: PROJECT_ID
    STORAGE_BUCKET_NAME: PROJECT_ID-MEDIA_BUCKET_SUFFIX
    

    אפליקציית Rails מוגדרת עכשיו לשימוש ב-Cloud SQL וב-Cloud Storage כשפורסים אותה ב-Cloud Run.

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

אחרי שמגדירים את שירותי הגיבוי, אפשר לפרוס את האפליקציה כשירות Cloud Run.

  1. באמצעות cloudbuild.yaml שסופק, משתמשים ב-Cloud Build כדי ליצור את התמונה, להריץ את העברות הנתונים של מסד הנתונים ולאכלס את הנכסים הסטטיים:

    gcloud builds submit --config cloudbuild.yaml \
        --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
    

    מחליפים את SERVICE_NAME בשם של השירות. הגרסה הראשונה תיבנה תוך כמה דקות. אם חלף הזמן הקצוב לתפוגה של ה-build, צריך להוסיף את האפשרות ‎--timeout=2000s לפקודת ה-build כדי להגדיל את משך הזמן הקצוב לתפוגה.

  2. אחרי שה-build מסתיים בהצלחה, פורסים את שירות Cloud Run בפעם הראשונה, ומגדירים את אזור השירות, קובץ הבסיס ואת מכונת Cloud SQL המקושרת:

    gcloud run deploy SERVICE_NAME \
            --region REGION \
            --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME \
            --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \
            --allow-unauthenticated
    

    הפלט אמור להראות שהפריסה הצליחה, עם כתובת URL של שירות.

  3. כדי לראות את השירות שנפרס, עוברים לכתובת ה-URL של השירות.

    דף הנחיתה של אלבום החתולים.
    אם כתובת ה-URL של השירות היא Cat Photo Album, אתם נמצאים בדף הבית של האפליקציה.

  4. כדאי לנסות להעלות תמונה חדשה. אם התמונה הועלתה בהצלחה, סימן שהאפליקציה של Rails נפרסה בהצלחה.

    דוגמה לפריט אלבום של חתולים
    אם כתובת ה-URL של השירות היא Cat Photo Album, אתם נמצאים בדף הבית של האפליקציה.

עדכון האפליקציה

השלבים הראשוניים של הקצאת הרשאות ופריסה היו מורכבים, אבל תהליך העדכון פשוט יותר:

  1. מריצים את סקריפט המיגרציה ואת ה-build של Cloud Build:

    gcloud builds submit --config cloudbuild.yaml \
            --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
    
  2. מפעילים את השירות, ומציינים רק את האזור והתמונה:

    gcloud run deploy SERVICE_NAME \
            --region REGION \
            --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME
    

הסבר על הקוד

אפליקציית הדוגמה של Rails נוצרה באמצעות פקודות רגילות של Rails. הפקודות הבאות יוצרות את האפליקציה cat_album ומשתמשות בפקודת ה-scaffold כדי ליצור מודל, בקר ותצוגות עבור משאב התמונה:

rails new cat_album
rails generate scaffold Photo caption:text

חיבור למסד נתונים

הקובץ config/database.yml מכיל את ההגדרות שנדרשות כדי לגשת למסדי הנתונים בסביבות שונות (פיתוח, בדיקה וייצור). לדוגמה, מסד הנתונים של הייצור מוגדר להפעלה ב-Cloud SQL ל-PostgreSQL. שם מסד הנתונים ושם המשתמש מוגדרים באמצעות משתני סביבה בקובץ .env, ואילו הסיסמה של מסד הנתונים מאוחסנת בקובץ config/credentials.yml.enc, שנדרש RAILS_MASTER_KEY כדי לפענח אותו.

כשהאפליקציה פועלת ב-Cloud Run (מנוהל באופן מלא), היא מתחברת למופע PostgreSQL באמצעות שקע שסופק על ידי סביבת Cloud Run. כשהאפליקציה פועלת במחשב המקומי, היא מתחברת למכונת PostgreSQL באמצעות שרת proxy ל-Cloud SQL Auth.

production:
  <<: *default
  database: <%= ENV["PRODUCTION_DB_NAME"] %>
  username: <%= ENV["PRODUCTION_DB_USERNAME"] %>
  password: <%= Rails.application.credentials.gcp[:db_password] %>
  host: "<%= ENV.fetch("DB_SOCKET_DIR") { '/cloudsql' } %>/<%= ENV["CLOUD_SQL_CONNECTION_NAME"] %>"

קבצי מדיה שהמשתמשים העלו לאחסון בענן

‫Rails משתמש ב-Active Storage כדי להעלות קבצים לספקי אחסון. הקבצים config/storage.yml ו-config/environments/production.rb מציינים את Cloud Storage כספק השירות בסביבת הייצור.

google:
  service: GCS
  project: <%= ENV["GOOGLE_PROJECT_ID"] %>
  bucket: <%= ENV["STORAGE_BUCKET_NAME"] %>
# Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :google

אוטומציה באמצעות Cloud Build

קובץ cloudbuild.yaml מבצע לא רק את השלבים הרגילים של יצירת קובץ אימג' (יצירת קובץ אימג' של קונטיינר והעברה שלו בדחיפה ל-Artifact Registry), אלא גם את ההעברות של מסד הנתונים של Rails. ההעברה הזו מתבצעת באמצעות משימות של Cloud Run, שבהן נעשה שימוש בפקודה בהתאמה אישית כדי שהמאגר יבצע את ההעברה, ולא שרת האינטרנט שמוגדר כברירת מחדל.

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    entrypoint: 'bash'
    args: ["-c", "docker build --build-arg MASTER_KEY=$$RAILS_KEY -t ${_IMAGE_NAME} . "]
    secretEnv: ["RAILS_KEY"]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "${_IMAGE_NAME}"]

  - id: "apply migrations"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: /bin/bash
    secretEnv: ["RAILS_KEY"]
    args:
      - "-c"
      - |
        gcloud run jobs create migrate-job \
          --region ${_REGION} \
          --image ${_IMAGE_NAME} \
          --set-cloudsql-instances ${_CLOUD_SQL_CONNECTION_NAME} \
          --set-env-vars RAILS_MASTER_KEY=$$RAILS_KEY \
          --command bundle \
          --args exec,rails,db:migrate \
          --execute-now --wait && \
          gcloud run jobs delete  migrate-job --region ${_REGION} -q

options:
  dynamicSubstitutions: true

substitutions:
  _REGION: us-central1
  _SERVICE_NAME: rails-cat-album
  _INSTANCE_NAME: cat-album
  _SECRET_NAME: rails-master-key
  _AR_REPO_NAME: cloud-run-source-deploy
  _IMAGE_NAME: ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO_NAME}/${_SERVICE_NAME}
  _CLOUD_SQL_CONNECTION_NAME: ${PROJECT_ID}:${_REGION}:${_INSTANCE_NAME}

availableSecrets:
  secretManager:
  - versionName: projects/${PROJECT_ID}/secrets/${_SECRET_NAME}/versions/latest
    env: RAILS_KEY

images:
  - "${_IMAGE_NAME}"

התצורה הזו משתמשת במשתני החלפה. אם משנים את הערכים בקובץ ישירות, אפשר להסיר את הדגל --substitutions בזמן ההעברה.

בתצורה הזו, רק העברות קיימות בספרייה db/migrate יחולו. במאמר Active Record Migrations (העברות של רשומות פעילות) מוסבר איך ליצור קובצי העברה.

כדי ליצור את האימג' ולהחיל את ההעברות, תצורת ה-build של Cloud Build צריכה גישה לסוד RAILS_MASTER_KEY מ-Secret Manager. בשדה availableSecrets מגדירים את גרסת הסוד ואת משתני הסביבה שבהם יש להשתמש בשביל הסוד. הסוד של מפתח הראשי מועבר כארגומנט בשלב של יצירת קובץ האימג' של ה-build, ואז הוא מוגדר להיות RAILS_MASTER_KEY ב-Dockerfile כשיוצרים את קובץ האימג'.

ARG MASTER_KEY
ENV RAILS_MASTER_KEY=${MASTER_KEY}

כדי להרחיב את ההגדרה של Cloud Build כך שתכלול את הפריסה בהגדרה אחת בלי להריץ שתי פקודות, אפשר לעיין במאמר פריסה רציפה מ-git באמצעות Cloud Build. כדי לעשות את זה, צריך לבצע שינויים ב-IAM, כמו שמתואר.

הסרת המשאבים

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

    כניסה לדף Manage resources

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