Conectar do ambiente flexível do App Engine, Conectar do ambiente flexível do App Engine, Conectar do ambiente flexível do App Engine, Conectar do ambiente flexível do App Engine

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 ambiente flexível do App Engine.

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 App Engine é uma plataforma totalmente gerenciada e sem servidor para desenvolver e hospedar aplicativos web em escala. Você pode escolher entre diversas linguagens, bibliotecas e frameworks populares para desenvolver seus aplicativos e deixar que o App Engine se encarregue do provisionamento de servidores e do escalonamento das instâncias do seu aplicativo conforme a demanda.

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 ambiente flexível do App Engine

As etapas para configurar o ambiente flexível do App Engine dependem do tipo de endereço IP que você atribuiu à sua instância do Cloud SQL.

IP público (padrão)

Para configurar o ambiente flexível do App Engine para permitir conexões com uma instância do Cloud SQL:

  1. 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.
  2. 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.
  3. Certifique-se de que a conta de serviço que seu aplicativo está usando para autenticar chamadas para o Cloud SQL tenha a função IAM Cloud SQL Client .

    Para obter instruções detalhadas sobre como adicionar funções do IAM a uma conta de serviço, consulte Concessão de funções a contas de serviço .

Por padrão, seu aplicativo autorizará suas conexões usando a conta de serviço do ambiente flexível do App Engine . A conta de serviço está no formato PROJECT_ID @appspot.gserviceaccount.com .

Se a conta de serviço de autorização pertencer a um projeto diferente da instância do Cloud SQL, as permissões de API de administração e IAM do Cloud SQL precisarão ser adicionadas para ambos os projetos.

  • Atualize o arquivo app.yaml do seu projeto com a opção que melhor funciona. Você pode usar uma lista de instâncias separadas por vírgulas para especificar várias opções de uma só vez.

    Habilitando um soquete de domínio Unix

    Para habilitar um soquete de domínio Unix, adicione um dos seguintes ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:

    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME,INSTANCE_CONNECTION_NAME_2,...

    Habilitando uma porta TCP

    Para habilitar uma porta TCP local, adicione um dos seguintes itens ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME=tcp:PORT
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME_1=tcp:PORT_1,INSTANCE_CONNECTION_NAME_2=tcp:PORT_2,...
  • IP privado

    Para se conectar à sua instância do Cloud SQL por meio de um IP privado, a implantação do ambiente flexível do App Engine deve estar na mesma rede VPC que a sua instância do Cloud SQL. Consulte a documentação de configuração em Configurações de Rede para obter instruções sobre como especificar uma rede VPC para sua implantação.

    Uma vez implantado, seu aplicativo poderá se conectar diretamente usando o endereço IP privado da sua instância e a porta 5432 .

    Conectar ao Cloud SQL

    Depois de configurar o ambiente flexível do App Engine, você pode se conectar à sua instância do Cloud SQL.

    IP público (padrão)

    Para caminhos de IP públicos, o ambiente flexível do App Engine fornece criptografia e se conecta usando o Cloud SQL Auth Proxy de três maneiras:

    IP privado

    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.

    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 subjacente. Para atenuar esse problema, recomendamos o uso de uma biblioteca cliente compatível com pools de conexões e reconexão automática.

    Limites de conexão

    Cada instância do App Engine em execução em um ambiente padrão não pode ter mais de 100 conexões simultâneas com uma instância. Para aplicativos PHP 5.5, o limite é de 60 conexões simultâneas . Esse limite se aplica por instância do aplicativo. Isso significa que cada instância do aplicativo App Engine pode ter essa quantidade de conexões com o banco de dados e, à medida que ele é escalonado, o número total de conexões por implantação pode aumentar. Para obter mais informações, consulte Elementos de escalonamento .

    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 .

    Os aplicativos do App Engine estão sujeitos a limites de tempo de solicitação, dependendo do uso e do ambiente. Para obter mais informações, veja como as instâncias são gerenciadas nos ambientes padrão e flexível do App Engine.

    Limites de cota da API

    O App Engine fornece um mecanismo de conexão usando o Cloud SQL Auth Proxy, que utiliza a Cloud SQL Admin API. Os limites de cota da API se aplicam ao Cloud SQL Auth Proxy. Quando a Cloud SQL Admin API é iniciada, ela usa uma cota de dois usuários e uma média de dois usuários por hora posteriormente. A cota padrão é de 180 usuários por minuto por usuário. Os aplicativos do App Engine também estão sujeitos a cotas e limites adicionais, conforme discutido na página Cotas do App Engine .

    ,

    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 ambiente flexível do App Engine.

    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 App Engine é uma plataforma totalmente gerenciada e sem servidor para desenvolver e hospedar aplicativos web em escala. Você pode escolher entre diversas linguagens, bibliotecas e frameworks populares para desenvolver seus aplicativos e deixar que o App Engine se encarregue do provisionamento de servidores e do escalonamento das instâncias do seu aplicativo conforme a demanda.

    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 ambiente flexível do App Engine

    As etapas para configurar o ambiente flexível do App Engine dependem do tipo de endereço IP que você atribuiu à sua instância do Cloud SQL.

    IP público (padrão)

    Para configurar o ambiente flexível do App Engine para permitir conexões com uma instância do Cloud SQL:

    1. 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.
    2. 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.
    3. Certifique-se de que a conta de serviço que seu aplicativo está usando para autenticar chamadas para o Cloud SQL tenha a função IAM Cloud SQL Client .

      Para obter instruções detalhadas sobre como adicionar funções do IAM a uma conta de serviço, consulte Concessão de funções a contas de serviço .

    Por padrão, seu aplicativo autorizará suas conexões usando a conta de serviço do ambiente flexível do App Engine . A conta de serviço está no formato PROJECT_ID @appspot.gserviceaccount.com .

    Se a conta de serviço de autorização pertencer a um projeto diferente da instância do Cloud SQL, as permissões de API de administração e IAM do Cloud SQL precisarão ser adicionadas para ambos os projetos.

  • Atualize o arquivo app.yaml do seu projeto com a opção que melhor funciona. Você pode usar uma lista de instâncias separadas por vírgulas para especificar várias opções de uma só vez.

    Habilitando um soquete de domínio Unix

    Para habilitar um soquete de domínio Unix, adicione um dos seguintes ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:

    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME,INSTANCE_CONNECTION_NAME_2,...

    Habilitando uma porta TCP

    Para habilitar uma porta TCP local, adicione um dos seguintes itens ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME=tcp:PORT
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME_1=tcp:PORT_1,INSTANCE_CONNECTION_NAME_2=tcp:PORT_2,...
  • IP privado

    Para se conectar à sua instância do Cloud SQL por meio de um IP privado, a implantação do ambiente flexível do App Engine deve estar na mesma rede VPC que a sua instância do Cloud SQL. Consulte a documentação de configuração em Configurações de Rede para obter instruções sobre como especificar uma rede VPC para sua implantação.

    Uma vez implantado, seu aplicativo poderá se conectar diretamente usando o endereço IP privado da sua instância e a porta 5432 .

    Conectar ao Cloud SQL

    Depois de configurar o ambiente flexível do App Engine, você pode se conectar à sua instância do Cloud SQL.

    IP público (padrão)

    Para caminhos de IP públicos, o ambiente flexível do App Engine fornece criptografia e se conecta usando o Cloud SQL Auth Proxy de três maneiras:

    IP privado

    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.

    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 subjacente. Para atenuar esse problema, recomendamos o uso de uma biblioteca cliente compatível com pools de conexões e reconexão automática.

    Limites de conexão

    Cada instância do App Engine em execução em um ambiente padrão não pode ter mais de 100 conexões simultâneas com uma instância. Para aplicativos PHP 5.5, o limite é de 60 conexões simultâneas . Esse limite se aplica por instância do aplicativo. Isso significa que cada instância do aplicativo App Engine pode ter essa quantidade de conexões com o banco de dados e, à medida que ele é escalonado, o número total de conexões por implantação pode aumentar. Para obter mais informações, consulte Elementos de escalonamento .

    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 .

    Os aplicativos do App Engine estão sujeitos a limites de tempo de solicitação, dependendo do uso e do ambiente. Para obter mais informações, veja como as instâncias são gerenciadas nos ambientes padrão e flexível do App Engine.

    Limites de cota da API

    O App Engine fornece um mecanismo de conexão usando o Cloud SQL Auth Proxy, que utiliza a Cloud SQL Admin API. Os limites de cota da API se aplicam ao Cloud SQL Auth Proxy. Quando a Cloud SQL Admin API é iniciada, ela usa uma cota de dois usuários e uma média de dois usuários por hora posteriormente. A cota padrão é de 180 usuários por minuto por usuário. Os aplicativos do App Engine também estão sujeitos a cotas e limites adicionais, conforme discutido na página Cotas do App Engine .

    ,

    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 ambiente flexível do App Engine.

    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 App Engine é uma plataforma totalmente gerenciada e sem servidor para desenvolver e hospedar aplicativos web em escala. Você pode escolher entre diversas linguagens, bibliotecas e frameworks populares para desenvolver seus aplicativos e deixar que o App Engine se encarregue do provisionamento de servidores e do escalonamento das instâncias do seu aplicativo conforme a demanda.

    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 ambiente flexível do App Engine

    As etapas para configurar o ambiente flexível do App Engine dependem do tipo de endereço IP que você atribuiu à sua instância do Cloud SQL.

    IP público (padrão)

    Para configurar o ambiente flexível do App Engine para permitir conexões com uma instância do Cloud SQL:

    1. 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.
    2. 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.
    3. Certifique-se de que a conta de serviço que seu aplicativo está usando para autenticar chamadas para o Cloud SQL tenha a função IAM Cloud SQL Client .

      Para obter instruções detalhadas sobre como adicionar funções do IAM a uma conta de serviço, consulte Concessão de funções a contas de serviço .

    Por padrão, seu aplicativo autorizará suas conexões usando a conta de serviço do ambiente flexível do App Engine . A conta de serviço está no formato PROJECT_ID @appspot.gserviceaccount.com .

    Se a conta de serviço de autorização pertencer a um projeto diferente da instância do Cloud SQL, as permissões de API de administração e IAM do Cloud SQL precisarão ser adicionadas para ambos os projetos.

  • Atualize o arquivo app.yaml do seu projeto com a opção que melhor funciona. Você pode usar uma lista de instâncias separadas por vírgulas para especificar várias opções de uma só vez.

    Habilitando um soquete de domínio Unix

    Para habilitar um soquete de domínio Unix, adicione um dos seguintes ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:

    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME,INSTANCE_CONNECTION_NAME_2,...

    Habilitando uma porta TCP

    Para habilitar uma porta TCP local, adicione um dos seguintes itens ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME=tcp:PORT
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME_1=tcp:PORT_1,INSTANCE_CONNECTION_NAME_2=tcp:PORT_2,...
  • IP privado

    Para se conectar à sua instância do Cloud SQL por meio de um IP privado, a implantação do ambiente flexível do App Engine deve estar na mesma rede VPC que a sua instância do Cloud SQL. Consulte a documentação de configuração em Configurações de Rede para obter instruções sobre como especificar uma rede VPC para sua implantação.

    Uma vez implantado, seu aplicativo poderá se conectar diretamente usando o endereço IP privado da sua instância e a porta 5432 .

    Conectar ao Cloud SQL

    Depois de configurar o ambiente flexível do App Engine, você pode se conectar à sua instância do Cloud SQL.

    IP público (padrão)

    Para caminhos de IP públicos, o ambiente flexível do App Engine fornece criptografia e se conecta usando o Cloud SQL Auth Proxy de três maneiras:

    IP privado

    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.

    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 subjacente. Para atenuar esse problema, recomendamos o uso de uma biblioteca cliente compatível com pools de conexões e reconexão automática.

    Limites de conexão

    Cada instância do App Engine em execução em um ambiente padrão não pode ter mais de 100 conexões simultâneas com uma instância. Para aplicativos PHP 5.5, o limite é de 60 conexões simultâneas . Esse limite se aplica por instância do aplicativo. Isso significa que cada instância do aplicativo App Engine pode ter essa quantidade de conexões com o banco de dados e, à medida que ele é escalonado, o número total de conexões por implantação pode aumentar. Para obter mais informações, consulte Elementos de escalonamento .

    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 .

    Os aplicativos do App Engine estão sujeitos a limites de tempo de solicitação, dependendo do uso e do ambiente. Para obter mais informações, veja como as instâncias são gerenciadas nos ambientes padrão e flexível do App Engine.

    Limites de cota da API

    O App Engine fornece um mecanismo de conexão usando o Cloud SQL Auth Proxy, que utiliza a Cloud SQL Admin API. Os limites de cota da API se aplicam ao Cloud SQL Auth Proxy. Quando a Cloud SQL Admin API é iniciada, ela usa uma cota de dois usuários e uma média de dois usuários por hora posteriormente. A cota padrão é de 180 usuários por minuto por usuário. Os aplicativos do App Engine também estão sujeitos a cotas e limites adicionais, conforme discutido na página Cotas do App Engine .

    ,

    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 ambiente flexível do App Engine.

    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 App Engine é uma plataforma totalmente gerenciada e sem servidor para desenvolver e hospedar aplicativos web em escala. Você pode escolher entre diversas linguagens, bibliotecas e frameworks populares para desenvolver seus aplicativos e deixar que o App Engine se encarregue do provisionamento de servidores e do escalonamento das instâncias do seu aplicativo conforme a demanda.

    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 ambiente flexível do App Engine

    As etapas para configurar o ambiente flexível do App Engine dependem do tipo de endereço IP que você atribuiu à sua instância do Cloud SQL.

    IP público (padrão)

    Para configurar o ambiente flexível do App Engine para permitir conexões com uma instância do Cloud SQL:

    1. 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.
    2. 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.
    3. Certifique-se de que a conta de serviço que seu aplicativo está usando para autenticar chamadas para o Cloud SQL tenha a função IAM Cloud SQL Client .

      Para obter instruções detalhadas sobre como adicionar funções do IAM a uma conta de serviço, consulte Concessão de funções a contas de serviço .

    Por padrão, seu aplicativo autorizará suas conexões usando a conta de serviço do ambiente flexível do App Engine . A conta de serviço está no formato PROJECT_ID @appspot.gserviceaccount.com .

    Se a conta de serviço de autorização pertencer a um projeto diferente da instância do Cloud SQL, as permissões de API de administração e IAM do Cloud SQL precisarão ser adicionadas para ambos os projetos.

  • Atualize o arquivo app.yaml do seu projeto com a opção que melhor funciona. Você pode usar uma lista de instâncias separadas por vírgulas para especificar várias opções de uma só vez.

    Habilitando um soquete de domínio Unix

    Para habilitar um soquete de domínio Unix, adicione um dos seguintes ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:

    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME,INSTANCE_CONNECTION_NAME_2,...

    Habilitando uma porta TCP

    Para habilitar uma porta TCP local, adicione um dos seguintes itens ao arquivo app.yaml do seu projeto, dependendo se você está se conectando a uma ou várias instâncias:
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME=tcp:PORT
    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME_1=tcp:PORT_1,INSTANCE_CONNECTION_NAME_2=tcp:PORT_2,...
  • IP privado

    Para se conectar à sua instância do Cloud SQL por meio de um IP privado, a implantação do ambiente flexível do App Engine deve estar na mesma rede VPC que a sua instância do Cloud SQL. Consulte a documentação de configuração em Configurações de Rede para obter instruções sobre como especificar uma rede VPC para sua implantação.

    Uma vez implantado, seu aplicativo poderá se conectar diretamente usando o endereço IP privado da sua instância e a porta 5432 .

    Conectar ao Cloud SQL

    Depois de configurar o ambiente flexível do App Engine, você pode se conectar à sua instância do Cloud SQL.

    IP público (padrão)

    Para caminhos de IP públicos, o ambiente flexível do App Engine fornece criptografia e se conecta usando o Cloud SQL Auth Proxy de três maneiras:

    IP privado

    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.

    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 subjacente. Para atenuar esse problema, recomendamos o uso de uma biblioteca cliente compatível com pools de conexões e reconexão automática.

    Limites de conexão

    Cada instância do App Engine em execução em um ambiente padrão não pode ter mais de 100 conexões simultâneas com uma instância. Para aplicativos PHP 5.5, o limite é de 60 conexões simultâneas . Esse limite se aplica por instância do aplicativo. Isso significa que cada instância do aplicativo App Engine pode ter essa quantidade de conexões com o banco de dados e, à medida que ele é escalonado, o número total de conexões por implantação pode aumentar. Para obter mais informações, consulte Elementos de escalonamento .

    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 .

    Os aplicativos do App Engine estão sujeitos a limites de tempo de solicitação, dependendo do uso e do ambiente. Para obter mais informações, veja como as instâncias são gerenciadas nos ambientes padrão e flexível do App Engine.

    Limites de cota da API

    O App Engine fornece um mecanismo de conexão usando o Cloud SQL Auth Proxy, que utiliza a Cloud SQL Admin API. Os limites de cota da API se aplicam ao Cloud SQL Auth Proxy. Quando a Cloud SQL Admin API é iniciada, ela usa uma cota de dois usuários e uma média de dois usuários por hora posteriormente. A cota padrão é de 180 usuários por minuto por usuário. Os aplicativos do App Engine também estão sujeitos a cotas e limites adicionais, conforme discutido na página Cotas do App Engine .