Usa Cloud SQL para MySQL

En esta página se muestra cómo conectarse a una instancia de Cloud SQL para MySQL de segunda generación desde una aplicación de App Engine y cómo leer y escribir en Cloud SQL, que es una base de datos de SQL que existe en la nube de Google.

Para obtener más información sobre Cloud SQL, consulta la Documentación de Cloud SQL. Para obtener información sobre los precios y límites de Cloud SQL, consulta la página de Precios de Cloud SQL. Las aplicaciones de App Engine también están sujetas a las cuotas de App Engine.

Antes de comenzar

  1. Crea o selecciona un proyecto de GCP en la GCP Console y asegúrate de que incluya una aplicación de App Engine y de que la facturación se encuentre habilitada:
    Ir a App Engine

    El panel se abrirá si ya existe una aplicación de App Engine en tu proyecto y si la facturación está habilitada. De lo contrario, sigue las instrucciones para seleccionar una región y habilitar la facturación.

  2. Habilita las Cloud SQL API necesarias.

    Habilita las API

  3. Para implementar la aplicación con la herramienta gcloud debes descargar, instalar y luego inicializar el SDK de Cloud:
    Descargar el SDK

    Si ya tienes instalada la herramienta de gcloud y deseas configurarla para usar un ID del proyecto de GCP distinto del que empleaste durante la inicialización, consulta Administra las configuraciones del SDK de Cloud.

Configura la instancia de Cloud SQL

Para crear y configurar una instancia de Cloud SQL, debes hacer lo siguiente:

  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 --host=% --instance [INSTANCE_NAME] --password [PASSWORD]
    
  3. Si no deseas utilizar el usuario predeterminado para conectarte, crea un usuario.
  4. Registra el nombre de la conexión para la instancia:
    gcloud sql instances describe [INSTANCE_NAME]
    

    Por ejemplo:

    connectionName: project1:us-central1:instance1
    

    También puedes encontrar este valor en la página Detalles de la instancia de Google Cloud Platform Console.

  5. Crea una base de datos en tu instancia de Cloud SQL.
    gcloud sql databases create [DATABASE_NAME] --instance=[INSTANCE_NAME]
    
    Para obtener más información sobre cómo crear y administrar bases de datos, consulta la Documentación de Cloud SQL.

Configura el entorno local

Una vez implementada, la aplicación usa el proxy de Cloud SQL integrado en el entorno de ejecución de App Engine para comunicarse con la instancia de Cloud SQL. Sin embargo, para probar tu aplicación de manera local, debes instalar y utilizar una copia local del proxy de Cloud SQL en tu entorno de programación.

Para realizar tareas administrativas básicas en tu instancia de Cloud SQL, puedes utilizar el cliente de administración de tu base de datos, o GCP Console.

  1. Autentica la herramienta gcloud para conectarte desde tu máquina local a través del proxy:

    gcloud auth application-default login
    
  2. Instala el proxy de Cloud SQL:

    Linux de 64 bits

    1. Descarga el proxy:
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
      
    2. Haz que el proxy sea ejecutable:
      chmod +x cloud_sql_proxy
      

    Linux de 32 bits

    1. Descarga el proxy:
      wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
      
    2. Haz que el proxy sea ejecutable:
      chmod +x cloud_sql_proxy
      

    macOS de 64 bits

    1. Descarga el proxy:
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
      
    2. Haz que el proxy sea ejecutable:
      chmod +x cloud_sql_proxy
      

    macOS de 32 bits

    1. Descarga el proxy:
      curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
      
    2. Haz que el proxy sea ejecutable:
      chmod +x cloud_sql_proxy
      

    Windows de 64 bits

    Para descargar el proxy, haz clic derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe y selecciona Guardar vínculo como. Cambia el nombre del archivo a cloud_sql_proxy.exe.

    Windows de 32 bits

    Para descargar el proxy, haz clic derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe y selecciona Guardar vínculo como. Cambia el nombre del archivo a cloud_sql_proxy.exe.
    Si tu sistema operativo no se incluye aquí, también puedes compilar el proxy desde la fuente.
  3. Ejecuta el proxy de la siguiente manera:

    Según tu lenguaje y entorno, puedes iniciar el proxy con sockets TCP o con sockets Unix.

    Sockets TCP

    1. Copia el nombre de conexión de tu instancia desde la página Detalles de la instancia.

      Por ejemplo, utiliza lo siguiente: myproject:us-central1:myinstance.

    2. Si usas una cuenta de servicio para autenticar el proxy toma nota, en la máquina cliente, de la ubicación del archivo de claves privadas que se generó cuando creaste la cuenta de servicio.
    3. Inicia el proxy.

      Estas son algunas strings posibles de invocación del proxy:

      • Si usas la autenticación del SDK de Cloud:
        ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
        
        El puerto especificado no debe estar en uso, por ejemplo, por un servidor de base de datos local.
      • Si usas una cuenta de servicio y una especificación de instancia explícita (recomendado para entornos de producción):
        ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306 \
                          -credential_file=<PATH_TO_KEY_FILE> &
        

      Si deseas obtener más información sobre las opciones del proxy, consulta Opciones para autenticar el proxy y Opciones para especificar instancias.

    Sockets Unix

    1. Si usas una especificación de instancia explícita, copia el nombre de conexión de tu instancia que aparece en la página Detalles de la instancia.
    2. Crea el directorio donde se alojarán los sockets del proxy:
      sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
    3. Si usas una cuenta de servicio para autenticar el proxy toma nota, en la máquina cliente, de la ubicación del archivo de claves privadas que se generó cuando creaste la cuenta de servicio.
    4. Abre una ventana de terminal nueva y, luego, inicia el proxy.

      Estas son algunas strings posibles de invocación del proxy:

      • Si usas una cuenta de servicio y una especificación de instancia explícita (recomendado para entornos de producción):
        ./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME> \
                          -credential_file=<PATH_TO_KEY_FILE> &
      • Si usas la autenticación del SDK de Cloud y la detección automática de instancia:
        ./cloud_sql_proxy -dir=/cloudsql &

      Se recomienda iniciar el proxy en su propia terminal para que puedas supervisar los resultados sin que se mezclen con los de otros programas.

      Si deseas obtener más información sobre las opciones del proxy, consulta Opciones para autenticar el proxy y Opciones para especificar instancias.

  4. Para usar el cliente de administración, puedes instalar una copia local y conectarte a través del proxy o de direcciones IP.

    Para obtener más información, consulta Conecta un cliente MySQL mediante el proxy de Cloud SQL y Conecta un cliente MySQL mediante las direcciones IP.

Configura strings de conexión y agrega una biblioteca

  1. Configura el entorno local a fin de que sea compatible con conexiones para realizar pruebas locales.

    Por ejemplo, para el código de ejemplo de más abajo:

    export SQLALCHEMY_DATABASE_URI=mysql+pymysql://[USER_NAME]:[PASSWORD]@127.0.0.1:3306/[DATABASE_NAME]
    
  2. Para permitir que tu aplicación se conecte a tu instancia de Cloud SQL durante la implementación, agrega las variables de usuario, contraseña, base de datos y nombre de la conexión con la instancia desde Cloud SQL hasta las variables de entorno relacionadas en el archivo app.yaml:

    env_variables:
        # Replace user, password, database, and instance connection name with the values obtained
        # when configuring your Cloud SQL instance.
        SQLALCHEMY_DATABASE_URI: >-
          mysql+pymysql://USER:PASSWORD@/DATABASE?unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME

  3. Agrega la sección beta_settings a tu archivo app.yaml con el nombre de conexión de tu instancia de Cloud SQL.

    # Replace project and instance with the values obtained  when configuring your
    # Cloud SQL instance.
    beta_settings:
        cloud_sql_instances: INSTANCE_CONNECTION_NAME
  4. Agrega la biblioteca cliente de Python correspondiente al requirements.txt de tu aplicación. Por ejemplo, la muestra de código proporcionada presenta SQLAlchemy con PyMySQL:

    Flask==1.0.2
    Flask-SQLAlchemy==2.3.2
    gunicorn==19.9.0
    PyMySQL==0.9.3
    

Ejecuta el código de muestra

La muestra de main.py que figura a continuación usa el marco de trabajo de Flask para crear un registro de visitantes en una instancia de Cloud SQL. También usa SQLAlchemy, que administra las reducciones y cierres de conexión.

Antes de ejecutar la muestra, crea las tablas necesarias y asegúrate de que la base de datos tenga la configuración adecuada

python create_tables.py
El ejemplo siguiente escribe la información de las visitas en Cloud SQL y, luego, lee y muestra las últimas diez visitas:
# Environment variables are defined in app.yaml.
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['SQLALCHEMY_DATABASE_URI']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class Visit(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    timestamp = db.Column(db.DateTime())
    user_ip = db.Column(db.String(46))

    def __init__(self, timestamp, user_ip):
        self.timestamp = timestamp
        self.user_ip = user_ip

@app.route('/')
def index():
    user_ip = request.remote_addr

    # Keep only the first two octets of the IP address.
    if is_ipv6(user_ip):
        user_ip = ':'.join(user_ip.split(':')[:2])
    else:
        user_ip = '.'.join(user_ip.split('.')[:2])

    visit = Visit(
        user_ip=user_ip,
        timestamp=datetime.datetime.utcnow()
    )

    db.session.add(visit)
    db.session.commit()

    visits = Visit.query.order_by(sqlalchemy.desc(Visit.timestamp)).limit(10)

    results = [
        'Time: {} Addr: {}'.format(x.timestamp, x.user_ip)
        for x in visits]

    output = 'Last 10 visits:\n{}'.format('\n'.join(results))

    return output, 200, {'Content-Type': 'text/plain; charset=utf-8'}

Ejecuta pruebas y realiza la implementación

  1. Para realizar pruebas en tu aplicación de manera local, sigue estos pasos:

    python main.py
    
  2. Después de la prueba local, implementa tu aplicación en App Engine:

    gcloud app deploy
    

  3. Ejecuta el siguiente comando para iniciar el navegador y ver la aplicación en http://[YOUR_PROJECT_ID].appspot.com:

    gcloud app browse
    

Ejecuta 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 a 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 tu instancia de Cloud SQL, puedes omitir esta sección y dirigirte a la página Cómo configurar tu entorno local. De lo contrario, continúa con el paso siguiente.
  2. Identifica la cuenta de servicio asociada a tu aplicación de App Engine. A la cuenta de servicio de App Engine predeterminada se le asigna 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 tu 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 ya existe la cuenta de servicio, y esta tiene una función que incluye el permiso cloudsql.instances.connect, puedes proceder a Configura el entorno local.

    Las funciones Cloud SQL Client, Cloud SQL Editor y Cloud SQL Admin, y las funciones del proyecto heredadas Editor y Owner, todas 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 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.

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

Enviar comentarios sobre...

Documentación del entorno de App Engine Flexible para Python