Scopri come eseguire il deployment di un'applicazione Rails di esempio in Cloud Run e come integrare database gestiti, archiviazione di oggetti, secret criptati e creare pipeline con il serverless computing.
Il deployment di applicazioni Rails comporta l'integrazione di più servizi insieme per formare un progetto coeso. Questo tutorial presuppone che tu abbia familiarità con lo sviluppo web di Rails.
Questo tutorial richiede Ruby 3.0 o versioni successive (è supportato anche Ruby 2.7, consulta la sezione Comprendere il codice) e Rails 6 o versioni successive.
Obiettivi
- Creare e connettere un database Cloud SQL ad Active Record
- Creare e utilizzare Secret Manager per archiviare e accedere in modo sicuro a una chiave master Rails
- Ospitare file multimediali e file caricati dagli utenti su Cloud Storage da Active Storage
- Usa Cloud Build per automatizzare le migrazioni di build e database
- Esegui il deployment di un'app Rails in Cloud Run
Costi
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Assicurati di disporre di autorizzazioni sufficienti per l'account utilizzato per questo tutorial.
Preparazione dell'ambiente
Imposta il progetto predefinito
Imposta la configurazione predefinita del progetto per l'interfaccia a riga di comando gcloud eseguendo il comando seguente:
gcloud config set project PROJECT_ID
Sostituisci PROJECT_ID
con l'ID progetto Google Cloud che hai appena creato
Clonazione dell'app Rails
Il codice per l'app di esempio Rails si trova nel repository GoogleCloudPlatform/ruby-docs-samples
su GitHub.
Clona il repository:
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
Vai alla directory che contiene il codice di esempio ed esegui questi comandi per assicurarti che l'applicazione sia configurata correttamente con le gemme e le dipendenze necessarie:
Linux/macOS
cd ruby-docs-samples/run/rails bundle install
Windows
cd ruby-docs-samples\run\rails bundle install
Preparazione dei servizi di supporto
Questo tutorial utilizza diversi servizi Google Cloud per fornire il database, l'archiviazione multimediale e l'archiviazione segreta che supportano il progetto Rails di cui è stato eseguito il deployment. Il deployment di questi servizi è previsto in un'area geografica specifica. Per aumentare l'efficienza tra i servizi, è preferibile eseguire il deployment di tutti i servizi nella stessa area geografica. Per ulteriori informazioni sull'area geografica più vicina a te, consulta Prodotti disponibili per area geografica.
Configura un'istanza Cloud SQL per PostgreSQL
Rails supporta più database relazionali, inclusi diversi offerti da Cloud SQL. Questo tutorial utilizza PostgreSQL, un database open source comunemente utilizzato dalle app Rails.
Le seguenti sezioni descrivono la creazione di un'istanza, un database e un utente di database PostgreSQL per la tua app Rails.
Crea un'istanza PostgreSQL
Console
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
Fai clic su Crea istanza.
Fai clic su Scegli PostgreSQL.
Nel campo ID istanza, inserisci un nome per l'istanza (
INSTANCE_NAME
).Nel campo Password, inserisci una password per l'utente postgres.
Utilizza i valori predefiniti per gli altri campi.
Fai clic su Crea istanza.
gcloud
Crea l'istanza PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --database-version POSTGRES_12 \ --tier db-f1-micro \ --region REGION
Sostituisci quanto segue:
INSTANCE_NAME
: il nome della tua nuova istanza Cloud SQLREGION
: l'area geografica Google Cloud
La creazione dell'istanza richiede poco tempo per la preparazione e l'uso.
Crea un database
Console
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
Seleziona l'istanza INSTANCE_NAME.
Vai alla scheda Database.
Fai clic su Crea database.
Nella finestra di dialogo Nome database, inserisci
DATABASE_NAME
.Fai clic su Crea.
gcloud
Crea il database all'interno dell'istanza creata di recente:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAME
Sostituisci
DATABASE_NAME
con un nome del database all'interno dell'istanza.
Crea un utente
Genera una password casuale per l'utente del database e scrivila in un file denominato dbpassword
:
cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword
Console
In Google Cloud Console, vai alla pagina Istanze Cloud SQL.
Seleziona l'istanza INSTANCE_NAME.
Vai alla scheda Utenti.
Fai clic su Aggiungi account utente.
Nella finestra di dialogo Autenticazione integrata:
- Inserisci il nome utente
DATABASE_USERNAME
. - Inserisci i contenuti del file
dbpassword
come passwordPASSWORD
.
- Inserisci il nome utente
Fai clic su Aggiungi.
gcloud
Crea l'utente all'interno dell'istanza creata di recente e imposta la relativa password come contenuto di dbpassword:
gcloud sql users create DATABASE_USERNAME \ --instance=INSTANCE_NAME --password=$(cat dbpassword)
Sostituisci
DATABASE_USERNAME
con un nome per l'utente all'interno dell'istanza.
Configurare un bucket Cloud Storage
Con Cloud Storage puoi ospitare asset statici e multimediali caricati dagli utenti e archiviati in oggetti ad alta disponibilità.
Console
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
- For Location, select the following: us-central1
- For Choose a default storage class for your data, select the following: Standard.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
gcloud
Lo strumento a riga di comando gsutil
è stato installato durante l'installazione dell'interfaccia a riga di comando gcloud.
Creare un bucket Cloud Storage. Per creare un nome univoco per il bucket Cloud Storage, utilizza PROJECT_ID e un suffisso a tua scelta,
MEDIA_BUCKET_SUFFIX
. In Cloud Storage, i nomi dei bucket devono essere univoci a livello globale.gsutil mb -l REGION gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
Dopo aver creato un bucket, per rendere pubbliche le immagini caricate, modifica le autorizzazioni degli oggetti immagine in modo che siano leggibili da tutti.
Console
- In Google Cloud Console, vai alla pagina Bucket di Cloud Storage.
Nell'elenco dei bucket, fai clic sul nome del bucket che vuoi rendere pubblico.
Seleziona la scheda Autorizzazioni nella parte superiore della pagina.
Fai clic sul pulsante Aggiungi membri.
Viene visualizzata la finestra di dialogo Aggiungi membri.
Nel campo Nuovi membri, inserisci
allUsers
.Nel menu a discesa Seleziona un ruolo, seleziona il sottomenu Cloud Storage e fai clic sull'opzione Visualizzatore oggetti Storage.
Fai clic su Salva.
Dopo la condivisione pubblica, per ogni oggetto nella colonna accesso pubblico è visualizzata un'icona link. Puoi fare clic su questa icona per recuperare l'URL dell'oggetto.
Per scoprire come ottenere informazioni dettagliate sugli errori sulle operazioni Ruby non riuscite in Google Cloud Console, consulta la sezione Risoluzione dei problemi.
gcloud
Utilizza il comando
gsutil iam ch
per rendere pubblici tutti gli oggetti. Utilizza il valore diMEDIA_BUCKET_SUFFIX
che hai utilizzato durante la creazione del bucket.gsutil iam ch allUsers:objectViewer gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
Archivia valori segreti in Secret Manager
Ora che i servizi di supporto sono configurati, Rails richiede informazioni sicure, come le password, per accedere a questi servizi. Anziché inserire questi valori direttamente nel codice sorgente di Rails, questo tutorial utilizza Credenziali per le linee guida e Secret Manager per archiviare queste informazioni in modo sicuro.
Crea file di credenziali criptate e chiave di archiviazione come secret di Secret Manager
Rails memorizza i secret in un file criptato chiamato 'config/credentials.yml.enc'.
Il file può essere decriptato con il config/master.key
locale o la variabile di ambiente ENV[“RAILS_MASTER_KEY”]
. Nel file delle credenziali, puoi archiviare la password del database delle istanze Cloud SQL e altre chiavi di accesso per le API esterne.
Puoi archiviare questa chiave in modo sicuro in Secret Manager. Quindi, puoi concedere a Cloud Run e Cloud Build l'accesso alla chiave concedendo l'accesso ai rispettivi account di servizio. Gli account di servizio sono identificati da un indirizzo email che contiene il numero di progetto.
Genera il file
config/credentials.yml.enc
con il seguente comando:bin/rails credentials:edit
Se la file principale non è definita, il comando creerà un file
config/master.key
e, se il file non esiste, verrà creato un fileconfig/credentials.yml.enc
. Nel file$EDITOR
si aprirà un file temporaneo con i contenuti decriptati da aggiungere ai secret.Copia e incolla la password del database dell'istanza PostgreSQL appena creata dal file
dbpassword
nel file delle credenziali:secret_key_base: GENERATED_VALUE gcp: db_password: PASSWORD
È possibile accedere ai secret con
Rails.application.credentials
. Ad esempio,Rails.application.credentials.secret_key_base
dovrebbe restituire la base della chiave segreta dell'applicazione eRails.application.credentials.gcp[:db_passsword]
dovrebbe restituire la password del tuo database.Le chiavi
config/credentials/yml.enc
sono archiviate in forma criptata, maconfig/master.key
possono essere archiviate in Secret Manager.Console
In Google Cloud Console, vai alla pagina di Secret Manager.
Fai clic su Crea secret.
Nel campo Nome, inserisci un nome per il secret
RAILS_SECRET_NAME
.Nella finestra di dialogo Valore secret, incolla il valore mater.key nella casella.
Fai clic su Crea secret.
Nella pagina dei dettagli del secret, prendi nota del numero del progetto:
projects/PROJECTNUM/secrets/RAILS_SECRET_NAME
Nella scheda Autorizzazioni, fai clic su Aggiungi membro
Nel campo Nuovi membri, inserisci
PROJECTNUM-compute@developer.gserviceaccount.com
, quindi premiEnter
.Nel campo Nuovi membri, inserisci
PROJECTNUM@cloudbuild.gserviceaccount.com
, quindi premiEnter
.Nel menu a discesa Ruolo, seleziona Secret Manager Secret Manager.
Fai clic su Salva.
gcloud
Crea un nuovo secret con il valore di config/master.key:
gcloud secrets create RAILS_SECRET_NAME --data-file config/master.key
Sostituisci
RAILS_SECRET_NAME
con un nome per il nuovo secret.Per confermare la creazione del secret, controlla che:
gcloud secrets describe RAILS_SECRET_NAME gcloud secrets versions access latest --secret RAILS_SECRET_NAME
Recupera il valore del numero del progetto:
gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Concedi l'accesso al secret all'account di servizio Cloud Run:
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Sostituisci
PROJECTNUM
con il valore del numero di progetto riportato sopra.Concedi l'accesso al secret all'account di servizio Cloud Build:
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Nell'output, conferma che
bindings
elenca i due account di servizio come membri.
Collega l'app Rails al database e all'archiviazione di produzione
Questo tutorial utilizza un'istanza PostgreSQL come database di produzione e Cloud Storage come backend di archiviazione. Affinché Rails si connetta al database e al bucket di archiviazione appena creati, devi specificare tutte le informazioni necessarie per accedervi nel file .env
. Il file .env
contiene la configurazione per le variabili di ambiente dell'applicazione. L'applicazione leggerà questo file utilizzando la gem dotenv. Poiché i secret sono archiviati in
credentials.yml.enc
e Secret Manager, .env
non
deve essere criptato perché non contiene credenziali sensibili.
- Per configurare l'app Rails in modo che si connetta al database e al bucket di archiviazione, apri il file
.env
. Modifica la configurazione del file
.env
come segue. Utilizza il valore diMEDIA_BUCKET_SUFFIX
che hai utilizzato durante la creazione del 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_SUFFIX
L'app Rails è ora configurata per utilizzare Cloud SQL e Cloud Storage durante il deployment in Cloud Run.
Concedi a Cloud SQL l'accesso a Cloud SQL
Affinché Cloud Build applichi le migrazioni del database, devi concedere le autorizzazioni per accedere a Cloud SQL a Cloud Build.
Console
In Google Cloud Console, vai alla pagina Identity and Access Management.
Per modificare la voce di un membro di
PROJECTNUM@cloudbuild.gserviceaccount.com
, fai clic su Modifica membro.Fai clic su Aggiungi un altro ruolo.
Nella finestra di dialogo Seleziona un ruolo, seleziona Client Cloud SQL.
Fai clic su Salva
gcloud
Concedi a Cloud Build l'autorizzazione per accedere a Cloud SQL:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/cloudsql.client
Deployment dell'app in Cloud Run
Dopo aver configurato i servizi di supporto, puoi eseguire il deployment dell'app come servizio Cloud Run.
Utilizzando il modello
cloudbuild.yaml
fornito, usa Cloud Build per creare l'immagine, eseguire le migrazioni dei database e completare gli asset statici:gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
Sostituisci
SERVICE_NAME
con il nome del tuo servizio. Il completamento di questa prima build richiede alcuni minuti. Se la build è scaduta, aumenta la durata del timeout inserendo --timeout=2000s nel comando di build riportato sopra.Quando la build ha esito positivo, esegui il deployment del servizio Cloud Run per la prima volta, impostando la regione, l'immagine di base e l'istanza Cloud SQL connessa del servizio:
gcloud run deploy SERVICE_NAME \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/SERVICE_NAME \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticated
Dovresti vedere l'output che mostra il deployment riuscito, con un URL di servizio:
Service [SERVICE_NAME] revision [SERVICE_NAME-00001-tug] has been deployed and is serving 100 percent of traffic at https://SERVICE_NAME-
HASH
-uc.a.run.appPer visualizzare il servizio di cui hai eseguito il deployment, vai all'URL del servizio.
Prova a caricare una nuova foto. Se la foto viene caricata correttamente, il deployment dell'applicazione Rails è stato eseguito correttamente.
Aggiornamento dell'applicazione in corso...
Sebbene i passaggi iniziali di provisioning e deployment fossero complessi, apportare aggiornamenti è un processo più semplice:
Esegui lo script di creazione e migrazione di Cloud Build:
gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAME
Esegui il deployment del servizio, specificando solo l'area geografica e l'immagine:
gcloud run deploy SERVICE_NAME \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/SERVICE_NAME
Nozioni di base sul codice
L'app di esempio Rails è stata creata usando i comandi standard di Rails. I seguenti comandi creano l'app cat_album e utilizzano il comando scaffold per generare un modello, un controller e le visualizzazioni per la risorsa foto:
rails new cat_album
rails generate scaffold Photo caption:text
Connessione al database
Il file config/database.yml
contiene la configurazione necessaria per accedere ai tuoi database in diversi ambienti (sviluppo, test, produzione). Ad esempio, il database di produzione è configurato per l'esecuzione in Cloud SQL per PostgreSQL. Il nome e il nome utente del database vengono impostati tramite le variabili di ambiente nel file .env
, mentre la password del database viene archiviata nel file config/credentials.yml.enc
, che richiede la decriptazione di RAILS_MASTER_KEY
.
Quando l'app viene eseguita su Cloud Run (completamente gestito), si connette all'istanza PostgreSQL utilizzando un socket fornito dall'ambiente Cloud Run. Quando l'app è in esecuzione sulla tua macchina locale, si connette all'istanza PostgreSQL utilizzando il proxy di autenticazione Cloud SQL.
Elemento multimediale caricato da un utente archiviato nel cloud
Rails utilizza
Active Storage per
caricare file nei provider di spazio di archiviazione sul cloud. I file config/storage.yml
e
config/environments/production.rb
specificano Cloud Storage come
fornitore di servizi nell'ambiente di produzione.
Automazione con Cloud Build
Il file cloudbuild.yaml esegue non solo i normali passaggi di creazione di un'immagine (creando l'immagine container ed eseguendo il push in Container Registry), ma anche le migrazioni dei database di Rails. Questi richiedono l'accesso al database, che viene eseguito tramite il provider app-engine-exec-wrapper, che è utile per il proxy di autenticazione Cloud SQL.
In questa configurazione vengono utilizzate le variabili di sostituzione. Se modifichi direttamente i valori nel file, il flag --substitutions
potrà essere eliminato al momento della migrazione.
In questa configurazione, vengono applicate solo le migrazioni esistenti nella directory db/migrate
. Per creare i file di migrazione, consulta
Migrazione delle registrazioni attive.
Per creare l'immagine e applicare migrazioni, la configurazione di Cloud Build deve accedere al secret RAILS_MASTER_KEY
da Secret Manager. Il campo availableSecrets
imposta la versione e le variabili di ambiente da utilizzare per il secret. Il secret della chiave master viene passato come argomento nel passaggio dell'immagine build e viene impostato come RAILS_MASTER_KEY
nel Dockerfile durante la creazione dell'immagine.
Per estendere la configurazione di Cloud Build in modo da includere il deployment in un'unica configurazione senza dover eseguire due comandi, consulta la pagina relativa al deployment continuo da git utilizzando Cloud Build. Questo richiede modifiche IAM, come descritto.
Supporto per Ruby 2.7
Anche se questo tutorial utilizza Ruby 3.0, può supportare anche Ruby 2.7. Per utilizzare Ruby 2.7, modifica l'immagine di base Ruby nel Dockerfile in 2.7
Esegui la pulizia
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.