Conectarse desde Cloud Run

Esta página contiene información y ejemplos para conectarse a una instancia de Cloud SQL desde un servicio que se ejecuta en Cloud Run.

Para obtener instrucciones paso a paso sobre cómo ejecutar una aplicación web de muestra de Cloud Run conectada a Cloud SQL, consulte la guía de inicio rápido para conectarse desde Cloud Run .

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

Cloud Run es una plataforma informática administrada que le permite ejecutar contenedores directamente sobre Google Cloud infraestructura.

Configurar una instancia de Cloud SQL

  1. Habilite la API de administración de Cloud SQL en el Google Cloud proyecto desde el que te estás conectando, si aún no lo has hecho:

    Enable the API

  2. Cree una instancia de Cloud SQL para PostgreSQL . Le recomendamos que elija una ubicación de instancia de Cloud SQL en la misma región que su servicio Cloud Run para mejorar la latencia, evitar costos de red y reducir el riesgo de fallos entre regiones.

    De forma predeterminada, Cloud SQL asigna una dirección IP pública a cada nueva instancia. También puede asignar una dirección IP privada. Para obtener más información sobre las opciones de conectividad para ambas instancias, consulte la página "Resumen de la conexión" .

Configurar Cloud Run

Los pasos para configurar Cloud Run dependen del tipo de dirección IP asignada a su instancia de Cloud SQL. Si enruta todo el tráfico de salida a través de la salida directa de VPC o un conector de acceso a VPC sin servidor, use una dirección IP privada. Compare los dos métodos de salida de red .

IP pública (predeterminada)

  • Asegúrese de que la instancia tenga una dirección IP pública. Puede verificarlo en la página Descripción general de su instancia en Google Cloud consola . Si necesita agregar una, consulte la página "Configuración de IP pública" para obtener instrucciones.
  • Obtenga el INSTANCE_CONNECTION_NAME de su instancia. Puede encontrar este valor en la página de descripción general de su instancia en Google Cloud consola o ejecutando el siguiente comando gcloud sql instances describe :
    gcloud sql instances describe INSTANCE_NAME
       
    Reemplace INSTANCE_NAME con el nombre de su instancia de Cloud SQL.
  • Obtén el CLOUD_RUN_SERVICE_ACCOUNT_NAME para tu servicio de Cloud Run. Puedes encontrar este valor en la página de IAM del proyecto que aloja el servicio de Cloud Run en Google Cloud consola o ejecutando el siguiente comando gcloud run services describe en el proyecto que aloja el servicio Cloud Run:
    gcloud run services describe CLOUD_RUN_SERVICE_NAME
    --region CLOUD_RUN_SERVICE_REGION --format="value(spec.template.spec.serviceAccountName)"
       
    Reemplace las siguientes variables:
    • CLOUD_RUN_SERVICE_NAME : el nombre de su servicio Cloud Run
    • CLOUD_RUN_SERVICE_REGION : la región de su servicio Cloud Run
  • Configure la cuenta de servicio para su servicio de Cloud Run. Para conectarse a Cloud SQL, asegúrese de que la cuenta de servicio tenga el rol de IAM Cloud SQL Client .
  • Si va a agregar una conexión de Cloud SQL a un nuevo servicio, debe contenerizarlo y subirlo al Registro de Contenedores o al Registro de Artefactos. Si aún no tiene una conexión, consulte estas instrucciones sobre cómo crear e implementar una imagen de contenedor.

Como cualquier cambio de configuración, establecer una nueva configuración para la conexión de Cloud SQL genera una nueva revisión de Cloud Run. Las revisiones posteriores también obtendrán automáticamente esta conexión de Cloud SQL, a menos que realice actualizaciones explícitas para cambiarla.

Consola

  1. Ir a Cloud Run

  2. Comience a configurar el servicio. Para agregar conexiones de Cloud SQL a un servicio existente, siga estos pasos:

    1. En la lista de Servicios , haga clic en el nombre del servicio que desee.
    2. Haga clic en Editar e implementar nueva revisión .
  3. Habilitar la conexión a una instancia de Cloud SQL:
    1. Haga clic en Contenedor(es) y luego en Configuración .
    2. Desplácese hasta Conexiones de Cloud SQL .
    3. Haga clic en Agregar conexión .
    4. Haga clic en el botón Habilitar el administrador de Cloud SQL si aún no ha habilitado la API de administrador de Cloud SQL.

    Agregar una conexión de Cloud SQL

    • Si está agregando una conexión a una instancia de Cloud SQL en su proyecto, seleccione la instancia de Cloud SQL que desee en el menú.
    • Si está utilizando una instancia de Cloud SQL de otro proyecto, seleccione la cadena de conexión personalizada en el menú e ingrese el nombre completo de la conexión de la instancia en el formato PROJECT-ID:REGION:INSTANCE-ID .
    • Para eliminar una conexión, mantenga el cursor a la derecha de la conexión para que aparezca el ícono y haga clic en él.
  4. Haga clic en Crear o Implementar .

Línea de comandos

Antes de utilizar cualquiera de los siguientes comandos, realice las siguientes sustituciones:

  • IMAGE con la imagen que estás implementando
  • SERVICE_NAME con el nombre de su servicio Cloud Run
  • INSTANCE_CONNECTION_NAME con el nombre de conexión de instancia de su instancia de Cloud SQL o una lista delimitada por comas de nombres de conexión.

    Si está implementando un nuevo contenedor, utilice el siguiente comando:

    gcloud run deploy \
      --image=IMAGE \
      --add-cloudsql-instances=INSTANCE_CONNECTION_NAME
    Si está actualizando un servicio existente, utilice el siguiente comando:
    gcloud run services update SERVICE_NAME \
      --add-cloudsql-instances=INSTANCE_CONNECTION_NAME

Terraformar

El siguiente código crea un contenedor base de Cloud Run, con una instancia de Cloud SQL conectada.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello:latest" # Image to deploy

      volume_mounts {
        name       = "cloudsql"
        mount_path = "/cloudsql"
      }
    }
    volumes {
      name = "cloudsql"
      cloud_sql_instance {
        instances = [google_sql_database_instance.default.connection_name]
      }
    }
  }
  client     = "terraform"
  depends_on = [google_project_service.secretmanager_api, google_project_service.cloudrun_api, google_project_service.sqladmin_api]
}

  1. Aplique los cambios ingresando terraform apply .
  2. Verifique los cambios revisando el servicio Cloud Run , haciendo clic en la pestaña Revisiones y luego en la pestaña Conexiones .

IP privada

Si la cuenta de servicio autorizadora pertenece a un proyecto diferente al que contiene la instancia de Cloud SQL, haga lo siguiente:

  • En ambos proyectos, habilite la API de administración de Cloud SQL.
  • Para la cuenta de servicio en el proyecto que contiene la instancia de Cloud SQL, agregue los permisos de IAM .
La salida directa de VPC y los conectores utilizan direcciones IP privadas para gestionar la comunicación con su red de VPC. Para conectarse directamente con direcciones IP privadas mediante uno de estos métodos de salida, siga estos pasos:
  1. Asegúrese de que la instancia de Cloud SQL creada previamente tenga una dirección IP privada. Para agregar una dirección IP interna, consulte Configurar una IP privada .
  2. Configure su método de salida para conectarse a la misma red de VPC que su instancia de Cloud SQL. Tenga en cuenta las siguientes condiciones:
    • Tanto la salida directa de VPC como el acceso a VPC sin servidor admiten la comunicación con redes de VPC conectadas mediante Cloud VPN y VPC Network Peering .
    • La salida directa de VPC y el acceso a VPC sin servidor no admiten redes heredadas .
    • A menos que esté usando VPC compartida , un conector debe compartir el mismo proyecto y región que el recurso que lo usa, aunque el conector puede enviar tráfico a recursos en diferentes regiones.
  3. Conéctese utilizando la dirección IP privada de su instancia y el puerto 5432 .

Conectarse a Cloud SQL

Después de configurar Cloud Run, puede conectarse a su instancia de Cloud SQL.

IP pública (predeterminada)

Para las rutas de IP públicas, Cloud Run proporciona cifrado y se conecta mediante el proxy de autenticación de Cloud SQL de dos maneras:

Utilice el administrador de secretos

Google recomienda usar Secret Manager para almacenar información confidencial, como credenciales de SQL. Puedes pasar secretos como variables de entorno o montarlos como un volumen con Cloud Run.

Después de crear un secreto en Secret Manager, actualice un servicio existente con el siguiente comando:

Línea de comandos

gcloud run services update SERVICE_NAME \
  --add-cloudsql-instances=INSTANCE_CONNECTION_NAME
  --update-env-vars=INSTANCE_CONNECTION_NAME=INSTANCE_CONNECTION_NAME_SECRET \
  --update-secrets=DB_USER=DB_USER_SECRET:latest \
  --update-secrets=DB_PASS=DB_PASS_SECRET:latest \
  --update-secrets=DB_NAME=DB_NAME_SECRET:latest

Terraformar

A continuación, se crean recursos secretos para almacenar de forma segura los valores de usuario, contraseña y nombre de la base de datos mediante google_secret_manager_secret y google_secret_manager_secret_version . Tenga en cuenta que debe actualizar la cuenta de servicio de cómputo del proyecto para acceder a cada secreto.


# Create dbuser secret
resource "google_secret_manager_secret" "dbuser" {
  secret_id = "dbusersecret"
  replication {
    auto {}
  }
  depends_on = [google_project_service.secretmanager_api]
}

# Attaches secret data for dbuser secret
resource "google_secret_manager_secret_version" "dbuser_data" {
  secret      = google_secret_manager_secret.dbuser.id
  secret_data = "secret-data" # Stores secret as a plain txt in state
}

# Update service account for dbuser secret
resource "google_secret_manager_secret_iam_member" "secretaccess_compute_dbuser" {
  secret_id = google_secret_manager_secret.dbuser.id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${data.google_project.project.number}[email protected]" # Project's compute service account
}


# Create dbpass secret
resource "google_secret_manager_secret" "dbpass" {
  secret_id = "dbpasssecret"
  replication {
    auto {}
  }
  depends_on = [google_project_service.secretmanager_api]
}

# Attaches secret data for dbpass secret
resource "google_secret_manager_secret_version" "dbpass_data" {
  secret      = google_secret_manager_secret.dbpass.id
  secret_data = "secret-data" # Stores secret as a plain txt in state
}

# Update service account for dbpass secret
resource "google_secret_manager_secret_iam_member" "secretaccess_compute_dbpass" {
  secret_id = google_secret_manager_secret.dbpass.id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${data.google_project.project.number}[email protected]" # Project's compute service account
}


# Create dbname secret
resource "google_secret_manager_secret" "dbname" {
  secret_id = "dbnamesecret"
  replication {
    auto {}
  }
  depends_on = [google_project_service.secretmanager_api]
}

# Attaches secret data for dbname secret
resource "google_secret_manager_secret_version" "dbname_data" {
  secret      = google_secret_manager_secret.dbname.id
  secret_data = "secret-data" # Stores secret as a plain txt in state
}

# Update service account for dbname secret
resource "google_secret_manager_secret_iam_member" "secretaccess_compute_dbname" {
  secret_id = google_secret_manager_secret.dbname.id
  role      = "roles/secretmanager.secretAccessor"
  member    = "serviceAccount:${data.google_project.project.number}[email protected]" # Project's compute service account
}

Actualice el recurso principal de Cloud Run para incluir los nuevos secretos.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello:latest" # Image to deploy

      # Sets a environment variable for instance connection name
      env {
        name  = "INSTANCE_CONNECTION_NAME"
        value = google_sql_database_instance.default.connection_name
      }
      # Sets a secret environment variable for database user secret
      env {
        name = "DB_USER"
        value_source {
          secret_key_ref {
            secret  = google_secret_manager_secret.dbuser.secret_id # secret name
            version = "latest"                                      # secret version number or 'latest'
          }
        }
      }
      # Sets a secret environment variable for database password secret
      env {
        name = "DB_PASS"
        value_source {
          secret_key_ref {
            secret  = google_secret_manager_secret.dbpass.secret_id # secret name
            version = "latest"                                      # secret version number or 'latest'
          }
        }
      }
      # Sets a secret environment variable for database name secret
      env {
        name = "DB_NAME"
        value_source {
          secret_key_ref {
            secret  = google_secret_manager_secret.dbname.secret_id # secret name
            version = "latest"                                      # secret version number or 'latest'
          }
        }
      }

      volume_mounts {
        name       = "cloudsql"
        mount_path = "/cloudsql"
      }
    }
    volumes {
      name = "cloudsql"
      cloud_sql_instance {
        instances = [google_sql_database_instance.default.connection_name]
      }
    }
  }
  client     = "terraform"
  depends_on = [google_project_service.secretmanager_api, google_project_service.cloudrun_api, google_project_service.sqladmin_api]
}

Aplique los cambios ingresando terraform apply .

El comando de ejemplo utiliza la versión secreta, latest ; sin embargo, Google recomienda fijar el secreto a una versión específica, SECRET_NAME:v1 .

IP privada

Para las rutas IP privadas, la aplicación se conecta directamente a la instancia a través de una red VPC. Este método utiliza TCP para conectarse directamente a la instancia de Cloud SQL sin usar el proxy de autenticación de Cloud SQL.

Conectarse con TCP

Conéctese utilizando la dirección IP privada de su instancia de Cloud SQL como host y el puerto 5432 .

Pitón

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

import os
import ssl

import sqlalchemy


def connect_tcp_socket() -> sqlalchemy.engine.base.Engine:
    """Initializes a TCP connection pool for a Cloud SQL instance of Postgres."""
    # Note: Saving credentials in environment variables is convenient, but not
    # secure - consider a more secure solution such as
    # Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
    # keep secrets safe.
    db_host = os.environ[
        "INSTANCE_HOST"
    ]  # e.g. '127.0.0.1' ('172.17.0.1' if deployed to GAE Flex)
    db_user = os.environ["DB_USER"]  # e.g. 'my-db-user'
    db_pass = os.environ["DB_PASS"]  # e.g. 'my-db-password'
    db_name = os.environ["DB_NAME"]  # e.g. 'my-database'
    db_port = os.environ["DB_PORT"]  # e.g. 5432

    pool = sqlalchemy.create_engine(
        # Equivalent URL:
        # postgresql+pg8000://<db_user>:<db_pass>@<db_host>:<db_port>/<db_name>
        sqlalchemy.engine.url.URL.create(
            drivername="postgresql+pg8000",
            username=db_user,
            password=db_pass,
            host=db_host,
            port=db_port,
            database=db_name,
        ),
        # ...
    )
    return pool

Java

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

Nota:

  • CLOUD_SQL_CONNECTION_NAME debe representarse como <MI-PROYECTO>:<REGIÓN-DE-INSTANCIA>:<NOMBRE-DE-INSTANCIA>
  • El uso del argumento ipTypes=PRIVATE obligará a SocketFactory a conectarse con la IP privada asociada a una instancia
  • Consulte los requisitos de la versión de fábrica del socket JDBC para el archivo pom.xml aquí .


import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;

public class TcpConnectionPoolFactory extends ConnectionPoolFactory {

  // Note: Saving credentials in environment variables is convenient, but not
  // secure - consider a more secure solution such as
  // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
  // keep secrets safe.
  private static final String DB_USER = System.getenv("DB_USER");
  private static final String DB_PASS = System.getenv("DB_PASS");
  private static final String DB_NAME = System.getenv("DB_NAME");

  private static final String INSTANCE_HOST = System.getenv("INSTANCE_HOST");
  private static final String DB_PORT = System.getenv("DB_PORT");


  public static DataSource createConnectionPool() {
    // The configuration object specifies behaviors for the connection pool.
    HikariConfig config = new HikariConfig();

    // The following URL is equivalent to setting the config options below:
    // jdbc:postgresql://<INSTANCE_HOST>:<DB_PORT>/<DB_NAME>?user=<DB_USER>&password=<DB_PASS>
    // See the link below for more info on building a JDBC URL for the Cloud SQL JDBC Socket Factory
    // https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory#creating-the-jdbc-url

    // Configure which instance and what database user to connect with.
    config.setJdbcUrl(String.format("jdbc:postgresql://%s:%s/%s", INSTANCE_HOST, DB_PORT, DB_NAME));
    config.setUsername(DB_USER); // e.g. "root", "postgres"
    config.setPassword(DB_PASS); // e.g. "my-password"


    // ... Specify additional connection properties here.
    // ...

    // Initialize the connection pool using the configuration object.
    return new HikariDataSource(config);
  }
}

Node.js

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

const Knex = require('knex');
const fs = require('fs');

// createTcpPool initializes a TCP connection pool for a Cloud SQL
// instance of Postgres.
const createTcpPool = async config => {
  // Note: Saving credentials in environment variables is convenient, but not
  // secure - consider a more secure solution such as
  // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
  // keep secrets safe.
  const dbConfig = {
    client: 'pg',
    connection: {
      host: process.env.INSTANCE_HOST, // e.g. '127.0.0.1'
      port: process.env.DB_PORT, // e.g. '5432'
      user: process.env.DB_USER, // e.g. 'my-user'
      password: process.env.DB_PASS, // e.g. 'my-user-password'
      database: process.env.DB_NAME, // e.g. 'my-database'
    },
    // ... Specify additional properties here.
    ...config,
  };
  // Establish a connection to the database.
  return Knex(dbConfig);
};

Ir

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

package cloudsql

import (
	"database/sql"
	"fmt"
	"log"
	"os"

	// Note: If connecting using the App Engine Flex Go runtime, use
	// "github.com/jackc/pgx/stdlib" instead, since v5 requires
	// Go modules which are not supported by App Engine Flex.
	_ "github.com/jackc/pgx/v5/stdlib"
)

// connectTCPSocket initializes a TCP connection pool for a Cloud SQL
// instance of Postgres.
func connectTCPSocket() (*sql.DB, error) {
	mustGetenv := func(k string) string {
		v := os.Getenv(k)
		if v == "" {
			log.Fatalf("Fatal Error in connect_tcp.go: %s environment variable not set.", k)
		}
		return v
	}
	// Note: Saving credentials in environment variables is convenient, but not
	// secure - consider a more secure solution such as
	// Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
	// keep secrets safe.
	var (
		dbUser    = mustGetenv("DB_USER")       // e.g. 'my-db-user'
		dbPwd     = mustGetenv("DB_PASS")       // e.g. 'my-db-password'
		dbTCPHost = mustGetenv("INSTANCE_HOST") // e.g. '127.0.0.1' ('172.17.0.1' if deployed to GAE Flex)
		dbPort    = mustGetenv("DB_PORT")       // e.g. '5432'
		dbName    = mustGetenv("DB_NAME")       // e.g. 'my-database'
	)

	dbURI := fmt.Sprintf("host=%s user=%s password=%s port=%s database=%s",
		dbTCPHost, dbUser, dbPwd, dbPort, dbName)


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

	// ...

	return dbPool, nil
}

DO#

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

using Npgsql;
using System;

namespace CloudSql
{
    public class PostgreSqlTcp
    {
        public static NpgsqlConnectionStringBuilder NewPostgreSqlTCPConnectionString()
        {
            // Equivalent connection string:
            // "Uid=<DB_USER>;Pwd=<DB_PASS>;Host=<INSTANCE_HOST>;Database=<DB_NAME>;"
            var connectionString = new NpgsqlConnectionStringBuilder()
            {
                // Note: Saving credentials in environment variables is convenient, but not
                // secure - consider a more secure solution such as
                // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
                // keep secrets safe.
                Host = Environment.GetEnvironmentVariable("INSTANCE_HOST"),     // e.g. '127.0.0.1'
                // Set Host to 'cloudsql' when deploying to App Engine Flexible environment
                Username = Environment.GetEnvironmentVariable("DB_USER"), // e.g. 'my-db-user'
                Password = Environment.GetEnvironmentVariable("DB_PASS"), // e.g. 'my-db-password'
                Database = Environment.GetEnvironmentVariable("DB_NAME"), // e.g. 'my-database'

                // The Cloud SQL proxy provides encryption between the proxy and instance.
                SslMode = SslMode.Disable,
            };
            connectionString.Pooling = true;
            // Specify additional properties here.
            return connectionString;
        }
    }
}

Rubí

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

tcp: &tcp
  adapter: postgresql
  # Configure additional properties here.
  # Note: Saving credentials in environment variables is convenient, but not
  # secure - consider a more secure solution such as
  # Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
  # keep secrets safe.
  username: <%= ENV["DB_USER"] %>  # e.g. "my-database-user"
  password: <%= ENV["DB_PASS"] %> # e.g. "my-database-password"
  database: <%= ENV.fetch("DB_NAME") { "vote_development" } %>
  host: <%= ENV.fetch("INSTANCE_HOST") { "127.0.0.1" }%> # '172.17.0.1' if deployed to GAE Flex
  port: <%= ENV.fetch("DB_PORT") { 5432 }%>

PHP

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

namespace Google\Cloud\Samples\CloudSQL\Postgres;

use PDO;
use PDOException;
use RuntimeException;
use TypeError;

class DatabaseTcp
{
    public static function initTcpDatabaseConnection(): PDO
    {
        try {
            // Note: Saving credentials in environment variables is convenient, but not
            // secure - consider a more secure solution such as
            // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
            // keep secrets safe.
            $username = getenv('DB_USER'); // e.g. 'your_db_user'
            $password = getenv('DB_PASS'); // e.g. 'your_db_password'
            $dbName = getenv('DB_NAME'); // e.g. 'your_db_name'
            $instanceHost = getenv('INSTANCE_HOST'); // e.g. '127.0.0.1' ('172.17.0.1' for GAE Flex)

            // Connect using TCP
            $dsn = sprintf('pgsql:dbname=%s;host=%s', $dbName, $instanceHost);

            // Connect to the database
            $conn = new PDO(
                $dsn,
                $username,
                $password,
                # ...
            );
        } catch (TypeError $e) {
            throw new RuntimeException(
                sprintf(
                    'Invalid or missing configuration! Make sure you have set ' .
                        '$username, $password, $dbName, and $instanceHost (for TCP mode). ' .
                        'The PHP error was %s',
                    $e->getMessage()
                ),
                $e->getCode(),
                $e
            );
        } catch (PDOException $e) {
            throw new RuntimeException(
                sprintf(
                    'Could not connect to the Cloud SQL Database. Check that ' .
                        'your username and password are correct, that the Cloud SQL ' .
                        'proxy is running, and that the database exists and is ready ' .
                        'for use. For more assistance, refer to %s. The PDO error was %s',
                    'https://cloud.google.com/sql/docs/postgres/connect-external-app',
                    $e->getMessage()
                ),
                $e->getCode(),
                $e
            );
        }

        return $conn;
    }
}

Mejores prácticas y otra información

Puedes usar el proxy de autenticación de Cloud SQL al probar tu aplicación localmente. Consulta la guía de inicio rápido para usar el proxy de autenticación de Cloud SQL para obtener instrucciones detalladas.

También puedes probar usando el proxy Cloud SQL a través de un contenedor Docker .

Grupos de conexiones

Las conexiones a las bases de datos subyacentes pueden interrumpirse, ya sea por el propio servidor de bases de datos o por la infraestructura de la plataforma. Recomendamos usar una biblioteca de cliente compatible con grupos de conexiones que reconectan automáticamente las conexiones de cliente interrumpidas. Para obtener ejemplos más detallados sobre cómo usar los grupos de conexiones, consulte la página "Administrar conexiones de bases de datos" .

Límites de conexión

Las ediciones MySQL y PostgreSQL de Cloud SQL imponen un límite máximo de conexiones simultáneas, y estos límites pueden variar según el motor de base de datos elegido (consulte la página Cuotas y límites de Cloud SQL ).

Las instancias de contenedor de Cloud Run tienen un límite de 100 conexiones a una base de datos de Cloud SQL. Cada instancia de un servicio o trabajo de Cloud Run puede tener 100 conexiones a la base de datos y, a medida que este servicio o trabajo escala, el número total de conexiones por implementación puede aumentar.

Puede limitar el número máximo de conexiones por instancia mediante un grupo de conexiones. Para obtener ejemplos más detallados sobre cómo limitar el número de conexiones, consulte la página "Administrar conexiones de base de datos" .

Límites de cuota de API

Cloud Run proporciona un mecanismo que se conecta mediante el proxy de autenticación de Cloud SQL, que utiliza la API de administración de Cloud SQL. Se aplican límites de cuota de API al proxy de autenticación de Cloud SQL. La cuota de la API de administración de Cloud SQL utilizada es aproximadamente el doble de la cantidad de instancias de Cloud SQL configuradas por la cantidad de instancias de Cloud Run de un servicio específico implementadas simultáneamente. Puede limitar o aumentar la cantidad de instancias de Cloud Run para modificar la cuota de API esperada.

¿Qué sigue?