Menggunakan Cloud SQL untuk PostgreSQL dengan Rails 7 di App Engine

Mulai mengembangkan aplikasi Ruby on Rails yang berjalan di lingkungan fleksibel App Engine. Aplikasi yang Anda buat berjalan di infrastruktur yang sama dengan yang mendukung semua produk Google, sehingga Anda dapat yakin bahwa aplikasi tersebut dapat diskalakan untuk melayani semua pengguna Anda, baik sedikit maupun jutaan.

Tutorial ini mengasumsikan bahwa Anda sudah memahami pengembangan web Rails. Tutorial ini akan memandu Anda menyiapkan Cloud SQL untuk PostgreSQL dengan aplikasi Rails baru. Anda juga dapat menggunakan tutorial ini sebagai referensi untuk mengonfigurasi aplikasi Rails yang ada agar menggunakan Cloud SQL untuk PostgreSQL.

Tutorial ini mendukung dan memerlukan Ruby 3.0 atau yang lebih baru.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  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. Instal Google Cloud CLI.

  6. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  7. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    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. Instal Google Cloud CLI.

  12. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  13. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init

Menyiapkan instance Cloud SQL untuk PostgreSQL

Siapkan instance Cloud SQL untuk PostgreSQL untuk tutorial ini.

  1. Buat instance PostgreSQL. Dalam tutorial ini, nama instance-nya adalah rails-cloudsql-instance.

  2. Buat database di instance. Dalam tutorial ini, nama database produksi adalah cat_list_production.

  3. Setel sandi pengguna postgres untuk instance.

Menyiapkan lingkungan lokal untuk Rails

Untuk menyiapkan lingkungan lokal Anda untuk tutorial ini:

  1. Instal Ruby versi 3.0 atau yang lebih baru.

  2. Instal gem Rails 7.

  3. Instal gem Bundler.

Untuk mengetahui informasi tambahan tentang cara menginstal Rails dan dependensinya, lihat panduan resmi Mulai menggunakan Rails.

Setelah menyelesaikan prasyarat, buat dan deploy aplikasi Rails dengan menggunakan Cloud SQL untuk PostgreSQL. Bagian berikut akan memandu Anda mengonfigurasi, menghubungkan ke Cloud SQL untuk PostgreSQL, dan men-deploy aplikasi.

Membuat aplikasi baru untuk mencantumkan kucing

  1. Jalankan perintah rails new untuk membuat aplikasi Rails baru. Aplikasi ini menyimpan daftar kucing di Cloud SQL untuk PostgreSQL.

    rails new cat_sample_app
    
  2. Buka direktori yang berisi aplikasi Rails yang dihasilkan.

    cd cat_sample_app
    

Menjalankan aplikasi secara lokal

Untuk menjalankan aplikasi Rails baru di komputer lokal Anda:

  1. Mulai server web lokal:

    bundle exec bin/rails server
    
  2. Di browser, buka http://localhost:3000/

    Aplikasi contoh menampilkan logo Rails dengan versi Rails dan Ruby.

Buat scaffolding untuk daftar kucing

Buat struktur untuk resource bernama Cat yang digunakan untuk membentuk daftar kucing beserta nama dan usianya.

  1. Buat kerangka.

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

    Perintah ini menghasilkan model, pengontrol, dan tampilan untuk resource 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. Buka file config/routes.rb untuk melihat konten yang dihasilkan berikut.

    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. Tambahkan root 'cats#index' ke file.

    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. Simpan file tersebut, lalu tutup.

  5. Uji aplikasi Rails seperti yang diinstruksikan sebelumnya.

Menggunakan Cloud SQL untuk PostgreSQL dengan App Engine

Cloud SQL untuk PostgreSQL adalah layanan database terkelola sepenuhnya untuk menyiapkan, memelihara, mengelola, dan mengatur database PostgreSQL relasional Anda diGoogle Cloud. Anda dapat menggunakan Cloud SQL di aplikasi Rails seperti database relasional lainnya.

Menyiapkan Cloud SQL untuk PostgreSQL

Untuk mulai menggunakan Cloud SQL dengan aplikasi Rails Anda dalam produksi:

  1. Tambahkan gem pg dan appengine ke file Gemfile.

    bundle add pg
    bundle add appengine
    

    Gemfile Rails berisi entri gem tambahan berikut:

    gem "appengine", "~> 0.6"
    gem "pg", "~> 1.2"
  2. Untuk mengonfigurasi aplikasi Rails agar terhubung dengan Cloud SQL, buka file config/database.yml. Setelan database boilerplate berikut untuk SQLite ditampilkan:

    # 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. Konfigurasi nama koneksi instance Cloud SQL untuk lingkungan produksi App Engine.

    1. Ambil nama koneksi instance.

      gcloud sql instances describe rails-cloudsql-instance
      
    2. Salin nilai di samping connectionName.

  4. Ubah konfigurasi database produksi database.yml menjadi berikut:

    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]"

    Dengan:

    • [YOUR_POSTGRES_USERNAME] mewakili nama pengguna instance Cloud SQL untuk PostgreSQL Anda.
    • [YOUR_POSTGRES_PASSWORD] mewakili sandi instance Cloud SQL untuk PostgreSQL Anda.
    • [YOUR_INSTANCE_CONNECTION_NAME] mewakili nama koneksi instance yang Anda salin di langkah sebelumnya.

Aplikasi Rails kini disiapkan untuk menggunakan Cloud SQL saat men-deploy ke lingkungan fleksibel App Engine.

Men-deploy aplikasi ke lingkungan fleksibel App Engine

Lingkungan fleksibel App Engine menggunakan file bernama app.yaml untuk menjelaskan konfigurasi deployment aplikasi. Jika file ini tidak ada, gcloud CLI akan mencoba menebak konfigurasi deployment. Namun, Anda harus menentukan file untuk memberikan setelan konfigurasi yang diperlukan untuk kunci rahasia Rails dan Cloud SQL.

Untuk mengonfigurasi aplikasi contoh agar dapat di-deploy ke App Engine, buat file baru bernama app.yaml di root direktori aplikasi Rails, lalu tambahkan kode berikut:

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

Mengonfigurasi kunci rahasia Rails dalam file app.yaml

Saat aplikasi Rails di-deploy ke lingkungan production, tetapkan variabel lingkungan SECRET_KEY_BASE dengan kunci rahasia untuk melindungi data sesi pengguna. Variabel lingkungan ini dibaca dari file config/secrets.yml di aplikasi Rails Anda.

  1. Buat kunci rahasia baru.

    bundle exec bin/rails secret
    
  2. Salin kunci rahasia yang dibuat.

  3. Buka file app.yaml yang Anda buat sebelumnya, lalu tambahkan bagian env_variables. env_variables menentukan variabel lingkungan di lingkungan fleksibel App Engine. File app.yaml akan terlihat seperti contoh berikut dengan [SECRET_KEY] diganti dengan kunci rahasia Anda.

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

Konfigurasi instance Cloud SQL dalam file app.yaml

Selanjutnya, konfigurasi lingkungan fleksibel App Engine untuk menggunakan instance Cloud SQL yang ditentukan dengan memberikan nama koneksi instance Cloud SQL dalam file konfigurasi app.yaml.

  1. Buka file app.yaml, lalu tambahkan bagian baru bernama beta_settings.

  2. Tentukan parameter bertingkat cloud_sql_instances dengan nama koneksi instance sebagai nilai.

    app.yaml akan terlihat seperti berikut:

    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]

Membuat aplikasi lingkungan fleksibel App Engine

Jika ini adalah pertama kalinya Anda men-deploy aplikasi, Anda perlu membuat aplikasi lingkungan fleksibel App Engine dan memilih region tempat Anda ingin menjalankan aplikasi Rails.

  1. Buat aplikasi App Engine.

    gcloud app create
    
  2. Pilih region yang mendukung lingkungan fleksibel App Engine untuk aplikasi Ruby. Baca selengkapnya tentang Region dan zona.

Men-deploy versi baru

Selanjutnya, deploy versi baru aplikasi Rails yang dijelaskan dalam file app.yaml tanpa mengalihkan traffic dari versi penayangan default saat ini dengan menjalankan perintah ini:

gcloud app deploy --no-promote

Mungkin perlu waktu beberapa menit untuk menyelesaikan deployment. Tunggu pesan berhasil. Anda dapat melihat versi yang di-deploy di daftar versi App Engine.

Setelah men-deploy versi baru, jika Anda mencoba mengakses versi baru ini, pesan error berikut akan ditampilkan karena Anda belum memigrasikan database.

Screenshot pesan error aplikasi Rails baru

Memberikan izin yang diperlukan untuk gem appengine

Selanjutnya, berikan akses ke akun layanan cloudbuild untuk menjalankan migrasi database produksi dengan gem appengine.

  1. Mencantumkan project yang tersedia.

    gcloud projects list
    
  2. Di output, temukan project yang ingin Anda gunakan untuk men-deploy aplikasi, lalu salin nomor project.

  3. Tambahkan anggota baru ke kebijakan IAM project Anda untuk peran roles/editor agar dapat menjalankan migrasi database. Ganti PROJECT_ID dengan project ID Google Cloud Anda dan ganti PROJECT_NUMBER dengan nomor project yang Anda salin di langkah sebelumnya.

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

Memigrasikan database Rails

Migrasi database Rails digunakan untuk memperbarui skema database Anda tanpa menggunakan sintaksis SQL secara langsung. Selanjutnya, Anda akan memigrasikan database cat_list_production.

Gem appengine menyediakan tugas Rake appengine:exec untuk menjalankan perintah terhadap versi aplikasi yang di-deploy terbaru di lingkungan fleksibel App Engine produksi.

  1. Memigrasikan database cat_list_production Cloud SQL untuk PostgreSQL dalam produksi.

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

    Anda akan melihat output yang mirip dengan:

    ---------- 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. Untuk memverifikasi migrasi database, masukkan URL berikut di browser Anda:

    https://VERSION_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com
    

    Ganti kode berikut:

    • VERSION_ID: Versi baru aplikasi yang Anda deploy sebelumnya. Untuk mendapatkan daftar versi, gunakan gcloud app versions list. Item versi layanan default terakhir adalah deployment terbaru.
    • PROJECT_ID: Project ID Google Cloud Anda
    • REGION_ID: Kode yang ditetapkan App Engine ke aplikasi Anda

Berikut yang ditampilkan untuk deployment yang berhasil:

Screenshot aplikasi Rails baru yang sedang berjalan

Memigrasikan traffic ke versi baru

Terakhir, arahkan traffic ke versi yang baru di-deploy menggunakan perintah berikut:

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

Versi baru aplikasi kini dapat diakses dari URL berikut:

https://PROJECT_ID.REGION_ID.r.appspot.com

Membaca log App Engine

Setelah men-deploy aplikasi Rails, Anda mungkin ingin membaca log. Anda dapat membaca log aplikasi menggunakan Logs Explorer yang ada di konsol Google Cloud .

Anda dapat mempelajari lebih lanjut cara membaca log menggunakan gcloud CLI.

Membersihkan resource

Setelah menyelesaikan tutorial, Anda dapat membersihkan resource yang dibuat agar tidak lagi menggunakan kuota dan menimbulkan tagihan. Bagian berikut menjelaskan cara menghapus atau menonaktifkan resource ini.

Hapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. Di Konsol Google Cloud , buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus versi App Engine

Untuk menghapus versi aplikasi:

  1. Di konsol Google Cloud , buka halaman Versions untuk App Engine.

    Buka Versi

  2. Pilih kotak centang untuk versi aplikasi non-default yang ingin Anda hapus.
  3. Untuk menghapus versi aplikasi, klik Hapus.

Menghapus instance Cloud SQL

Untuk menghapus instance Cloud SQL:

  1. Di konsol Google Cloud , buka halaman Instances.

    Buka Instances

  2. Klik nama instance SQL yang ingin Anda hapus.
  3. Untuk menghapus instance, klik Hapus, lalu ikuti petunjuknya.

Langkah berikutnya