Conecte-se do Cloud Run,Conecte-se do Cloud Run,Conecte-se do Cloud Run,Conecte-se do Cloud Run

Esta página contém informações e exemplos para conectar-se a uma instância do Cloud SQL a partir de um serviço em execução no Cloud Run.

Para obter instruções passo a passo sobre como executar um aplicativo Web de exemplo do Cloud Run conectado ao Cloud SQL, consulte o início rápido para conexão do Cloud Run .

O Cloud SQL é um serviço de banco de dados totalmente gerenciado que ajuda você a configurar, manter, gerenciar e administrar seus bancos de dados relacionais na nuvem.

O Cloud Run é uma plataforma de computação gerenciada que permite executar contêineres diretamente sobre Google Cloud infraestrutura.

Configurar uma instância do Cloud SQL

  1. Habilite a API de administração do Cloud SQL no Google Cloud projeto do qual você está se conectando, caso ainda não tenha feito isso:

    Enable the API

  2. Crie uma instância do Cloud SQL para PostgreSQL . Recomendamos que você escolha um local de instância do Cloud SQL na mesma região do seu serviço Cloud Run para obter melhor latência, evitar custos de rede e reduzir os riscos de falhas entre regiões.

    Por padrão, o Cloud SQL atribui um endereço IP público a uma nova instância. Você também tem a opção de atribuir um endereço IP privado. Para obter mais informações sobre as opções de conectividade para ambos, consulte a página "Visão geral da conexão" .

Configurar o Cloud Run

As etapas para configurar o Cloud Run dependem do tipo de endereço IP atribuído à sua instância do Cloud SQL. Se você rotear todo o tráfego de saída por meio da saída direta da VPC ou de um conector de acesso VPC sem servidor, use um endereço IP privado. Compare os dois métodos de saída de rede .

IP público (padrão)

  • Certifique-se de que a instância tenha um endereço IP público. Você pode verificar isso na página Visão geral da sua instância no Google Cloud console . Se precisar adicionar um, consulte a página Configurando IP público para obter instruções.
  • Obtenha o INSTANCE_CONNECTION_NAME para sua instância. Você pode encontrar esse valor na página Visão Geral da sua instância no Google Cloud console ou executando o seguinte comando gcloud sql instances describe :
    gcloud sql instances describe INSTANCE_NAME
       
    Substitua INSTANCE_NAME pelo nome da sua instância do Cloud SQL.
  • Obtenha o CLOUD_RUN_SERVICE_ACCOUNT_NAME para o seu serviço Cloud Run. Você pode encontrar esse valor na página do IAM do projeto que hospeda o serviço Cloud Run no Google Cloud console ou executando o seguinte comando gcloud run services describe no projeto que hospeda o serviço Cloud Run:
    gcloud run services describe CLOUD_RUN_SERVICE_NAME
    --region CLOUD_RUN_SERVICE_REGION --format="value(spec.template.spec.serviceAccountName)"
       
    Substitua as seguintes variáveis:
    • CLOUD_RUN_SERVICE_NAME : o nome do seu serviço Cloud Run
    • CLOUD_RUN_SERVICE_REGION : a região do seu serviço Cloud Run
  • Configure a conta de serviço para o seu serviço Cloud Run. Para se conectar ao Cloud SQL, certifique-se de que a conta de serviço tenha a função IAM Cloud SQL Client .
  • Se você estiver adicionando uma conexão do Cloud SQL a um novo serviço, precisará conteinerizá-lo e enviá-lo ao Container Registry ou ao Artifact Registry. Se ainda não tiver uma conexão, consulte estas instruções sobre como criar e implantar uma imagem de contêiner.

Como qualquer alteração de configuração, definir uma nova configuração para a conexão do Cloud SQL leva à criação de uma nova revisão do Cloud Run. Revisões subsequentes também receberão automaticamente essa conexão do Cloud SQL, a menos que você faça atualizações explícitas para alterá-la.

Console

  1. Ir para Cloud Run

  2. Comece a configurar o serviço. Para adicionar conexões do Cloud SQL a um serviço existente, faça o seguinte:

    1. Na lista Serviços , clique no nome do serviço desejado.
    2. Clique em Editar e implantar nova revisão .
  3. Habilite a conexão a uma instância do Cloud SQL:
    1. Clique em Contêiner(es) e depois em Configurações .
    2. Role até Conexões do Cloud SQL .
    3. Clique em Adicionar conexão .
    4. Clique em Habilitar o botão Cloud SQL Admin se você ainda não habilitou a API Cloud SQL Admin.

    Adicionar uma conexão com o Cloud SQL

    • Se você estiver adicionando uma conexão a uma instância do Cloud SQL no seu projeto, selecione a instância do Cloud SQL desejada no menu.
    • Se você estiver usando uma instância do Cloud SQL de outro projeto, selecione a string de conexão personalizada no menu e insira o nome completo da conexão da instância no formato PROJECT-ID:REGION:INSTANCE-ID .
    • Para excluir uma conexão , mantenha o cursor à direita da conexão para exibir o ícone Excluir clique nele.
  4. Clique em Criar ou Implantar .

Linha de comando

Antes de usar qualquer um dos seguintes comandos, faça as seguintes substituições:

  • IMAGE com a imagem que você está implantando
  • SERVICE_NAME com o nome do seu serviço Cloud Run
  • INSTANCE_CONNECTION_NAME pelo nome da conexão da sua instância do Cloud SQL ou uma lista de nomes de conexão delimitada por vírgulas.

    Se você estiver implantando um novo contêiner, use o seguinte comando:

    gcloud run deploy \
      --image=IMAGE \
      --add-cloudsql-instances=INSTANCE_CONNECTION_NAME
    Se você estiver atualizando um serviço existente, use o seguinte comando:
    gcloud run services update SERVICE_NAME \
      --add-cloudsql-instances=INSTANCE_CONNECTION_NAME

Terraform

O código a seguir cria um contêiner base do Cloud Run, com uma instância do 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 as alterações digitando terraform apply .
  2. Verifique as alterações verificando o serviço Cloud Run , clicando na guia Revisões e, em seguida, na guia Conexões .

IP privado

Se a conta de serviço de autorização pertencer a um projeto diferente daquele que contém a instância do Cloud SQL, faça o seguinte:

  • Em ambos os projetos, ative a API de administração do Cloud SQL.
  • Para a conta de serviço no projeto que contém a instância do Cloud SQL, adicione as permissões do IAM .
Saídas e conectores diretos de VPC usam endereços IP privados para gerenciar a comunicação com sua rede VPC. Para se conectar diretamente com endereços IP privados usando um desses métodos de saída, faça o seguinte:
  1. Certifique-se de que a instância do Cloud SQL criada anteriormente tenha um endereço IP privado. Para adicionar um endereço IP interno, consulte Configurar IP privado .
  2. Configure seu método de saída para se conectar à mesma rede VPC que sua instância do Cloud SQL. Observe as seguintes condições:
    • A saída direta de VPC e o acesso VPC sem servidor oferecem suporte à comunicação com redes VPC conectadas usando Cloud VPN e VPC Network Peering .
    • A saída direta de VPC e o acesso VPC sem servidor não oferecem suporte a redes legadas .
    • A menos que você esteja usando uma VPC compartilhada , um conector deve compartilhar o mesmo projeto e região que o recurso que o utiliza, embora o conector possa enviar tráfego para recursos em regiões diferentes.
  3. Conecte-se usando o endereço IP privado da sua instância e a porta 5432 .

Conectar ao Cloud SQL

Depois de configurar o Cloud Run, você pode se conectar à sua instância do Cloud SQL.

IP público (padrão)

Para caminhos de IP públicos, o Cloud Run fornece criptografia e se conecta usando o Cloud SQL Auth Proxy de duas maneiras:

Usar o Gerenciador Secreto

O Google recomenda que você use o Gerenciador de Segredos para armazenar informações confidenciais, como credenciais SQL. Você pode passar segredos como variáveis ​​de ambiente ou montá-los como um volume com o Cloud Run.

Depois de criar um segredo no Secret Manager, atualize um serviço existente com o seguinte comando:

Linha de comando

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

Terraform

O seguinte cria recursos secretos para armazenar com segurança os valores de usuário, senha e nome do banco de dados usando google_secret_manager_secret e google_secret_manager_secret_version . Observe que você deve atualizar a conta de serviço de computação do projeto para ter acesso a cada segredo.


# 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
}

Atualize o recurso principal do Cloud Run para incluir os novos segredos.

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 as alterações digitando terraform apply .

O comando de exemplo usa a versão secreta, latest ; no entanto, o Google recomenda fixar o segredo em uma versão específica, SECRET_NAME:v1 .

IP privado

Para caminhos IP privados, seu aplicativo se conecta diretamente à sua instância por meio de uma rede VPC. Este método usa TCP para se conectar diretamente à instância do Cloud SQL sem usar o Proxy de Autenticação do Cloud SQL.

Conecte-se com TCP

Conecte-se usando o endereço IP privado da sua instância do Cloud SQL como host e a porta 5432 .

Pitão

Para ver este snippet no contexto de um aplicativo web, veja o README no 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 snippet no contexto de um aplicativo web, veja o README no GitHub .

Observação:

  • CLOUD_SQL_CONNECTION_NAME deve ser representado como <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
  • Usar o argumento ipTypes=PRIVATE forçará o SocketFactory a se conectar com o IP privado associado de uma instância
  • Veja os requisitos de versão do factory de soquete JDBC para o arquivo pom.xml aqui .


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 snippet no contexto de um aplicativo web, veja o README no 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 snippet no contexto de um aplicativo web, veja o README no 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
}

C#

Para ver este snippet no contexto de um aplicativo web, veja o README no 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;
        }
    }
}

Rubi

Para ver este snippet no contexto de um aplicativo web, veja o README no 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 snippet no contexto de um aplicativo web, veja o README no 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;
    }
}

Melhores práticas e outras informações

Você pode usar o Cloud SQL Auth Proxy ao testar seu aplicativo localmente. Consulte o guia de início rápido sobre como usar o Cloud SQL Auth Proxy para obter instruções detalhadas.

Você também pode testar usando o Cloud SQL Proxy por meio de um contêiner do Docker .

Pools de conexão

As conexões com os bancos de dados subjacentes podem ser interrompidas, seja pelo próprio servidor de banco de dados ou pela infraestrutura da plataforma. Recomendamos o uso de uma biblioteca cliente que suporte pools de conexão que reconectam automaticamente as conexões de cliente interrompidas. Para obter exemplos mais detalhados sobre como usar pools de conexão, consulte a página Gerenciando conexões de banco de dados .

Limites de conexão

As edições MySQL e PostgreSQL do Cloud SQL impõem um limite máximo de conexões simultâneas, e esses limites podem variar dependendo do mecanismo de banco de dados escolhido (consulte a página Cotas e limites do Cloud SQL ).

As instâncias de contêiner do Cloud Run são limitadas a 100 conexões com um banco de dados Cloud SQL. Cada instância de um serviço ou tarefa do Cloud Run pode ter 100 conexões com o banco de dados e, à medida que esse serviço ou tarefa é escalonado, o número total de conexões por implantação pode aumentar.

Você pode limitar o número máximo de conexões usadas por instância usando um pool de conexões. Para obter exemplos mais detalhados sobre como limitar o número de conexões, consulte a página Gerenciando conexões de banco de dados .

Limites de cota da API

O Cloud Run fornece um mecanismo de conexão usando o Proxy de Autenticação do Cloud SQL, que utiliza a API de Administração do Cloud SQL. Os limites de cota da API se aplicam ao Proxy de Autenticação do Cloud SQL. A cota da API de Administração do Cloud SQL usada é aproximadamente duas vezes o número de instâncias do Cloud SQL configuradas pelo número de instâncias do Cloud Run de um serviço específico implantado simultaneamente. Você pode limitar ou aumentar o número de instâncias do Cloud Run para modificar a cota esperada da API consumida.

O que vem a seguir