搭配 Rails 5 使用 PostgreSQL 適用的 Cloud SQL

要開發在 App Engine 彈性環境中執行的 Ruby on Rails 應用程式,輕易即能入門。而且您所建立的應用程式,使用的正是所有 Google 產品採用的基礎架構,因此您可以放心,無論使用者只有幾人還是有數百萬人,應用程式都可調度資源,為所有使用者提供服務。

本教學課程假設您已熟悉 Rails 網路開發流程,並逐步引導您設定 PostgreSQL 適用的 Cloud SQL和一個新的 Rails 應用程式。您也可以使用本教學課程做為參考資料,來設定現有的 Rails 應用程式以使用 PostgreSQL 適用的 Cloud SQL。

本教學課程需要 Ruby 2.3.4 以上版本。

事前準備

請在完成下列各步驟後勾選核取方塊。

  1. check_box_outline_blank check_box在 Google Cloud Platform 主控台中建立專案。
    如果您尚未建立專案,請立即建立。專案可讓您管理應用程式的所有 Google Cloud Platform 資源,包括部署、存取權控管、計費和服務。
    1. 開啟 GCP 主控台
    2. 在頂端的下拉式選單中,選取 [Create a project] (建立專案)
    3. 按一下 [Show advanced options] (顯示進階選項),然後在「App Engine location」 (App Engine 位置) 底下選取位在美國的地點。
    4. 為您的專案命名。
    5. 記下專案 ID,這組 ID 可能與專案名稱不同。專案 ID 會在指令和設定中用到。
  2. check_box_outline_blank check_box為專案啟用計費功能,並申請免費試用。

    如果您尚未為專案啟用計費功能,請立即啟用計費功能,並申請免費試用。啟用計費功能後,應用程式就能使用計費資源,例如執行執行個體和儲存資料。 在免費試用期間,您不需要為任何服務付費。

  3. check_box_outline_blank check_box安裝 Cloud SDK。

    如果您尚未安裝 Cloud SDK,請立即安裝並初始化 Google Cloud SDK。Cloud SDK 包含的工具和程式庫可讓您在 GCP 上建立及管理資源。

  4. check_box_outline_blank check_box為您的專案啟用 API

    這會將您導向 GCP 主控台,並自動啟用本教學課程使用的 API:Cloud SQL Administration。

準備 PostgreSQL 適用的 Cloud SQL 執行個體

為本教學課程設定 PostgreSQL 適用的 Cloud SQL 執行個體。

  1. 建立 PostgreSQL 執行個體。在本教學課程中,執行個體的名稱為 rails-cloudsql-instance

  2. 在執行個體中建立資料庫。在本教學課程中,實際工作環境的資料庫名稱為 cat_list_production

  3. 設定執行個體的 postgres 使用者密碼

設定本機環境以使用 Rails

為本教學課程設定本機環境:

  1. 安裝 Ruby 2.3.4 以上版本。

  2. 安裝 Rails 5 Gem。

  3. 安裝 Bundler Gem。

如要進一步瞭解如何安裝 Rails 及其依附元件,請參閱官方的開始使用 Rails 指南。

完成上述前置步驟後,就能使用 PostgreSQL 適用的 Cloud SQL 建立及部署 Rails 應用程式。以下各節將逐步引導您進行應用程式設定、連結至 PostgreSQL 適用的 Cloud SQL,以及部署應用程式。

建立新應用程式來列出貓咪

  1. 執行 rails new 指令來建立新的 Rails 應用程式。此應用程式會在 PostgreSQL 適用的 Cloud SQL 中儲存一份貓咪清單。

    rails new cat_sample_app
    
  2. 前往產生的 Rails 應用程式所屬的目錄。

    cd cat_sample_app
    

在本機執行應用程式

如何在本機電腦上執行新的 Rails 應用程式:

  1. 使用 Bundler 安裝依附元件。

    bundle install
    
  2. 啟動本機網路伺服器:

    bundle exec bin/rails server
    
  3. 透過瀏覽器前往 http://localhost:3000/

頁面上會顯示應用程式發出的 Yay! You're on Rails! 訊息。

新版 Rails 應用程式執行中的螢幕擷取畫面

為貓咪清單產生 Scaffolding

針對構成貓咪清單 (包括貓咪的名字和年齡),名為 Cat 的資源產生 Scaffolding。

  1. 產生 Scaffolding。

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

    這個指令會為 Cat 資源產生模型、控制器和視圖。

    invoke  active_record
    create    db/migrate/20170804210744_create_cats.rb
    create    app/models/cat.rb
    invoke    rspec
    create      spec/models/cat_spec.rb
    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
    invoke    jbuilder
    create      app/views/cats/index.json.jbuilder
    create      app/views/cats/show.json.jbuilder
    create      app/views/cats/_cat.json.jbuilder
    invoke  assets
    invoke    js
    create      app/assets/javascripts/cats.js
    invoke    scss
    create      app/assets/stylesheets/cats.scss
    invoke  scss
    create    app/assets/stylesheets/scaffolds.scss
    
  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 應用程式。

將 PostgreSQL 適用的 Cloud SQL 搭配使用 App Engine

PostgreSQL 適用的 Cloud SQL 是全代管資料庫服務,用於設定、維護及管理 Google Cloud Platform (GCP) 中的 PostgreSQL 關聯式資料庫。您可以在 Rails 應用程式中使用 Cloud SQL,就跟其他關聯式資料庫一樣。

設定 PostgreSQL 適用的 Cloud SQL

開始在實際工作環境中使用 Cloud SQL 搭配 Rails 應用程式:

  1. pgappengine Gem 新增至 Gemfile 檔案。

    bundle add pg
    bundle add appengine
    

    Rails Gemfile 包含下列額外的 gem 項目:

    # Added at 2017-08-23 15:24:52 -0700 by franknatividad:
    gem "pg", "~> 0.21.0"
    
    # 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. 為 App Engine 實際工作環境設定 Cloud SQL 執行個體連線名稱。

    1. 擷取執行個體連線名稱。

      gcloud sql instances describe rails-cloudsql-instance
      
    2. 複製 connectionName 旁邊的值。

  4. 修改 database.yml 實際工作環境的資料庫設定,如下:

    production:
      adapter: postgresql
      encoding: unicode
      pool: 5
      timeout: 5000
      username: "[YOUR_POSTGRES_USERNAME]"
      password: "[YOUR_POSTGRES_PASSWORD]"
      database: "cat_list_production"
      host:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"

    其中:

    • [YOUR_POSTGRES_USERNAME] 是您的 PostgreSQL 使用者名稱。
    • [YOUR_POSTGRES_PASSWORD] 是您的 PostgreSQL 密碼。
    • [YOUR_INSTANCE_CONNECTION_NAME] 是您在上一個步驟中複製的執行個體連線名稱。

Rails 應用程式現已設定完畢,並會在部署至 App Engine 彈性環境時使用 Cloud SQL。

將應用程式部署至 App Engine 彈性環境

App Engine 彈性環境使用名為 app.yaml 的檔案來描述應用程式的部署設定。如果沒有這個檔案,Cloud SDK 會嘗試猜測部署設定。不過,您應該要定義檔案,為 Rails 密鑰和 Cloud SQL 提供必要的配置設定。

如要設定範例應用程式以部署至 App Engine,請在 Rails 應用程式目錄的根目錄中建立名為 app.yaml 的新檔案,並新增以下內容:

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

app.yaml 檔案中設定 Rails 密鑰

將 Rails 應用程式部署至 production 環境時,請設定環境變數 SECRET_KEY_BASE 和密鑰以保護使用者工作階段資料。系統會從 Rails 應用程式的 config/secrets.yml 檔案中讀取這個環境變數。

  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]

app.yaml 檔案中設定 Cloud SQL 執行個體

接著,請在 app.yaml 設定檔中提供 Cloud SQL 執行個體連線名稱,將 App Engine 彈性環境設為使用指定的 Cloud SQL 執行個體。

  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. 選取支援 Ruby 應用程式適用的 App Engine 彈性環境的地區。進一步瞭解地區和區域

部署新版本

接著,部署 app.yaml 檔案中所述的新版 Rails 應用程式,不要將來自目前預設服務版本的流量重新導向。

  1. 預先編譯 Rails 資產。

    bundle exec bin/rails assets:precompile
    
  2. 資產編譯完成後,部署新版應用程式。

    gcloud app deploy --no-promote
    

    完成部署可能需要幾分鐘時間。請等待系統顯示成功訊息。您可以在 App Engine 版本清單中查看已部署的版本。

如果您在部署新版本之後嘗試存取這個新版本,會因為您尚未遷移資料庫而看到以下錯誤訊息。

新版 Rails 應用程式錯誤訊息的螢幕擷取畫面

appengine Gem 授予必要權限

接著,請授予 cloudbuild 服務帳戶的存取權,以透過 appengine Gem 執行實際工作環境資料庫遷移作業。

  1. 列出可用的專案。

    gcloud projects list
    
  2. 在輸出中,找出您要用於部署應用程式的專案,然後複製該專案編號。

  3. 將新成員新增至專案 IAM 政策,讓 roles/editor 角色執行資料庫遷移作業。將 [YOUR-PROJECT-ID] 改成您的 GCP 專案 ID,並將 [PROJECT_NUMBER] 改成您在上一個步驟中複製的專案編號。

    gcloud projects add-iam-policy-binding [YOUR-PROJECT-ID] \
      --member=serviceAccount:[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com \
      --role=roles/editor
    

遷移您的 Rails 資料庫

您可以遷移 Rails 資料庫來更新資料庫結構定義,而不直接使用 SQL 語法。接著,遷移您的 cat_list_production 資料庫。

appengine Gem 提供 Rake 工作 appengine:exec,在實際工作環境中的 App Engine 彈性環境中,針對最近部署的應用程式版本執行指令。

  1. 在實際工作環境中,遷移 PostgreSQL 適用的 Cloud SQL cat_list_production 資料庫。

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

    畫面會顯示類似以下的輸出:

    ---------- EXECUTE COMMAND ----------
    bundle exec rake db:migrate
    Debuggee gcp:787021104993:8dae9032f8b02004 successfully registered
    == 20170804210744 CreateCats: migrating =======================================
    -- create_table(:cats)
       -> 0.0219s
    == 20170804210744 CreateCats: migrated (0.0220s) ==============================
    
    ---------- CLEANUP ----------
    
  2. 如要驗證資料庫遷移作業,請前往:

    [YOUR-VERSION]-dot-[YOUR-PROJECT-ID].appspot.com
    

如果部署成功,畫面將顯示如下:

新版 Rails 應用程式執行中的螢幕擷取畫面

將流量遷移至新版本

最後,使用以下指令將流量導向新部署的版本:

gcloud app services set-traffic default --splits [YOUR-VERSION]=1

您現在可以從下列位置存取新版應用程式:

https://[YOUR-PROJECT-ID].appspot.com

讀取 App Engine 記錄

Rails 應用程式現已部署完畢,接下來您可能會想讀取記錄。您可以使用 Google Cloud Platform 主控台中的記錄檢視器讀取應用程式記錄。

進一步瞭解如何使用 Cloud SDK 讀取記錄

清除所用資源

完成「搭配 Rails 5 使用 PostgreSQL 適用的 Cloud SQL」教學課程後,您可以清除在 GCP 上建立的資源,這樣資源就不會占用配額,日後也無須為其付費。以下各節說明如何刪除或停用這些資源。

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

刪除專案:

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

刪除 App Engine 版本

若要刪除應用程式版本:

刪除 Cloud SQL 執行個體

若要刪除 Cloud SQL 執行個體:

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁