Cómo usar Cloud SQL para PostgreSQL con Rails 5

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

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 PostgreSQL con una nueva app de Rails. Este instructivo también se puede usar como referencia para configurar apps de Rails existentes a fin de usar Cloud SQL para PostgreSQL.

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 creas 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 la consola de GCP.
    2. En el menú desplegable de la parte superior, selecciona Crear un proyecto.
    3. Haz clic en Mostrar opciones avanzadas. En App Engine Location (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 de y regístrate para realizar una prueba gratuita de .

    Si aún no habilitas la facturación, habilita la facturación ahora dey regístrate para una prueba gratuita de. Habilitar la facturación permite que la app 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 Instalar 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 la consola de GCP y habilitará automáticamente las API que usa este instructivo. Las API que se usan son: Cloud SQL Administration.

Prepara una instancia de Cloud SQL para PostgreSQL

Configura una instancia de Cloud SQL para PostgreSQL a fin de usarla en este instructivo.

  1. Crea una instancia de PostgreSQL. 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 la contraseña del usuario de postgres para la instancia.

Configura el 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 que completes los requisitos previos, crea y implementa una app de Rails con Cloud SQL para PostgreSQL. Las siguientes secciones te guiarán en la configuración, la conexión a Cloud SQL para PostgreSQL, la ejecución y la implementación de una app.

Crea una app nueva que muestre una lista de gatos

Ejecuta el comando rails new para crear una app de Rails nueva. El objetivo es almacenar una lista de gatos en Cloud SQL para PostgreSQL:

rails new cat_sample_app

Ve al directorio que contiene la app de Rails que se generó:

cd cat_sample_app

Ejecutar la app de manera local

Para ejecutar la app de Rails nueva en tu computadora local, haz lo siguiente:

  1. Instala las dependencias con Bundler:

      bundle install
    
  2. Inicia un servidor web local:

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

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

Generación de 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 su nombre y edad. Para generar la estructura, usa el siguiente comando:

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

A continuación, 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

Para modificar este archivo, agrega root 'cats#index':

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.

Cómo usar Cloud SQL para PostgreSQL con App Engine

Cloud SQL para PostgreSQL es un servicio de bases de datos completamente administradas que facilita la configuración, el mantenimiento y la administración de las bases de datos relacionales de PostgreSQL en la nube. Esto significa que puedes usar Cloud SQL en una app de Rails como cualquier otra base de datos relacional.

Configura Cloud SQL para PostgreSQL

Para comenzar a usar Cloud SQL con tu app de Rails en producción, agrega las gemas pg y appengine al archivo Gemfile:

bundle add pg
bundle add appengine

Gemfile de Rails contiene las siguientes entradas gem adicionales:

# Added at 2017-08-23 15:24:52 -0700 by franknatividad:
gem "pg", "~> 0.21.0"

# 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 Cloud SQL.

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

Copia el valor junto a connectionName en tu portapapeles. 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: 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]"

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 app. Si este archivo no está presente, el SDK de Cloud intenta 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 app de muestra para tu implementación en App Engine, crea un archivo nuevo llamado app.yaml en la raíz del directorio de tu app 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 se implementa una aplicación Rails en un entorno con el valor production, la variable de entorno SECRET_KEY_BASE espera una clave secreta para proteger los datos de sesión del usuario. Esta variable de entorno se lee desde archivo config/secrets.yml de tu app de Rails.

Primero, genera una clave secreta nueva:

bundle exec bin/rails secret

Copia la clave secreta generada al portapapeles. Debes usar la clave secreta en el siguiente paso.

Luego, abre el archivo app.yaml que creaste anteriormente y agrega una sección env_variables. env_variables define las variables del entorno en el entorno de 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

A continuación, configura el entorno flexible de App Engine para que utilice una instancia de Cloud SQL específica, proporcionando 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 aplicación, debes crear una para el entorno flexible de App Engine. Usa el siguiente comando para seleccionar la región en la que deseas ejecutar la app de Rails.

Para crear una aplicación de App Engine, ejecuta el siguiente comando:

gcloud app create

Aparecerá un mensaje con 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 app descrita en app.yaml como una versión nueva y no cambia la versión de servicio predeterminada actual. Espera a que aparezca el mensaje que informa que la actualización de la app se completó. Visualiza las versiones implementadas 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 mediante la obtención de una lista de los proyectos disponibles, usa el siguiente comando:

    gcloud projects list
    
  2. Copia [PROJECT NUMBER] para el 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, realiza una migración de base de datos para la cat_list_production de tu base de datos 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 una migración de base de datos en producción, usa 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 PostgreSQL. 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 migra el tráfico de la versión predeterminada actual a la versión nueva, a la que puedes acceder en la siguiente dirección:

[YOUR-PROJECT-ID].appspot.com

Accede a la app de Rails implementada

En tu navegador, ve 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 leer los registros de la app, utiliza el Visor de registros ubicado en Cloud Console, o mediante el siguiente comando:

gcloud app logs read

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

Limpia los recursos

Cuando termines el instructivo "Cómo usar Cloud SQL para PostgreSQL con Rails 5", puedes limpiar los recursos que creaste en Google Cloud Platform para evitar que se apliquen cargos en el futuro. La siguiente sección describe 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: