Cómo usar Cloud SQL para MySQL con Rails 5

Comienza a desarrollar apps de Ruby on Rails que se ejecuten en el entorno flexible de App Engine. Las apps que crees se ejecutarán en la misma infraestructura que impulsa todos los productos de Google, ten la confianza de que escalarán para atender a todos tus usuarios, sin importar si son unos pocos o millones.

Para este instructivo, suponemos que conoces el desarrollo web con Rails. Te guía a través de la configuración de Cloud SQL para MySQL con una nueva app de Rails. También puedes usar este instructivo como referencia para configurar apps de Rails existentes a fin de usar Cloud SQL para MySQL.

Para este instructivo debes tener Ruby 2.3.4 o una versión más reciente.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita Cloud SQL Admin API.

    Habilita la API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  8. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  9. Habilita Cloud SQL Admin API.

    Habilita la API

  10. Instala Google Cloud CLI.
  11. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init

Prepara Cloud SQL para una instancia de MySQL

Si deseas configurar Cloud SQL para una instancia de MySQL en este instructivo, sigue estos pasos:

  1. Crea una instancia de segunda generación. En este instructivo, el nombre de la instancia es rails-cloudsql-instance.

  2. Crea una base de datos en la instancia. En este instructivo, el nombre de la base de datos de producción es cat_list_production.

  3. Configura una contraseña de usuario raíz para la instancia.

Configura el entorno local para Rails

Para configurar el entorno local en este instructivo, sigue estos pasos:

  1. Instala la versión 2.3.4 o posterior de Ruby.

  2. Instala la gema de Rails 5.

  3. Instala la gema de Bundler.

Para obtener información adicional sobre la instalación de Rails y sus dependencias, consulta la guía oficial Comenzar a usar Rails.

Después de completar los requisitos, puedes crear e implementar una app de Rails con Cloud SQL para MySQL. En las siguientes secciones, se te guiará en la configuración, la conexión a Cloud SQL para MySQL y la implementación de una app.

Crea una app nueva que muestre una lista de gatos

  1. Ejecuta el comando rails new si deseas crear una nueva app de Rails. Esta aplicación almacena una lista de gatos en Cloud SQL para MySQL.

    rails new cat_sample_app
    
  2. Ve al directorio que contiene la app de Rails que se generó.

    cd cat_sample_app
    

Ejecución de la aplicación de manera local

Para ejecutar la aplicación de Rails nueva en tu computadora local:

  1. Instala las dependencias con Bundler:

    bundle install
    
  2. Inicia un servidor web local:

    bundle exec bin/rails server
    
  3. En un navegador web, ve a http://localhost:3000.

El mensaje: ¡Bien, ya estás en Rails! de la app se muestra en la página.

Captura de pantalla de la app de Rails nueva en ejecución

Genera un andamiaje para una lista de gatos

Genere una estructura para un recurso llamado Cat que se usa para formar una lista de gatos con sus nombres y edades.

  1. Genera el andamiaje.

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

    El comando genera un modelo, un controlador y vistas para el recurso 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. Abre el archivo config/routes.rb para ver el siguiente contenido generado.

    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. Agrega root 'cats#index' al archivo.

    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. Guarda el archivo y ciérralo.

  5. Prueba la app de Rails como se indicó antes.

Uso de Cloud SQL para MySQL con App Engine

Cloud SQL para MySQL es un servicio de base de datos completamente administrado para configurar, mantener, controlar y administrar tus bases de datos relacionales MySQL en Google Cloud. Puedes usar Cloud SQL en una app de Rails como cualquier otra base de datos relacional.

Configuración de Cloud SQL para MySQL

Siga estos pasos para comenzar a usar Cloud SQL con su aplicación de Rails en producción:

  1. Agrega las gemas mysql2 y appengine al archivo Gemfile.

    bundle add mysql2
    bundle add appengine
    

    Gemfile de Rails contiene las siguientes entradas gem adicionales:

    # 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. A fin de configurar la app de Rails para que se conecte a Cloud SQL, abre el archivo config/database.yml. Se muestran las siguientes configuraciones de base de datos estándar para 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 el nombre de conexión de la instancia de Cloud SQL para el entorno de producción de App Engine.

    1. Recupera el nombre de conexión de la instancia.

      gcloud sql instances describe rails-cloudsql-instance
      
    2. Copia el valor junto a connectionName.

  4. Modifica la configuración de la base de datos de producción database.yml de la siguiente manera:

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

    Donde:

    • [YOUR_MYSQL_USERNAME] representa tu nombre de usuario de MySQL.
    • [YOUR_MYSQL_PASSWORD] representa tu contraseña de MySQL.
    • [YOUR_INSTANCE_CONNECTION_NAME] representa el nombre de conexión de la instancia que copiaste en el paso anterior.

Ahora, la app de Rails está configurada para usar Cloud SQL cuando se implemente en el entorno flexible de App Engine.

Cómo implementar la app en el entorno flexible de App Engine

El entorno flexible de App Engine usa un archivo llamado app.yaml para describir la configuración de implementación de una app. Si este archivo no está presente, la CLI de gcloud intenta adivinar la configuración de implementación. Sin embargo, debes definir el archivo a fin de proporcionar la configuración necesaria para la clave secreta de Rails y Cloud SQL.

A fin de configurar la app de muestra para tu implementación en App Engine, crea un archivo nuevo llamado app.yaml en la raíz del directorio de la aplicación de Rails y agrega lo siguiente:

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

Configura la clave secreta de Rails en el archivo app.yaml

Cuando se implemente una app de Rails en el entorno production, configura la variable de entorno SECRET_KEY_BASE con una clave secreta para proteger los datos de sesión del usuario. Esta variable de entorno se lee desde el archivo config/secrets.yml de tu app de Rails.

  1. Genera una clave secreta nueva.

    bundle exec bin/rails secret
    
  2. Copia la clave secreta generada.

  3. Abre el archivo app.yaml que creaste antes y agrega una sección env_variables. El env_variables define variables de entorno en el entorno flexible de App Engine. El archivo app.yaml debería ser similar al siguiente ejemplo, en el que [SECRET_KEY] se reemplaza por tu clave secreta.

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

Configura la instancia de Cloud SQL en el archivo app.yaml

A continuación, configura el entorno flexible de App Engine para usar una instancia de Cloud SQL especificada. Para ello, proporciona el nombre de conexión de la instancia de Cloud SQL en el archivo de configuración app.yaml.

  1. Abre el archivo app.yaml y agrega una nueva sección llamada beta_settings.

  2. Define un parámetro anidado cloud_sql_instances con el nombre de conexión de la instancia como el valor.

    El app.yaml debería ser similar al siguiente:

    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]

Creación de una app en el entorno flexible de App Engine

Si es la primera vez que implementas una app, debes crear una app del entorno flexible de App Engine y seleccionar la región en la que deseas ejecutar la app de Rails.

  1. Crea una aplicación de App Engine.

    gcloud app create
    
  2. Selecciona una región compatible con el entorno flexible de App Engine para apps de Ruby. Obtén más información sobre las regiones y zonas.

Implementación de una versión nueva

A continuación, implementa una versión nueva de la app de Rails descrita en app.yaml sin redireccionar el tráfico desde la versión predeterminada actualmente en uso.

  1. Compila los elementos de Rails de forma previa.

    bundle exec bin/rails assets:precompile
    
  2. Una vez que los recursos terminen de compilarse, implementa una versión nueva de la app.

    gcloud app deploy --no-promote
    

    La implementación puede tardar varios minutos en completarse. Espera a ver un mensaje correcto. Puedes ver las versiones implementadas en la lista de versiones de App Engine.

Después de implementar la versión nueva, si intentas acceder a esta, aparecerá el siguiente mensaje de error porque no migraste la base de datos.

Captura de pantalla de un mensaje de error de la app de Rails nueva

Otorgamiento del permiso necesario a la gema appengine

Luego, otorga acceso a la cuenta de servicio de CloudBuild para ejecutar migraciones de bases de datos de producción con la gema appengine.

  1. Enumera los proyectos disponibles.

    gcloud projects list
    
  2. En el resultado, busca el proyecto que deseas usar para implementar tu app y copia el número del proyecto.

  3. Agrega un miembro nuevo a la política de IAM de tu proyecto para que la función roles/editor ejecute migraciones de bases de datos. Reemplaza [YOUR-PROJECT-ID] por tu ID del proyecto de Google Cloud y reemplaza [PROJECT_NUMBER] por el número del proyecto que copiaste en el paso anterior.

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

Migre su base de datos de Rails

Las migraciones de bases de datos de Rails se usan para actualizar el esquema de tu base de datos sin usar la sintaxis de SQL directamente. A continuación, debes migrar tu base de datos de cat_list_production.

La gema appengine proporciona la tarea Rake appengine:exec para ejecutar un comando en la versión de tu app implementada más reciente en el entorno flexible de App Engine de producción.

  1. Migra la base de datos cat_list_production de Cloud SQL para MySQL en producción

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

    Deberías ver un resultado similar a este:

    ---------- 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. Para verificar la migración de la base de datos, ve al siguiente vínculo:

    [YOUR-VERSION]-dot-[YOUR-PROJECT-ID].appspot.com
    

Se muestra lo siguiente en caso de una implementación exitosa:

Captura de pantalla de la app de Rails nueva en ejecución

Migración del tráfico a la versión nueva

Por último, dirige el tráfico a la versión recién implementada con el siguiente comando:

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

Ahora, se puede acceder a la nueva versión de la aplicación desde:

https://[YOUR-PROJECT-ID].appspot.com

Lee registros de App Engine

Ahora que implementaste tu app de Rails, te recomendamos leer los registros. Puedes leer los registros de la app con el Explorador de registros ubicado en Google Cloud Console.

Obtén más información sobre cómo leer registros con la CLI de gcloud.

Limpia los recursos

Una vez que termines el instructivo, puedes limpiar los recursos que creaste para que dejen de usar la cuota y generar cargos. En las siguientes secciones, se describe cómo borrar o desactivar estos recursos.

Borrar proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haga lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra una versión de App Engine

Para borrar la versión de una aplicación, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Versiones de App Engine.

    Ir a Versiones

  2. Selecciona la casilla de verificación de la versión no predeterminada de la app que deseas borrar.
  3. Para borrar la versión de la app, haz clic en Borrar.

Borra una instancia de Cloud SQL

Para borrar una instancia de Cloud SQL, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Instancias.

    Ir a Instancias

  2. Haz clic en el nombre es la instancia de SQL que deseas borrar.
  3. Para borrar la instancia, haz clic en Borrar y sigue las instrucciones.

¿Qué sigue?