שימוש ב-Cloud SQL ל-MySQL עם Rails 7 ב-App Engine

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

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

המדריך הזה תומך ב-Ruby 3.0 ומעלה, ונדרשת גרסה כזו.

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

  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 Admin API.

    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 API

  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 SQL Admin API.

    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 API

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

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

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

    gcloud init

הכנת Cloud SQL למכונת MySQL

כדי להגדיר Cloud SQL למכונת MySQL לצורך המדריך הזה:

  1. יוצרים מכונה מהדור השני. במדריך הזה, שם המכונה הוא rails-cloudsql-instance.

  2. יוצרים מסד נתונים במופע. במדריך הזה, השם של מסד הנתונים של הייצור הוא cat_list_production.

  3. הגדרת סיסמה למשתמש root עבור המכונה.

הגדרת הסביבה המקומית ל-Rails

כדי להגדיר את הסביבה המקומית ללימודים:

  1. מתקינים את Ruby בגרסה 3.0 ואילך.

  2. מתקינים את gem‏ Rails 7.

  3. מתקינים את ה-gem של Bundler.

מידע נוסף על התקנת Rails ויחסי התלות שלה זמין במדריך הרשמי Getting started with Rails.

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

יצירת אפליקציה חדשה להצגת חתולים

  1. מריצים את הפקודה rails new כדי ליצור אפליקציית Rails חדשה. האפליקציה הזו מאחסנת רשימה של חתולים ב-Cloud SQL ל-MySQL.

    rails new cat_sample_app
    

    יכול להיות שתצטרכו גם להתקין ספריות mysql עבור mysql gems באמצעות פקודה כמו בדוגמה הבאה:

    sudo apt-get install libmysqlclient-dev
    
  2. עוברים אל הספרייה שמכילה את אפליקציית Rails שנוצרה.

    cd cat_sample_app
    

הרצת האפליקציה באופן מקומי

כדי להריץ את אפליקציית Rails החדשה במחשב המקומי:

  1. מפעילים שרת אינטרנט מקומי:

    bundle exec bin/rails server
    
  2. פותחים דפדפן אינטרנט ועוברים לכתובת http://localhost:3000/.

    באפליקציה לדוגמה מוצג הלוגו של Rails עם הגרסאות של Rails ו-Ruby.

צור פיגום לרשימה של חתולים

יוצרים scaffolding למשאב בשם Cat שמשמש ליצירת רשימה של חתולים עם השם והגיל שלהם.

  1. יצירת ה-scaffolding.

    bundle exec rails generate scaffold Cat name:string age:integer
    

    הפקודה יוצרת מודל, בקר ותצוגות למשאב Cat.

    invoke  active_record
    create    db/migrate/20230922063608_create_cats.rb
    create    app/models/cat.rb
    invoke    test_unit
    create      test/models/cat_test.rb
    create      test/fixtures/cats.yml
    invoke  resource_route
    route    resources :cats
    invoke  scaffold_controller
    create    app/controllers/cats_controller.rb
    invoke    erb
    create      app/views/cats
    create      app/views/cats/index.html.erb
    create      app/views/cats/edit.html.erb
    create      app/views/cats/show.html.erb
    create      app/views/cats/new.html.erb
    create      app/views/cats/_form.html.erb
    create      app/views/cats/_cat.html.erb
    invoke    resource_route
    invoke    test_unit
    create      test/controllers/cats_controller_test.rb
    create      test/system/cats_test.rb
    invoke    helper
    create      app/helpers/cats_helper.rb
    invoke      test_unit
    invoke    jbuilder
    create      app/views/cats/index.json.jbuilder
    create      app/views/cats/show.json.jbuilder
    create      app/views/cats/_cat.json.jbuilder
    
  2. פותחים את הקובץ config/routes.rb כדי לראות את התוכן שנוצר.

    Rails.application.routes.draw do
      resources :cats
      get 'cats/index'
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
    
    end
  3. מוסיפים את root 'cats#index' לקובץ.

    Rails.application.routes.draw do
      resources :cats
      get 'cats/index'
    
      # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
      root 'cats#index'
    end
  4. שומרים את הקובץ וסוגרים אותו.

  5. בודקים את אפליקציית Rails לפי ההוראות.

שימוש ב-Cloud SQL ל-MySQL עם App Engine

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

הגדרת Cloud SQL ל-MySQL

כדי להתחיל להשתמש ב-Cloud SQL עם אפליקציית Rails בסביבת ייצור:

  1. מוסיפים את אבני החן mysql2 ו-appengine לקובץ Gemfile.

    bundle add mysql2
    bundle add appengine
    

    קובץ ה-Rails‏ Gemfile מכיל את הרשומות הנוספות הבאות של gem:

    # Added at 2017-08-07 11:54:06 -0700 by USER:
    gem "mysql2", "~> 0.4.8"
    
    # Added at 2017-08-07 11:54:12 -0700 by USER:
    gem "appengine", "~> 0.4.1"
  2. כדי להגדיר את אפליקציית Rails להתחבר ל-Cloud SQL, פותחים את הקובץ config/database.yml. מוצגות ההגדרות הבאות של מסד נתונים סטנדרטי עבור SQLite:

    # SQLite version 3.x
    #   gem install sqlite3
    #
    #   Ensure the SQLite 3 gem is defined in your Gemfile
    #   gem 'sqlite3'
    #
    default: &default
      adapter: sqlite3
      pool: 5
      timeout: 5000
    
    development:
      <<: *default
      database: db/development.sqlite3
    
    # Warning: The database defined as "test" will be erased and
    # re-generated from your development database when you run "rake".
    # Do not set this db to the same as development or production.
    test:
      <<: *default
      database: db/test.sqlite3
    
    production:
      <<: *default
      database: db/production.sqlite3
  3. מגדירים את שם החיבור של מופע Cloud SQL עבור סביבת הייצור של App Engine.

    1. מאחזרים את שם החיבור של המכונה.

      gcloud sql instances describe rails-cloudsql-instance
      
    2. מעתיקים את הערך שליד connectionName.

  4. משנים את ההגדרה של מסד הנתונים של הייצור לערכים הבאים:database.yml

    production:
      adapter: mysql2
      pool: 5
      timeout: 5000
      username: "[YOUR_MYSQL_USERNAME]"
      password: "[YOUR_MYSQL_PASSWORD]"
      database: "cat_list_production"
      socket:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"

    כאשר:

    • [YOUR_MYSQL_USERNAME] מייצג את שם המשתמש שלכם ב-MySQL.
    • [YOUR_MYSQL_PASSWORD] מייצג את הסיסמה שלכם ל-MySQL.
    • [YOUR_INSTANCE_CONNECTION_NAME] מייצג את שם החיבור של המופע שהעתקתם בשלב הקודם.

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

פריסת האפליקציה בסביבה הגמישה של App Engine

בסביבה הגמישה של App Engine נעשה שימוש בקובץ שנקרא app.yaml כדי לתאר את הגדרות הפריסה של אפליקציה. אם הקובץ הזה לא קיים, ה-CLI של gcloud ינסה לנחש את הגדרות הפריסה. עם זאת, כדאי להגדיר את הקובץ כדי לספק את הגדרות התצורה הנדרשות למפתח הסודי של Rails ול-Cloud SQL.

כדי להגדיר את אפליקציית הדוגמה לפריסה ב-App Engine, יוצרים קובץ חדש בשם app.yaml בתיקיית השורש של אפליקציית Rails ומוסיפים את השורות הבאות:

entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby

מגדירים את המפתח הסודי של Rails בקובץ app.yaml

כשפורסים אפליקציית Rails בסביבת production, צריך להגדיר את משתנה הסביבה SECRET_KEY_BASE עם מפתח סודי כדי להגן על נתוני סשן של משתמשים. משתנה הסביבה הזה נקרא מהקובץ config/secrets.yml באפליקציית Rails.

  1. יוצרים מפתח סודי חדש.

    bundle exec bin/rails secret
    
  2. מעתיקים את המפתח הסודי שנוצר.

  3. פותחים את הקובץ app.yaml שיצרתם קודם ומוסיפים קטע env_variables. הקובץ env_variables מגדיר משתני סביבה בסביבה הגמישה של App Engine. קובץ app.yaml צריך להיראות כמו בדוגמה הבאה, כשמחליפים את [SECRET_KEY] במפתח הסודי שלכם.

    entrypoint: bundle exec rackup --port $PORT
    env: flex
    runtime: ruby
    
    env_variables:
      SECRET_KEY_BASE: [SECRET_KEY]

הגדרת המכונה של Cloud SQL בקובץ app.yaml

בשלב הבא, מגדירים את הסביבה הגמישה של App Engine כך שתשתמש במופע Cloud SQL שצוין. לשם כך, מציינים את שם החיבור של מופע Cloud SQL בקובץ ההגדרות app.yaml.

  1. פותחים את הקובץ app.yaml ומוסיפים קטע חדש בשם beta_settings.

  2. מגדירים פרמטר מקונן cloud_sql_instances עם שם החיבור של המופע כערך.

    התג app.yaml אמור להיראות כך:

    entrypoint: bundle exec rackup --port $PORT
    env: flex
    runtime: ruby
    
    env_variables:
      SECRET_KEY_BASE: [SECRET_KEY]
    
    beta_settings:
      cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]

יצירת אפליקציה בסביבה גמישה של App Engine

אם זו הפעם הראשונה שאתם פורסים אפליקציה, אתם צריכים ליצור אפליקציה בסביבה גמישה של App Engine ולבחור את האזור שבו אתם רוצים להריץ את אפליקציית Rails.

  1. יוצרים אפליקציית App Engine.

    gcloud app create
    
  2. בוחרים אזור שתומך בסביבה גמישה של App Engine לאפליקציות Ruby. מידע נוסף על אזורים ותחומים

פריסת גרסה חדשה

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

  1. קומפילציה מראש של נכסי Rails.

    bundle exec bin/rails assets:precompile
    
  2. אחרי שהנכסים מסיימים את ההידור, פורסים גרסה חדשה של האפליקציה.

    gcloud app deploy --no-promote
    

    תהליך הפריסה עשוי להימשך כמה דקות. מחכים להודעת הצלחה. אפשר לראות את הגרסאות שפרסתם ברשימת הגרסאות של App Engine.

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

צילום מסך של הודעת שגיאה באפליקציית Rails חדשה

מתן ההרשאה הנדרשת ל-Gem‏ appengine

לאחר מכן, נותנים לחשבון השירות של Cloud Build גישה להרצת העברות של מסד נתונים בסביבת ייצור באמצעות ה-gem‏ appengine.

  1. רשימת הפרויקטים הזמינים.

    gcloud projects list
    
  2. בפלט, מוצאים את הפרויקט שבו רוצים להשתמש כדי לפרוס את האפליקציה ומעתיקים את מספר הפרויקט.

  3. מוסיפים חבר חדש למדיניות IAM של הפרויקט לתפקיד roles/editor כדי להריץ העברות של מסדי נתונים. מחליפים את PROJECT_ID במזהה הפרויקט ב-Google Cloud ואת PROJECT_NUMBER במספר הפרויקט שהעתקתם בשלב הקודם.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/editor
    

העברת מסד נתונים של Rails

העברות של מסדי נתונים ב-Rails משמשות לעדכון הסכימה של מסד הנתונים בלי להשתמש ישירות בתחביר SQL. בשלב הבא מעבירים את מסד הנתונים של cat_list_production.

‫Gem‏ appengine מספק את משימת Rake‏ appengine:exec להרצת פקודה מול הגרסה האחרונה של האפליקציה שפרסתם בסביבה הגמישה של App Engine לייצור.

  1. העברת מסד הנתונים cat_list_production של Cloud SQL ל-MySQL בסביבת ייצור.

    bundle exec rake appengine:exec -- bundle exec rake db:migrate
    

    הפלט אמור להיראות כך:

    ---------- EXECUTE COMMAND ----------
    bundle exec rake db:migrate
    Debuggee gcp:787021104993:8dae9032f8b02004 successfully registered
    == 20230922063608 CreateCats: migrating =======================================
    -- create_table(:cats)
       -> 0.0219s
    == 20230922063608 CreateCats: migrated (0.0220s) ==============================
    
    ---------- CLEANUP ----------
    
  2. כדי לאמת את העברת מסד הנתונים, עוברים אל:

    VERSION-dot-PROJECT_ID.appspot.com

אם הפריסה בוצעה בהצלחה, מוצגות ההודעות הבאות:

צילום מסך של אפליקציית Rails חדשה שפועלת

העברת תנועה לגרסה חדשה

לבסוף, מפנים את התנועה לגרסה החדשה שהופעלה באמצעות הפקודה הבאה:

gcloud app services set-traffic default --splits VERSION=1

הגרסה החדשה של האפליקציה זמינה עכשיו בכתובת:

https://PROJECT_ID.appspot.com

קריאת יומנים של App Engine

אחרי שפורסים את אפליקציית Rails, יכול להיות שתרצו לקרוא את היומנים. אפשר לקרוא את יומני האפליקציה באמצעות Logs Explorer שנמצא במסוף Google Cloud .

מידע נוסף על קריאת יומנים באמצעות ה-CLI של gcloud

לפנות משאבים

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

מחק את הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

כדי למחוק את הפרויקט:

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

    כניסה לדף Manage resources

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

מחיקת גרסה של App Engine

כדי למחוק גרסת אפליקציה:

  1. במסוף Google Cloud , נכנסים לדף Versions של App Engine.

    כניסה לדף Versions

  2. מסמנים את התיבה שלצד גרסת האפליקציה שלא מוגדרת כברירת מחדל ושרוצים למחוק.
  3. כדי למחוק את גרסת האפליקציה, לוחצים על Delete.

מחיקת מכונה של Cloud SQL

כדי למחוק מכונה של Cloud SQL:

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

    כניסה לדף Instances

  2. לוחצים על השם של מכונת ה-SQL שרוצים למחוק.
  3. כדי למחוק את המכונה, לוחצים על Delete ופועלים לפי ההוראות.

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