Conéctate desde Cloud Functions a Cloud SQL

En esta página, se muestran información y ejemplos para conectar a una instancia de Cloud SQL desde un servicio que se ejecuta en Cloud Functions.

Cloud SQL es un servicio de base de datos completamente administrado que te ayuda a configurar, mantener, controlar y administrar tus bases de datos relacionales en la nube.

Cloud Functions es una solución de procesamiento ligera que permite a los desarrolladores crear funciones independientes y de un solo propósito que respondan a eventos de Cloud sin necesidad de administrar un servidor o entorno de ejecución.

Configura una instancia de Cloud SQL

  1. Habilita la API de Administrador de Cloud SQL en el proyecto desde el que te conectas, si aún no lo has hecho:

    Habilita la API

  2. Crea una instancia de Cloud SQL para SQL Server.

    De forma predeterminada, Cloud SQL asigna una dirección IP pública a una instancia nueva. Cloud Functions no admite la conexión a Cloud SQL para SQL Server a través de una IP pública. En su lugar, usa una IP privada. Para obtener más información, consulta la sección sobre cómo configurar IP privadas.

Configura Cloud Functions

Los pasos para configurar Cloud Functions dependen del tipo de dirección IP que hayas asignado a la instancia de Cloud SQL.

IP pública (predeterminada)

Cloud Functions no admite la conexión a Cloud SQL para SQL Server a través de una IP pública. En su lugar, usa una IP privada.

IP privada

El conector de acceso a VPC sin servidores controla la comunicación con la red de VPC. Para conectarte directamente con una IP privada, debes hacer lo siguiente:

  1. Asegúrate de que la instancia de Cloud SQL que creaste antes tenga una dirección IP privada. Si necesitas agregar una, consulta la página sobre cómo configurar IP privadas para obtener instrucciones.
  2. Crea un conector de Acceso a VPC sin servidores en la misma red de VPC en la que se encuentra tu instancia de Cloud SQL.
  3. El conector debe estar en el mismo proyecto y la misma región que los recursos que lo usan, pero puede enviar tráfico a recursos de regiones diferentes.

    El acceso a VPC sin servidores admite la comunicación con las redes de VPC conectadas a través de Cloud VPN y el intercambio de tráfico entre redes de VPC.

    El Acceso a VPC sin servidores no es compatible con las redes heredadas.

  4. Configura Cloud Functions para usar el conector.
  5. Conéctate mediante la IP privada y el puerto 1433 de tu instancia.

Conéctate a Cloud SQL

Después de configurar Cloud Functions, puedes conectarte a la instancia de Cloud SQL. Cloud Functions proporciona un mecanismo que se conecta mediante el proxy de Cloud SQL.

IP pública (predeterminada)

Cloud Functions no admite la conexión a Cloud SQL para SQL Server a través de una IP pública. En su lugar, usa una IP privada.

IP privada

Conéctate con TCP

Conéctate directamente con la dirección IP privada y el puerto 1433 de la instancia.

Python

Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.

# Remember - storing secrets in plaintext is potentially unsafe. Consider using
# something like https://cloud.google.com/secret-manager/docs/overview to help keep
# secrets secret.
db_user = os.environ["DB_USER"]
db_pass = os.environ["DB_PASS"]
db_name = os.environ["DB_NAME"]
db_host = os.environ["DB_HOST"]

# Extract host and port from environment variable DB_HOST
host_args = db_host.split(":")
db_hostname, db_port = host_args[0], int(host_args[1])

# The SQLAlchemy engine will help manage interactions, including automatically
# managing a pool of connections to your database
pool = sqlalchemy.create_engine(
    # Equivalent URL:
    # mssql+pyodbc://<db_user>:<db_pass>@/<host>:<port>/<db_name>?driver=ODBC+Driver+17+for+SQL+Server
    sqlalchemy.engine.url.URL(
        "mssql+pyodbc",
        username=db_user,
        password=db_pass,
        database=db_name,
        host=db_hostname,
        port=db_port,
        query={"driver": "ODBC Driver 17 for SQL Server"},
    ),
    # ... Specify additional properties here.
    # ...
)

Node.js

Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.

const createPool = async () => {
  let config = {pool: {}};
  config.user = process.env.DB_USER; // e.g. 'my-db-user'
  config.password = process.env.DB_PASS; // e.g. 'my-db-password'
  config.database = process.env.DB_NAME; // e.g. 'my-database'
  // set the server to '172.17.0.1' when connecting from App Engine Flex
  config.server = process.env.DEPLOYED ? '172.17.0.1' : '127.0.0.1';
  config.port = 1433;

  // ...
  return await mssql.connect(config);
};

Go

Para ver este fragmento en el contexto de una aplicación web, consulta el archivo README en GitHub.

var (
	dbUser    = mustGetenv("DB_USER")     // e.g. 'my-db-user'
	dbPwd     = mustGetenv("DB_PASS")     // e.g. 'my-db-password'
	dbTcpHost = mustGetenv("DB_TCP_HOST") // e.g. '127.0.0.1' ('172.17.0.1' if deployed to GAE Flex)
	dbPort    = mustGetenv("DB_PORT")     // e.g. '1433'
	dbName    = mustGetenv("DB_NAME")     // e.g. 'my-database'
)

var dbURI string
dbURI = fmt.Sprintf("server=%s;user id=%s;password=%s;port=%s;database=%s;", dbTcpHost, dbUser, dbPwd, dbPort, dbName)

// dbPool is the pool of database connections.
dbPool, err := sql.Open("mssql", dbURI)
if err != nil {
	return nil, fmt.Errorf("sql.Open: %v", err)
}

// ...

return dbPool, nil

Prácticas recomendadas y más información

Puedes usar el proxy de Cloud SQL cuando pruebes tu aplicación de forma local. Consulta Inicio rápido para usar el proxy para pruebas locales si quieres obtener instrucciones detalladas.

Grupos de conexiones

Las conexiones a bases de datos subyacentes pueden caerse debido al propio servidor de la base de datos o a la infraestructura subyacente a Cloud Functions. Te recomendamos usar una biblioteca cliente que admita grupos de conexiones que vuelvan a establecer de forma automática las conexiones de clientes que no funcionan. Además, te recomendamos que uses un grupo de conexiones de alcance global, ya que esto aumenta la probabilidad de que la función vuelva a usar la misma conexión para las invocaciones posteriores de la función y cierre la conexión de forma natural cuando se expulse la instancia (reducción del ajuste de escala automático). Para obtener ejemplos más detallados sobre cómo usar los grupos de conexiones, consulta la sección sobre cómo administrar conexiones de bases de datos.

Límites de conexión

Cloud SQL impone un límite máximo en las conexiones simultáneas. Estos límites pueden variar según el motor de base de datos elegido (consulta Cuotas y límites). Se recomienda usar una conexión con Cloud Functions, pero es importante establecer la cantidad máxima de conexiones en 1.

Siempre que sea posible, asegúrate de inicializar un grupo de conexiones solo para las funciones que necesiten acceder a tu base de datos. Algunos grupos de conexiones crearán conexiones de forma preventiva, que pueden consumir recursos excesivos y cuentan en tus límites de conexión. Por esta razón, se recomienda usar la inicialización diferida a fin de retrasar la creación de un grupo de conexiones hasta que sea necesario y solo incluir el grupo de conexiones en las funciones en las que se usa.

Para obtener ejemplos más detallados sobre cómo limitar la cantidad de conexiones, consulta la página sobre cómo administrar las conexiones de las base de datos.

Límites de cuota de la API

Cloud Functions proporciona un mecanismo que se conecta mediante el proxy de Cloud SQL, que usa la API de Administrador de Cloud SQL. Los límites de cuota de la API se aplican al proxy de Cloud SQL.