Usa Cloud SQL para MySQL

Cloud SQL proporciona una base de datos relacional que se encuentra en la nube de Google y que puedes usar con tu aplicación de App Engine. Para obtener más información sobre Cloud SQL, consulta la documentación de Cloud SQL.

Para obtener más información sobre los precios y las restricciones que imponen Cloud SQL y App Engine, consulta Precios y límites de acceso.

Antes de comenzar

  1. Crea o selecciona un proyecto de GCP en GCP Console y, a continuación, asegúrate de que el proyecto incluya una aplicación de App Engine:

    Ir a App Engine

    El Panel se abrirá si ya existe una aplicación de App Engine en el proyecto. De lo contrario, se te solicitará que selecciones la región donde quieres que se ubique la aplicación de App Engine.

  2. Descarga, instala y, luego, inicializa el SDK de Cloud:

    Descargar el SDK

    Si ya tienes instalada la herramienta de gcloud y deseas configurarla con el fin de usar un ID del proyecto de GCP distinto del que usaste para la inicialización, consulta Cómo administrar configuraciones del SDK de Cloud.

Cómo configurar la instancia de Cloud SQL

  1. Crea una instancia de Cloud SQL de segunda generación.
  2. Si aún no lo hiciste, establece la contraseña para el usuario predeterminado en tu instancia de Cloud SQL:
    gcloud sql users set-password root % --instance [INSTANCE_NAME] --password [PASSWORD]
  3. Si no deseas utilizar el usuario predeterminado para conectarte, crea un usuario.
  4. Con el SDK de Cloud, obtén el nombre de conexión de la instancia de Cloud SQL para usar como string de conexión en el código de tu aplicación:
    gcloud sql instances describe [INSTANCE_NAME]
    Registra el valor mostrado para connectionName. También puedes encontrar este valor en la página de detalles de la instancia de Google Cloud Platform Console. Por ejemplo, en la salida del SDK de Cloud:
    gcloud sql instances describe instance1
      connectionName: project1:us-central1:instance1
  5. Agrega el nombre de conexión de la instancia de Cloud SQL, el nombre de la base de datos, el usuario y la contraseña a las variables del entorno en app.yaml.
    env_variables:
      # Replace INSTANCE_CONNECTION_NAME with the value obtained when configuring your
      # Cloud SQL instance, available from the Google Cloud Console or from the Cloud SDK.
      # For Cloud SQL 2nd generation instances, this should be in the form of "project:region:instance".
      CLOUDSQL_CONNECTION_NAME: INSTANCE_CONNECTION_NAME
      # Replace username and password if you aren't using the root user.
      CLOUDSQL_USER: root
      CLOUDSQL_PASSWORD: ''
    

Cómo ejecutar Cloud SQL y App Engine en proyectos diferentes

Si la aplicación de App Engine y la instancia de Cloud SQL se encuentran en distintos proyectos de Google Cloud Platform, debes usar una cuenta de servicio para permitir el acceso de la aplicación de App Engine a Cloud SQL.

Esta cuenta de servicio representa tu aplicación de App Engine y se crea de forma predeterminada cuando creas un proyecto de Google Cloud Platform.

  1. Si tu aplicación de App Engine está en el mismo proyecto que la instancia de Cloud SQL, dirígete a Cómo establecer la configuración. De lo contrario, continúa con el siguiente paso.
  2. Identifica la cuenta de servicio asociada a tu aplicación de App Engine. La cuenta de servicio de App Engine predeterminada recibe el nombre [PROJECT-ID]@appspot.gserviceaccount.com.

    Puedes verificar la cuenta de servicio de App Engine en la página Permisos de IAM. Asegúrate de seleccionar el proyecto para tu aplicación de App Engine, no la instancia de Cloud SQL.

    Ir a la página Permisos de IAM

  3. Ve a la página IAM y proyectos del administrador en Google Cloud Platform Console.

    Ir a la página IAM y proyectos del administrador

  4. Selecciona el proyecto que contiene la instancia de Cloud SQL.
  5. Busca el nombre de la cuenta de servicio.
  6. Si la cuenta de servicio ya existe y tiene una función que incluye el permiso cloudsql.instances.connect, puedes proceder a configurar la instancia de Cloud SQL.

    Las funciones Cloud SQL Client, Cloud SQL Editor y Cloud SQL Admin, y las funciones del proyecto heredadas Editor y Owner otorgan los permisos necesarios.

  7. De lo contrario, haz clic en Agregar para incluir la cuenta de servicio.
  8. En el diálogo Agregar miembros, ingresa el nombre de la cuenta de servicio y selecciona una función que incluya el permiso cloudsql.instances.connect (cualquier función predefinida de Cloud SQL funcionará, excepto el Visualizador).

    O bien, puedes seleccionar Proyecto > Editor para usar la función básica de editor, pero esta incluye permisos en Google Cloud Platform.

    Si no ves estas funciones, es posible que tu usuario de Google Cloud Platform no tenga el permiso resourcemanager.projects.setIamPolicy. Puedes verificar tus permisos en la página IAM, en Google Cloud Platform Console, y buscar tu ID de usuario.

  9. Haz clic en Agregar.

    Ahora deberías ver que la cuenta de servicio aparece con la función especificada.

Descripción general de la muestra del código

En la siguiente muestra, se enumeran las bases de datos en una instancia de Cloud SQL.

// Copyright 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Sample cloudsql demonstrates connection to a Cloud SQL instance from App Engine standard.
package main

import (
	"bytes"
	"database/sql"
	"fmt"
	"log"
	"net/http"
	"os"

	"google.golang.org/appengine"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func main() {
	var (
		connectionName = mustGetenv("CLOUDSQL_CONNECTION_NAME")
		user           = mustGetenv("CLOUDSQL_USER")
		password       = os.Getenv("CLOUDSQL_PASSWORD") // NOTE: password may be empty
	)

	var err error
	db, err = sql.Open("mysql", fmt.Sprintf("%s:%s@cloudsql(%s)/", user, password, connectionName))
	if err != nil {
		log.Fatalf("Could not open db: %v", err)
	}

	http.HandleFunc("/", handler)
	appengine.Main()
}

func handler(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}

	w.Header().Set("Content-Type", "text/plain")

	rows, err := db.Query("SHOW DATABASES")
	if err != nil {
		http.Error(w, fmt.Sprintf("Could not query db: %v", err), 500)
		return
	}
	defer rows.Close()

	buf := bytes.NewBufferString("Databases:\n")
	for rows.Next() {
		var dbName string
		if err := rows.Scan(&dbName); err != nil {
			http.Error(w, fmt.Sprintf("Could not scan result: %v", err), 500)
			return
		}
		fmt.Fprintf(buf, "- %s\n", dbName)
	}
	w.Write(buf.Bytes())
}

func mustGetenv(k string) string {
	v := os.Getenv(k)
	if v == "" {
		log.Panicf("%s environment variable not set.", k)
	}
	return v
}

Cómo implementar tu aplicación

Para implementar la aplicación en App Engine, ejecuta el comando gcloud app deploy:

gcloud app deploy

Para obtener más información sobre la implementación en App Engine, consulta cómo implementar una aplicación de Go 1.9.

¡Listo! Para iniciar el navegador y ver la aplicación en http://[YOUR_PROJECT_ID].appspot.com, ejecuta el siguiente comando:

gcloud app browse
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Go