Pelajari cara men-deploy aplikasi Rails contoh ke Cloud Run dan cara mengintegrasikan database terkelola, penyimpanan objek, secret terenkripsi, dan pipeline build dengan komputasi serverless.
Men-deploy aplikasi Rails melibatkan pengintegrasian beberapa layanan bersama-sama untuk membentuk project yang kohesif. Tutorial ini mengasumsikan bahwa Anda sudah memahami pengembangan web Rails.
Tutorial ini memerlukan Ruby 3.0 atau yang lebih baru dan Rails 8 atau yang lebih baru.
Tujuan
- Membuat dan menghubungkan database Cloud SQL ke Active Record
- Membuat dan menggunakan Secret Manager untuk menyimpan dan mengakses kunci utama Rails secara aman
- Menghosting media dan file yang diupload pengguna di Cloud Storage dari Active Storage
- Menggunakan Cloud Build untuk mengotomatiskan build dan migrasi database
- Men-deploy aplikasi Rails ke Cloud Run
Biaya
Sebelum memulai
- 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.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init - Pastikan izin yang memadai tersedia untuk akun yang digunakan dalam tutorial ini.
Menyiapkan lingkungan Anda
Tutorial ini menggunakan beberapa layanan Google Cloud untuk menyediakan database, penyimpanan media, dan penyimpanan rahasia yang mendukung aplikasi Rails yang di-deploy. Siapkan lingkungan Anda dengan mengonfigurasi region untuk men-deploy layanan dan dengan meng-clone aplikasi Rails.
Menetapkan project dan region default
Tetapkan konfigurasi project default untuk gcloud CLI dengan menjalankan perintah berikut:
gcloud config set project PROJECT_IDGanti
PROJECT_IDdengan project ID Google Cloud AndaKonfigurasi region Anda:
export REGION=REGIONGanti
REGIONdengan lokasi yang sesuai. Untuk efisiensi antar-layanan, semua layanan harus di-deploy di region yang sama. Untuk mengetahui informasi selengkapnya tentang region terdekat dengan Anda, lihat Produk yang tersedia berdasarkan lokasi.
Meng-clone aplikasi Rails
Kode untuk aplikasi contoh Rails ada di repositori
GoogleCloudPlatform/ruby-docs-samples
di GitHub.
Buat clone repositori:
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.gitBuka direktori yang berisi kode contoh dan jalankan perintah berikut untuk memastikan aplikasi disiapkan dengan benar menggunakan gem dan dependensi yang diperlukan:
Linux/macOS
cd ruby-docs-samples/run/rails bundle installWindows
cd ruby-docs-samples\run\rails bundle install
Menyiapkan layanan pendukung
Tutorial ini menggunakan sejumlah layanan Google Cloud untuk menyediakan database, penyimpanan media, dan penyimpanan rahasia yang mendukung project Rails yang di-deploy. Layanan ini di-deploy di region tertentu. Untuk efisiensi antar-layanan, sebaiknya semua layanan di-deploy di region yang sama. Untuk mengetahui informasi selengkapnya tentang region terdekat dengan Anda, lihat Produk yang tersedia berdasarkan lokasi.
Menyiapkan instance Cloud SQL untuk PostgreSQL
Rails mendukung beberapa database relasional, termasuk beberapa yang ditawarkan oleh Cloud SQL. Tutorial ini menggunakan PostgreSQL, database open source yang umum digunakan oleh aplikasi Rails.
Bagian berikut menjelaskan pembuatan instance, database, dan pengguna database PostgreSQL untuk aplikasi Rails Anda.
Buat instance PostgreSQL
Konsol
Di konsol Google Cloud , buka halaman Instance Cloud SQL.
Klik Create Instance.
Klik Pilih PostgreSQL.
Di kolom Instance ID, masukkan nama untuk instance (
INSTANCE_NAME).Di kolom Password, masukkan sandi untuk pengguna postgres.
Gunakan nilai default untuk kolom lainnya.
Klik Create Instance.
gcloud
Buat instance PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --database-version POSTGRES_12 \ --tier db-f1-micro \ --region REGIONGanti kode berikut:
INSTANCE_NAME: nama instance Cloud SQL baru AndaREGION: Google Cloud wilayah
Proses pembuatan instance dan penyiapannya agar siap digunakan memerlukan waktu beberapa menit.
Buat database
Konsol
Di Konsol Google Cloud , buka halaman Instance Cloud SQL.
Pilih instance INSTANCE_NAME.
Buka tab Database.
Klik Create database.
Dalam dialog Database name, masukkan
DATABASE_NAME.Klik Create.
gcloud
Buat database dalam instance yang baru saja dibuat:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAMEGanti
DATABASE_NAMEdengan nama untuk database di dalam instance.
Membuat pengguna
Buat sandi acak untuk pengguna database, dan tulis ke file bernama dbpassword:
cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword
Konsol
Di Konsol Google Cloud , buka halaman Instance Cloud SQL.
Pilih instance INSTANCE_NAME.
Buka tab Pengguna.
Klik Add User Account.
Di bagian dialog Built-in Authentication:
- Masukkan nama pengguna
DATABASE_USERNAME. - Masukkan konten file
dbpasswordsebagai sandiPASSWORD.
- Masukkan nama pengguna
Klik Tambahkan.
gcloud
Buat pengguna dalam instance yang baru dibuat dan tetapkan sandinya menjadi konten dbpassword:
gcloud sql users create DATABASE_USERNAME \ --instance=INSTANCE_NAME --password=$(cat dbpassword)Ganti
DATABASE_USERNAMEdengan nama pengguna di dalam instance.
Menyiapkan repositori Artifact Registry
Gunakan Artifact Registry untuk membuat repositori guna menyimpan image container Anda.
Konsol
Di konsol Google Cloud , buka halaman Artifact Registry.
Klik Create Repository.
Masukkan:
- Untuk Name, masukkan "cloud-run-source-deploy".
- Untuk Format, pilih "Docker".
- Untuk Region, pilih REGION.
Pertahankan nilai default untuk kolom lainnya.
Klik Create.
gcloud
Buat repositori Artifact Registry:
gcloud artifacts repositories create cloud-run-source-deploy \ --repository-format docker \ --location REGION
Menyiapkan bucket Cloud Storage
Anda dapat menghosting aset statis Rails dan media yang diupload pengguna di penyimpanan objek yang sangat tersedia menggunakan Cloud Storage.
Konsol
- Di konsol Google Cloud , buka halaman Buckets Cloud Storage.
- Klik Create.
- Di halaman Buat bucket, masukkan informasi bucket Anda. Untuk melanjutkan ke
langkah berikutnya, klik Lanjutkan.
-
Di bagian Mulai, lakukan tindakan berikut:
- Masukkan nama yang unik secara global yang memenuhi persyaratan penamaan bucket.
- Untuk menambahkan
label bucket,
luaskan bagian Label (),
klik add_box
Tambahkan label, lalu tentukan
keydanvalueuntuk label Anda.
- Untuk Location, pilih opsi berikut: us-central1
-
Di bagian Choose how to store your data, lakukan tindakan berikut:
- Di bagian Setel kelas default, pilih opsi berikut: Standard.
- Untuk mengaktifkan namespace hierarkis, di bagian Optimalkan penyimpanan untuk beban kerja intensif data, pilih Aktifkan namespace hierarkis di bucket ini.
- Di bagian Pilih cara mengontrol akses ke objek, pilih apakah bucket Anda menerapkan pencegahan akses publik atau tidak, lalu pilih metode kontrol akses untuk objek bucket Anda.
-
Di bagian Pilih cara melindungi data objek, lakukan
tindakan berikut:
- Pilih salah satu opsi di bagian Perlindungan data yang ingin Anda tetapkan untuk bucket Anda.
- Untuk mengaktifkan penghapusan sementara, klik kotak centang Kebijakan penghapusan sementara (Untuk pemulihan data), dan tentukan jumlah hari Anda ingin mempertahankan objek setelah penghapusan.
- Untuk menyetel Pembuatan Versi Objek, klik kotak centang Pembuatan versi objek (Untuk kontrol versi), dan tentukan jumlah maksimum versi per objek dan jumlah hari setelah versi lama berakhir.
- Untuk mengaktifkan kebijakan retensi pada objek dan bucket, klik kotak centang Retensi (Untuk kepatuhan), lalu lakukan hal berikut:
- Untuk mengaktifkan Penguncian Retensi Objek, centang kotak Aktifkan retensi objek.
- Untuk mengaktifkan Bucket Lock, centang kotak Setel kebijakan retensi bucket, lalu pilih satuan waktu dan durasi untuk periode retensi data Anda.
- Untuk memilih cara mengenkripsi data objek Anda, luaskan bagian Enkripsi data (), lalu pilih metode Enkripsi data.
- Pilih salah satu opsi di bagian Perlindungan data yang ingin Anda tetapkan untuk bucket Anda.
-
Di bagian Mulai, lakukan tindakan berikut:
- Klik Create.
gcloud
Membuat bucket Cloud Storage. Untuk membuat nama bucket Cloud Storage yang unik, gunakan PROJECT_ID dan sufiks pilihan Anda,
MEDIA_BUCKET_SUFFIX. Di Cloud Storage, nama bucket harus unik secara global.gcloud storage buckets create gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \ --location=REGION
Setelah membuat bucket, untuk membuat gambar yang diupload menjadi publik, ubah izin objek gambar agar dapat dibaca oleh semua orang.
Konsol
- Di konsol Google Cloud , buka halaman Buckets Cloud Storage.
Dalam daftar bucket, klik nama bucket yang ingin Anda tampilkan kepada publik.
Pilih tab Permissions di dekat bagian atas halaman.
Klik tombol Tambahkan anggota.
Dialog Tambahkan anggota akan muncul.
Di kolom Anggota baru, masukkan
allUsers.Pada menu drop-down Pilih suatu peran, pilih sub-menu Cloud Storage, lalu klik opsi Storage Object Viewer.
Klik Simpan.
Setelah dipublikasikan, ikon link akan muncul untuk setiap objek di kolom akses publik. Anda dapat mengklik ikon ini untuk mendapatkan URL objek.
Untuk mempelajari cara mendapatkan informasi error mendetail tentang operasi Ruby yang gagal di konsol Google Cloud , lihat Pemecahan masalah.
gcloud
Gunakan perintah
gcloud storage buckets add-iam-policy-bindinguntuk membuat semua objek menjadi publik. Gunakan nilai untukMEDIA_BUCKET_SUFFIXyang Anda gunakan saat membuat bucket.gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \ --member=allUsers --role=roles/storage.objectViewer
Menyimpan nilai rahasia di Secret Manager
Setelah layanan pendukung dikonfigurasi, Rails memerlukan informasi yang aman, seperti sandi, untuk mengakses layanan ini. Alih-alih memasukkan nilai ini langsung ke dalam kode sumber Rails, tutorial ini menggunakan Kredensial Rails dan Secret Manager untuk menyimpan informasi ini secara aman.
Membuat file kredensial terenkripsi dan menyimpan kunci sebagai rahasia Secret Manager
Rails menyimpan secret dalam file terenkripsi yang disebut 'config/credentials.yml.enc'.
File dapat didekripsi dengan config/master.key lokal atau variabel
lingkungan ENV["RAILS_MASTER_KEY"]. Dalam file kredensial, Anda dapat menyimpan sandi database instance Cloud SQL dan kunci akses lainnya untuk API eksternal.
Anda dapat menyimpan kunci ini dengan aman di Secret Manager. Kemudian, Anda dapat memberikan akses Cloud Run dan Cloud Build ke kunci dengan memberikan akses ke akun layanan masing-masing. Akun layanan diidentifikasi dengan alamat email yang berisi nomor project.
Buat file
config/credentials.yml.encdengan perintah berikut:bin/rails credentials:editPerintah ini akan membuat
config/master.keyjika tidak ada kunci utama yang ditentukan, dan membuat fileconfig/credentials.yml.encjika file tidak ada. Tindakan ini akan membuka file sementara di$EDITORdefault Anda dengan konten yang didekripsi untuk ditambahkan ke secret.Salin dan tempel sandi database instance PostgreSQL yang baru dibuat dari file
dbpasswordke dalam file kredensial:secret_key_base: GENERATED_VALUE gcp: db_password: PASSWORDSecret dapat diakses dengan
Rails.application.credentials. Misalnya,Rails.application.credentials.secret_key_baseharus menampilkan dasar kunci rahasia aplikasi danRails.application.credentials.gcp[:db_password]harus menampilkan sandi database Anda.config/credentials/yml.encdisimpan terenkripsi, tetapiconfig/master.keydapat disimpan di Secret Manager.Konsol
Di konsol Google Cloud , buka halaman Secret Manager.
Klik Create secret.
Di kolom Name, masukkan nama untuk secret
RAILS_SECRET_NAME.Dalam dialog Secret value, tempel nilai mater.key ke dalam kotak.
Klik Create secret.
Di halaman Secret details secret Anda, catat nomor project:
projects/PROJECTNUM/secrets/RAILS_SECRET_NAME
Di tab Izin, klik Tambahkan Anggota
Di kolom New Members, masukkan
PROJECTNUM-compute@developer.gserviceaccount.com, lalu tekanEnter.Di kolom New Members, masukkan
PROJECTNUM@cloudbuild.gserviceaccount.com, lalu tekanEnter.Di menu drop-down Role, pilih Secret Manager Secret Accessor.
Klik Simpan.
gcloud
Buat secret baru dengan nilai config/master.key:
gcloud secrets create RAILS_SECRET_NAME --data-file config/master.keyGanti
RAILS_SECRET_NAMEdengan nama untuk secret baru.Untuk mengonfirmasi pembuatan secret, periksa secret:
gcloud secrets describe RAILS_SECRET_NAME gcloud secrets versions access latest --secret RAILS_SECRET_NAMEDapatkan nilai nomor project:
gcloud projects describe PROJECT_ID --format='value(projectNumber)'Berikan akses ke secret ke akun layanan Cloud Run:
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessorGanti
PROJECTNUMdengan nilai nomor project.Berikan akses ke secret untuk akun layanan Cloud Build:
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessorDi output, konfirmasi bahwa
bindingsmencantumkan dua akun layanan sebagai anggota.
Menghubungkan aplikasi Rails ke database dan penyimpanan produksi
Tutorial ini menggunakan instance PostgreSQL sebagai database produksi dan
Cloud Storage sebagai backend penyimpanan. Agar Rails dapat terhubung ke database dan bucket penyimpanan yang baru dibuat, Anda harus menentukan semua informasi yang diperlukan untuk mengaksesnya dalam file .env. File .env berisi
konfigurasi untuk variabel lingkungan aplikasi. Aplikasi akan membaca file ini menggunakan gem dotenv. Karena secret disimpan di
credentials.yml.enc dan Secret Manager, .env tidak
perlu dienkripsi karena tidak menyimpan kredensial sensitif.
- Untuk mengonfigurasi aplikasi Rails agar terhubung dengan database dan bucket penyimpanan, buka file
.env. Ubah konfigurasi file
.envmenjadi berikut. Gunakan nilaiMEDIA_BUCKET_SUFFIXyang Anda gunakan saat membuat bucket.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_SUFFIXAplikasi Rails kini disiapkan untuk menggunakan Cloud SQL dan Cloud Storage saat di-deploy ke Cloud Run.
Men-deploy aplikasi ke Cloud Run
Setelah layanan pendukung disiapkan, Anda kini dapat men-deploy aplikasi sebagai layanan Cloud Run.
Dengan menggunakan
cloudbuild.yamlyang disediakan, gunakan Cloud Build untuk membangun image, menjalankan migrasi database, dan mengisi aset statis:gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAMEGanti
SERVICE_NAMEdengan nama layanan Anda. Build pertama ini membutuhkan waktu beberapa menit hingga selesai. Jika build kehabisan waktu, tingkatkan durasi waktu tunggu dengan memasukkan --timeout=2000s ke dalam perintah build.Setelah build berhasil, deploy layanan Cloud Run untuk pertama kalinya, dengan menetapkan region layanan, image dasar, dan instance Cloud SQL yang terhubung:
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-unauthenticatedAnda akan melihat output yang menunjukkan bahwa deployment berhasil, dengan URL layanan.
Untuk melihat layanan yang di-deploy, buka URL layanan.
Jika URL layanan menampilkan Cat Photo Album, Anda berada di halaman beranda aplikasi. Coba upload foto baru. Jika foto berhasil diupload, berarti aplikasi Rails telah berhasil di-deploy.
Jika URL layanan menampilkan Cat Photo Album, Anda berada di halaman beranda aplikasi.
Mengupdate aplikasi
Meskipun langkah-langkah penyediaan dan deployment awal rumit, melakukan update adalah proses yang lebih sederhana:
Jalankan skrip build dan migrasi Cloud Build:
gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAMEDeploy layanan, dengan hanya menentukan region dan image:
gcloud run deploy SERVICE_NAME \ --region REGION \ --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME
Memahami kode
Aplikasi contoh Rails dibuat menggunakan perintah Rails standar. Perintah berikut membuat aplikasi cat_album dan menggunakan perintah scaffold untuk membuat model, pengontrol, dan tampilan untuk resource Foto:
rails new cat_album
rails generate scaffold Photo caption:text
Koneksi database
File config/database.yml berisi konfigurasi yang diperlukan untuk mengakses
database Anda di lingkungan yang berbeda (pengembangan, pengujian, produksi). Misalnya, database produksi dikonfigurasi untuk berjalan di Cloud SQL untuk PostgreSQL. Nama dan nama pengguna database ditetapkan melalui variabel
lingkungan dalam file .env, sedangkan sandi database disimpan di dalam
file config/credentials.yml.enc, yang memerlukan RAILS_MASTER_KEY untuk
mendekripsi.
Saat berjalan di Cloud Run (terkelola sepenuhnya), aplikasi terhubung ke instance PostgreSQL menggunakan soket yang disediakan oleh lingkungan Cloud Run. Saat aplikasi berjalan di mesin lokal, aplikasi terhubung ke instance PostgreSQL menggunakan proxy Auth Cloud SQL.
Media yang diupload pengguna dan disimpan di cloud
Rails menggunakan
Active Storage untuk
mengupload file ke penyedia penyimpanan. File config/storage.yml dan
config/environments/production.rb menentukan Cloud Storage sebagai
penyedia layanan di lingkungan produksi.
Otomatisasi dengan Cloud Build
File cloudbuild.yaml tidak hanya melakukan langkah-langkah build image yang umum (membuat image container dan mengirimkannya ke Artifact Registry), tetapi juga migrasi database Rails. Migrasi ini dilakukan menggunakan tugas Cloud Run, dengan perintah kustom sehingga container melakukan migrasi, bukan server web default.
Variabel penggantian digunakan dalam konfigurasi ini. Mengubah nilai dalam file secara langsung berarti tanda --substitutions dapat dihapus pada saat migrasi.
Dalam konfigurasi ini, hanya migrasi yang ada di direktori db/migrate yang diterapkan. Untuk membuat file migrasi, lihat
Active Record Migrations.
Untuk membangun image dan menerapkan migrasi, konfigurasi Cloud Build
memerlukan akses ke secret RAILS_MASTER_KEY dari Secret Manager. Kolom availableSecrets menetapkan versi secret dan variabel lingkungan yang akan digunakan untuk secret. Secret kunci utama diteruskan sebagai argumen dalam langkah image build, lalu ditetapkan sebagai RAILS_MASTER_KEY di Dockerfile saat membangun image.
Untuk memperluas konfigurasi Cloud Build agar mencakup deployment dalam satu konfigurasi tanpa harus menjalankan dua perintah, lihat Deployment berkelanjutan dari git menggunakan Cloud Build. Tindakan ini memerlukan perubahan IAM, seperti yang dijelaskan.
Pembersihan
- Di Konsol Google Cloud , buka halaman Manage resources.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.