Menggunakan Cloud SQL untuk MySQL 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 MySQL dengan aplikasi Rails baru. Anda juga dapat menggunakan tutorial ini sebagai referensi untuk mengonfigurasi aplikasi Rails yang ada agar menggunakan Cloud SQL untuk MySQL.

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 Cloud SQL untuk instance MySQL

Untuk menyiapkan Cloud SQL untuk instance MySQL dalam tutorial ini:

  1. Buat instance Generasi Kedua. Dalam tutorial ini, nama untuk instance adalah rails-cloudsql-instance.

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

  3. Tetapkan sandi pengguna root 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, Anda dapat membuat dan men-deploy aplikasi Rails menggunakan Cloud SQL untuk MySQL. Bagian berikut akan memandu Anda mengonfigurasi, terhubung ke Cloud SQL untuk MySQL, 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 MySQL.

    rails new cat_sample_app
    

    Anda mungkin juga perlu menginstal library mysql untuk gem mysql menggunakan perintah seperti contoh berikut:

    sudo apt-get install libmysqlclient-dev
    
  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 web, 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 MySQL dengan App Engine

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

Menyiapkan Cloud SQL untuk MySQL

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

  1. Tambahkan gem mysql2 dan appengine ke file Gemfile.

    bundle add mysql2
    bundle add appengine
    

    Gemfile Rails berisi entri gem tambahan berikut:

    # 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. Untuk mengonfigurasi aplikasi Rails agar terhubung ke 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: mysql2
      pool: 5
      timeout: 5000
      username: "[YOUR_MYSQL_USERNAME]"
      password: "[YOUR_MYSQL_PASSWORD]"
      database: "cat_list_production"
      socket:   "/cloudsql/[YOUR_INSTANCE_CONNECTION_NAME]"

    Dengan:

    • [YOUR_MYSQL_USERNAME] mewakili nama pengguna MySQL Anda.
    • [YOUR_MYSQL_PASSWORD] mewakili sandi MySQL 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 mendeskripsikan 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 penyajian default saat ini.

  1. Kompilasi awal aset Rails.

    bundle exec bin/rails assets:precompile
    
  2. Setelah aset selesai dikompilasi, deploy versi baru aplikasi.

    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 ID projectGoogle Cloud Anda dan ganti PROJECT_NUMBER dengan nomor project yang Anda salin pada 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. Migrasikan database cat_list_production Cloud SQL untuk MySQL 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, buka:

    VERSION-dot-PROJECT_ID.appspot.com

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:

https://PROJECT_ID.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