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

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

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

כדי לבצע את הפעולות במדריך הזה, צריך להתקין את Ruby בגרסה 3.0 ואילך ואת Rails בגרסה 8 ואילך.

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

מטרות

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

עלויות

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

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

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

  3. Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  4. Install the Google Cloud CLI.

  5. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  6. To initialize the gcloud CLI, run the following command:

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

הכנת הסביבה

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

    ‫Linux/macOS

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

    Windows

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

הכנת שירותים תומכים

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

הגדרת מכונת 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, מזינים 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, מבצעים את הפעולות הבאות:
      • בוחרים באחת מהאפשרויות בקטע הגנה על נתונים שרוצים להגדיר לקטגוריה.
        • כדי להפעיל את האפשרות מחיקה זמנית, לוחצים על תיבת הסימון Soft delete policy (For data recovery) ומציינים את מספר הימים שבהם רוצים לשמור את האובייקטים אחרי המחיקה.
        • כדי להגדיר ניהול גרסאות של אובייקטים, לוחצים על תיבת הסימון ניהול גרסאות של אובייקטים (לניהול גרסאות) ומציינים את המספר המקסימלי של גרסאות לכל אובייקט ואת מספר הימים שאחריהם פג התוקף של הגרסאות הלא עדכניות.
        • כדי להפעיל את מדיניות שמירת הנתונים על אובייקטים וקטגוריות, לוחצים על תיבת הסימון שמירת נתונים (לצורך תאימות), ואז מבצעים את הפעולות הבאות:
          • כדי להפעיל את נעילת שמירת האובייקטים, לוחצים על תיבת הסימון Enable object retention.
          • כדי להפעיל את נעילת הקטגוריה, מסמנים את התיבה הגדרת מדיניות שמירת נתונים בקטגוריה ובוחרים יחידת זמן ואת משך הזמן של תקופת השמירה.
      • כדי לבחור איך להצפין את נתוני האובייקט, מרחיבים את הקטע 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. לוחצים על יצירת סוד.

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

      projects/PROJECTNUM/secrets/RAILS_SECRET_NAME

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

    8. בשדה New Members (רק הצטרפתי), מזינים PROJECTNUM-compute@ ולוחצים על Enter.

    9. בשדה New Members (רק הצטרפתי), מזינים PROJECTNUM@cloudbuild. ולוחצים על 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@ \
          --role roles/secretmanager.secretAccessor
      

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

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

      gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \
          --member serviceAccount:PROJECTNUM@cloudbuild. \
          --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 לפקודת הבנייה כדי להגדיל את משך הזמן הקצוב לתפוגה.

  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. מריצים את הסקריפט של 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 מבצע לא רק את השלבים הרגילים של פיתוח גרסת build של קובץ אימג' (יצירת קובץ האימג' של הקונטיינר והעברה שלו בדחיפה ל-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.

Cloud Logging ו-Error Reporting

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

כדי לתעד באופן אוטומטי חריגים שלא טופלו ולהציג עקבות מחסנית מעוצבות בדוח שגיאות, מוסיפים את ה-gem‏ google-cloud-error_reporting אל Gemfile:

gem "google-cloud-error_reporting"

כשמפעילים את אפליקציית Rails במצב ייצור, Bundler טוען את הספרייה באופן אוטומטי ומגדיר את Error Reporting כדי לתעד חריגים ממערך Rack. מידע נוסף מופיע במאמר בנושא הגדרת Error Reporting ב-Ruby.

הסרת המשאבים

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

    כניסה לדף Manage resources

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