Cómo usar Cloud SQL para MySQL con Rails 5

Comenzar a desarrollar apps de Ruby en Rails que se ejecuten en el entorno flexible de Google App Engine es fácil. Dado que 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.

En este instructivo se da por hecho que tienes conocimientos de desarrollo web con Rails. Te guiaremos a través de la configuración de Google Cloud SQL para MySQL con una aplicación nueva de Rails. Este instructivo también se puede usar como referencia para configurar aplicaciones existentes de Rails 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

Marca cada paso que completes.

  1. check_box_outline_blank check_box Crea un proyecto en Google Cloud Platform Console.
    Si aún no creaste un proyecto, hazlo ahora. Los proyectos te permiten administrar todos los recursos de Google Cloud Platform de tu aplicación, incluida la implementación, el control de acceso, la facturación y los servicios.
    1. Abre GCP Console.
    2. En el menú desplegable de la parte superior, selecciona Crear un proyecto.
    3. Haz clic en Mostrar opciones avanzadas. En Ubicación de App Engine, selecciona una ubicación en Estados Unidos.
    4. Asigna un nombre a tu proyecto.
    5. Toma nota del ID de proyecto, que podría ser distinto del nombre del proyecto. El ID del proyecto se usa en comandos y configuraciones.
  2. check_box_outline_blank check_box Habilita la facturación de tu proyecto dey regístrate para realizar una prueba gratuita de.

    Si aún no habilitaste la facturación para tu proyecto, habilita la facturación ahoray regístrate para una prueba gratuita. Habilitar la facturación permite que la aplicación consuma recursos facturables, como la ejecución de instancias y el almacenamiento de datos. Durante el período de prueba gratuita, no se te cobrará ningún servicio.

  3. check_box_outline_blank check_box Instala el SDK de Cloud.

    Si aún no lo has hecho, instala y, luego, inicializa el SDK de Cloud ahora. El SDK de Cloud contiene herramientas y bibliotecas que te permiten crear y administrar recursos en GCP.

  4. check_box_outline_blank check_box Habilita las API para tu proyecto.

    Esto te llevará a GCP Console y habilitará automáticamente las API que usa este instructivo. Las API que se usan son: Cloud SQL Administration.

Preparación de una instancia de Cloud SQL para MySQL

Configura una instancia de Cloud SQL para MySQL para este instructivo.

  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.

Configuración de tu entorno local para Rails

Configura tu entorno local para este instructivo:

  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 con Rails.

Una vez completados los requisitos, puedes crear e implementar una app de Rails con Cloud SQL para MySQL. Las secciones siguientes te guiarán a través de la configuración, la conexión a Cloud SQL para MySQL, la ejecución y la implementación de una aplicación.

Creación de una app nueva que muestre una lista de gatos

En primer lugar, ejecuta el comando rails new para crear una aplicación de Rails nueva. El objetivo es almacenar una lista de gatos en Cloud SQL para MySQL:

rails new cat_sample_app

Ve al directorio que contiene la aplicación 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 el navegador web, ve a http://localhost:3000/.

Aparecerá una imagen con el mensaje "Yay! You’re on Rails!" de la app en la página.

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

Genera un andamiaje para una lista de gatos

Genera un andamiaje para un recurso llamado Cat que se usará para crear una lista de gatos con su nombre y su edad. Usa el siguiente comando para generar 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

Luego, 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

Agrega root 'cats#index' para modificar este 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

Guarda el archivo y ciérralo. 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 que facilita la configuración, el mantenimiento y la administración de tus bases de datos de MySQL relacionales en la nube. Significa que puedes usar Cloud SQL en una app de Rails como cualquier otra base de datos relacional.

Configuración de Cloud SQL para MySQL

Agrega las gemas mysql2 y appengine al archivo Gemfile a fin de comenzar a usar Cloud SQL con tu app de Rails en la producción. Para ello, ejecuta los comandos siguientes:

bundle add mysql2
bundle add appengine

El Gemfile de Rails contendrá las siguientes entradas de 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"

Luego, configura la app de Rails para que se conecte con CloudSQL.

Abre el archivo config/database.yml; deberías ver la siguiente configuración 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

Antes de modificar el archivo database.yml, debes configurar el nombre de conexión de la instancia de Cloud SQL para el entorno de producción de App Engine.

Para recuperar el nombre de conexión de la instancia, ejecuta lo siguiente:

gcloud sql instances describe rails-cloudsql-instance

A continuación, copia al portapapeles el valor que aparece junto a connectionName. Luego, modifica la configuración de la base de datos de producción database.yml de la siguiente manera y reemplaza [PLACEHOLDERS] por los valores asociados.

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

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

Implementación de 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 aplicación. Si este archivo no está presente, el SDK de Cloud intentará predecir 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.

Para configurar la aplicación de muestra a fin de implementarla 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

Configuración de la clave secreta de Rails en app.yaml

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

Primero, genera una clave secreta nueva:

bundle exec bin/rails secret

Copia la clave secreta generada al portapapeles. Usarás la clave secreta en el paso siguiente.

Luego, abre el archivo app.yaml que creaste anteriormente y agrega una sección env_variables. La sección env_variables definirá variables de entorno para App Engine. El archivo app.yaml debe tener un aspecto similar al ejemplo que se muestra a continuación y debes reemplazar [SECRET_KEY] por la clave secreta del portapapeles.

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

env_variables:
  SECRET_KEY_BASE: [SECRET_KEY]

Configuración de la instancia de Cloud SQL en app.yaml

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

Abre el archivo app.yaml, agrega una sección nueva llamada beta_settings y define un parámetro anidado cloud_sql_instances con el nombre de conexión de la instancia como su valor.

Ahora, el archivo app.yaml debe tener un aspecto similar a lo que se muestra a continuación, donde [INSTANCE_CONNECTION_NAME] se reemplaza por el valor del nombre de conexión de la instancia de Cloud SQL.

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, deberás crear una app en el entorno flexible de App Engine. Usa el siguiente comando para seleccionar la región en la que deseas ejecutar la app de Rails.

Ingresa este comando para crear una app de App Engine:

gcloud app create

Se mostrará una lista de regiones. Selecciona una región que admita 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 sin redireccionar el tráfico desde la versión predeterminada actualmente en uso

Primero, ejecuta el siguiente comando para compilar previamente los recursos de Rails:

bundle exec bin/rails assets:precompile

Una vez que los recursos terminen de compilarse, puedes proceder a implementar una versión nueva de la app con el siguiente comando:

gcloud app deploy --no-promote

Este comando implementa la aplicación descrita en app.yaml como una versión nueva y no cambia la versión predeterminada en uso actualmente. Espera a que aparezca el mensaje que informa que la actualización de la app se completó. Las versiones implementadas se pueden ver en la lista de versiones de App Engine.

Una vez implementada la versión nueva, si intentas acceder a esta versión nueva, aparecerá el siguiente mensaje de error, ya que aún no se ejecutan las migraciones de bases 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. Para recuperar el número de proyecto, usa el siguiente comando para mostrar una lista de los proyectos disponibles:

    gcloud projects list
    
  2. Copia el [PROJECT NUMBER] del proyecto que usarás para implementar tu app.

  3. Usa [PROJECT_NUMBER] y el siguiente comando para agregar 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:

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

Migraciones de bases 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, ejecutarás la migración de tu base de datos production de cat_list_production.

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

Para ejecutar la migración de una base de datos en producción, invoca el siguiente comando:

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

Este comando migra la base de datos cat_list_production de Cloud SQL para MySQL. Si la migración se ejecutó correctamente, verás un resultado similar al siguiente:

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

Para verificar la migración de la base de datos, navega a la siguiente dirección:

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

Si la implementación se ejecutó correctamente, verás lo siguiente:

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

Esto migrará el tráfico de la versión predeterminada actual a la versión nueva, a la que podrás acceder en la siguiente dirección:

[YOUR-PROJECT-ID].appspot.com

Acceso a la app de Rails implementada

En el navegador web, dirígete a:

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

o usa el siguiente comando:

gcloud app browse

Lee los registros de App Engine

Ahora que implementaste tu app de Rails, te recomendamos leer los registros. Para esto, usa el Visor de registros de Cloud Console o ejecuta el siguiente comando:

gcloud app logs read

Para obtener más información, lee los registros con el SDK de Cloud.

Limpieza de recursos

Cuando termines de el instructivo "Uso de Cloud SQL para MySQL con Rails 5", puedes limpiar los recursos que creaste en Google Cloud Platform para evitar que se apliquen cargos en el futuro. Las siguientes secciones describen cómo borrar o desactivar estos recursos.

Borrar proyecto

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

Para borrar el proyecto, haz lo siguiente:

  1. En la GCP Console, dirígete a la página Proyectos.

    Ir a la página Proyectos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar.
  3. En el cuadro de 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 app:

  1. En GCP Console, dirígete a la página Versiones de App Engine.

    Ir a la página de Versiones

  2. Haz clic en la casilla de verificación junto a la versión de app no predeterminada que deseas borrar.
  3. Haz clic en el botón Borrar en la parte superior de la página para borrar la versión de la app.

Cómo borrar una instancia de Cloud SQL

Para borrar una instancia de Cloud SQL:

  1. En GCP Console, ve a la página SQL Instances.

    Ir a la página SQL Instances.

  2. Selecciona el nombre de la instancia de SQL que quieres borrar.
  3. Haz clic en el botón Borrar en la parte superior de la página para borrar la instancia.

¿Qué sigue?

¿Te sirvió esta página? Envíanos tu opinión: