Utilizzo di Cloud SQL per PostgreSQL con Rails 5

Inizia a sviluppare app Ruby su Rails eseguite nell'ambiente flessibile di App Engine. Le app che crei vengono eseguite sulla stessa infrastruttura alla base di tutti i prodotti Google, quindi puoi avere la certezza che possano scalare per offrire a tutti i tuoi utenti, pochi o milioni.

Questo tutorial presuppone che tu abbia familiarità con lo sviluppo web di Rails. Ti guiderà nella configurazione di Cloud SQL per PostgreSQL con una nuova app Rails. Puoi anche utilizzare questo tutorial come riferimento per configurare le app Rails esistenti per l'utilizzo di Cloud SQL per PostgreSQL.

Questo tutorial richiede Ruby 2.6 o 2.7.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Attiva Cloud SQL Admin API.

    Abilita l'API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  9. Attiva Cloud SQL Admin API.

    Abilita l'API

  10. Installa Google Cloud CLI.
  11. Per initialize gcloud CLI, esegui questo comando:

    gcloud init

Preparazione di un'istanza Cloud SQL per PostgreSQL

Configura un'istanza Cloud SQL per PostgreSQL per questo tutorial.

  1. Crea un'istanza PostgreSQL. In questo tutorial, il nome dell'istanza è rails-cloudsql-instance.

  2. Creare un database nell'istanza; In questo tutorial, il nome del database di produzione è cat_list_production.

  3. Imposta la password utente postgres per l'istanza.

Configurare l'ambiente locale per Rails

Per configurare l'ambiente locale per questo tutorial:

  1. Installa Ruby 2.6 o 2.7.

  2. Installa la gemma Rails 5.

  3. Installa la gemma Bundler.

Per ulteriori informazioni sull'installazione delle guide e sulle relative dipendenze, consulta la guida ufficiale Introduzione a Rails.

Dopo aver completato i prerequisiti, crea ed esegui il deployment di un'app Rails utilizzando Cloud SQL per PostgreSQL. Le sezioni seguenti illustrano la configurazione, la connessione a Cloud SQL per PostgreSQL e il deployment di un'app.

Crea una nuova app per elencare i gatti

  1. Esegui il comando rails new per creare una nuova app Rails. Questa app archivia un elenco di gatti in Cloud SQL per PostgreSQL.

    rails new cat_sample_app
    
  2. Vai alla directory che contiene l'app Rails generata.

    cd cat_sample_app
    

Esegui l'app localmente

Per eseguire la nuova app Rails sul tuo computer locale:

  1. Installare le dipendenze utilizzando Bundler.

    bundle install
    
  2. Avvia un server web locale:

    bundle exec bin/rails server
    
  3. In un browser, vai alla pagina http://localhost:3000/

Evviva! Sei su Rails! dall'app viene visualizzata sulla pagina.

Screenshot della nuova app Rails in esecuzione

Genera ponteggi per un elenco di gatti

Genera ponteggi per una risorsa di nome Cat che viene utilizzata per formare un elenco di gatti con il loro nome e la loro età.

  1. Genera il ponteggio.

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

    Il comando genera un modello, un controller e delle viste per la risorsa 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. Apri il file config/routes.rb per visualizzare i seguenti contenuti generati.

    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. Aggiungi root 'cats#index' al 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. Salva il file e chiudilo.

  5. Testa l'app Rails come istruzioni precedenti.

Utilizzo di Cloud SQL per PostgreSQL con App Engine

Cloud SQL per PostgreSQL è un servizio di database completamente gestito per configurare, gestire, gestire e amministrare i database relazionali PostgreSQL in Google Cloud. Puoi utilizzare Cloud SQL in un'app Rails come qualsiasi altro database relazionale.

Configurare Cloud SQL per PostgreSQL

Per iniziare a utilizzare Cloud SQL con la tua app Rails in produzione:

  1. Aggiungi le gemme pg e appengine al file Gemfile.

    bundle add pg
    bundle add appengine
    

    Il tipo Gemfile Rails contiene le seguenti voci gem aggiuntive:

    gem "appengine", "~> 0.6"
    gem "pg", "~> 1.2"
  2. Per configurare l'app Rails in modo che si connetta a Cloud SQL, apri il file config/database.yml. Vengono visualizzate le seguenti impostazioni di database boilerplate per 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. Configura il nome di connessione dell'istanza Cloud SQL per l'ambiente di produzione App Engine.

    1. Recupera il nome della connessione all'istanza.

      gcloud sql instances describe rails-cloudsql-instance
      
    2. Copia il valore accanto a connectionName.

  4. Modifica la configurazione del database di produzione database.yml come descritto di seguito:

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

    Dove:

    • [YOUR_POSTGRES_USERNAME] rappresenta il nome utente dell'istanza Cloud SQL per PostgreSQL.
    • [YOUR_POSTGRES_PASSWORD] rappresenta la password dell'istanza Cloud SQL per PostgreSQL.
    • [YOUR_INSTANCE_CONNECTION_NAME] rappresenta il nome della connessione all'istanza che hai copiato nel passaggio precedente.

L'app Rails è ora configurata per utilizzare Cloud SQL durante il deployment nell'ambiente flessibile di App Engine.

Distribuzione dell'applicazione nell'ambiente flessibile di App Engine

L'ambiente flessibile di App Engine utilizza un file denominato app.yaml per descrivere la configurazione del deployment di un'app. Se questo file non è presente, l'interfaccia a riga di comando gcloud tenta di indovinare la configurazione del deployment. Tuttavia, devi definire il file in modo da fornire le impostazioni di configurazione richieste per la chiave segreta di Rails e per Cloud SQL.

Per configurare l'app di esempio per il deployment in App Engine, crea un nuovo file denominato app.yaml nella directory principale dell'app Rails e aggiungi quanto segue:

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

Configura la chiave segreta di Rails nel file app.yaml

Quando viene eseguito il deployment di un'app Rails nell'ambiente production, imposta la variabile di ambiente SECRET_KEY_BASE con una chiave segreta per proteggere i dati delle sessioni utente. Questa variabile di ambiente è stata letta dal file config/secrets.yml nell'app Rails.

  1. Genera una nuova chiave segreta.

    bundle exec bin/rails secret
    
  2. Copia la chiave segreta generata.

  3. Apri il file app.yaml che hai creato in precedenza e aggiungi una sezione env_variables. env_variables definisce le variabili di ambiente nell'ambiente flessibile di App Engine. Il file app.yaml dovrebbe essere simile all'esempio seguente con [SECRET_KEY] sostituito con la chiave segreta.

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

Configura l'istanza Cloud SQL nel file app.yaml

Successivamente, configura l'ambiente flessibile di App Engine in modo da utilizzare un'istanza Cloud SQL specificata fornendo il nome della connessione all'istanza Cloud SQL nel file di configurazione app.yaml.

  1. Apri il file app.yaml e aggiungi una nuova sezione denominata beta_settings.

  2. Definisci un parametro nidificato cloud_sql_instances con il nome connessione istanza come valore.

    app.yaml dovrebbe avere il seguente aspetto:

    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]

Crea un'app per l'ambiente flessibile di App Engine

Se è la prima volta che esegui il deployment di un'app, devi creare un'app dell'ambiente flessibile di App Engine e selezionare l'area geografica in cui vuoi eseguire l'app Rails.

  1. Creare un'app App Engine.

    gcloud app create
    
  2. Seleziona una regione che supporti l'ambiente flessibile di App Engine per le app Ruby. Ulteriori informazioni su Aree geografiche e zone.

Eseguire il deployment di una nuova versione

Successivamente, esegui il comando per eseguire il deployment di una nuova versione dell'app Rails descritta nel file app.yaml senza reindirizzare il traffico dall'attuale versione predefinita per la pubblicazione:

gcloud app deploy --no-promote

Il completamento del deployment può richiedere diversi minuti. Attendi il messaggio di operazione riuscita. Puoi visualizzare le versioni di cui è stato eseguito il deployment nell'elenco delle versioni di App Engine.

Dopo aver eseguito il deployment della nuova versione, se tenti di accedere a questa nuova versione, viene visualizzato il seguente messaggio di errore perché non hai eseguito la migrazione del database.

Screenshot del nuovo messaggio di errore dell'app Rails

Concedi l'autorizzazione richiesta per la gemma appengine

Quindi, concedi l'accesso all'account di servizio Cloud Build per eseguire migrazioni di database di produzione con la gemma appengine.

  1. Elenca i progetti disponibili.

    gcloud projects list
    
  2. Nell'output, individua il progetto da utilizzare per eseguire il deployment dell'app e copia il numero di progetto.

  3. Aggiungi un nuovo membro al criterio IAM del progetto per il ruolo roles/editor per eseguire le migrazioni dei database. Sostituisci [YOUR-PROJECT-ID] con l'ID del tuo progetto Google Cloud e [PROJECT_NUMBER] con il numero del progetto che hai copiato nel passaggio precedente.

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

Eseguire la migrazione del database Rails

Le migrazioni dei database di Rails vengono utilizzate per aggiornare lo schema del database senza utilizzare direttamente la sintassi SQL. Ora esegui la migrazione del tuo database cat_list_production.

La gemma appengine fornisce l'attività Rake appengine:exec per eseguire un comando sulla versione di App di cui è stato eseguito il deployment più recente nell'ambiente flessibile di App Engine.

  1. Esegui la migrazione del database Cloud SQL per PostgreSQL cat_list_production in produzione.

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

    Dovresti visualizzare un output simile al seguente:

    ---------- 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. Per verificare la migrazione del database, inserisci il seguente URL nel browser:

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

    Sostituisci quanto segue:

    • VERSION_ID: la nuova versione dell'app di cui hai eseguito il deployment in precedenza. Per ottenere un elenco delle versioni, utilizza gcloud app versions list. L'ultimo elemento della versione di servizio predefinita è l'ultimo deployment.
    • PROJECT_ID: l'ID del tuo progetto Google Cloud
    • REGION_ID: un codice assegnato da App Engine alla tua app.

Per il deployment senza problemi viene visualizzato quanto segue:

Screenshot della nuova app Rails in esecuzione

Esegui la migrazione del traffico a una nuova versione

Infine, indirizza il traffico alla versione di cui hai appena eseguito il deployment utilizzando il comando seguente:

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

La nuova versione dell'app è ora accessibile dal seguente URL:

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

Lettura dei log di App Engine

Ora che hai eseguito il deployment dell'app Rails, puoi leggere i log. Puoi leggere i log dell'applicazione utilizzando Esplora log disponibile in Google Cloud Console.

Scopri di più sulla lettura dei log utilizzando l'interfaccia a riga di comando gcloud.

Esegui la pulizia delle risorse

Una volta completato il tutorial, puoi eseguire la pulizia delle risorse che hai creato in modo che interrompano l'utilizzo della quota e che vengano addebitati dei costi. Le sezioni seguenti descrivono come eliminare o disattivare queste risorse.

Elimina progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina una versione di App Engine

Per eliminare una versione dell'applicazione:

  1. Nella console Google Cloud, vai alla pagina Versioni di App Engine.

    Vai a Versioni

  2. Seleziona la casella di controllo relativa alla versione non predefinita dell'app che vuoi eliminare.
  3. Per eliminare la versione dell'app, fai clic su Elimina.

Elimina un'istanza Cloud SQL

Per eliminare un'istanza Cloud SQL:

  1. Nella console Google Cloud, vai alla pagina Istanze.

    Vai a Istanze

  2. Fai clic sul nome l'istanza SQL che vuoi eliminare.
  3. Per eliminare l'istanza, fai clic su Elimina, quindi segui le istruzioni.

Passaggi successivi