Connect from Cloud Run functions  |  Cloud SQL for MySQL  |  Google Cloud (2024)

Stay organized with collections Save and categorize content based on your preferences.

This page contains information and examples for connecting to aCloud SQL instance from a service running in Cloud Run functions.

For step-by-step instructions on running a Cloud Run functions sample web application connected to Cloud SQL, see the quickstart for connecting from Cloud Run functions.

Cloud SQL is a fully-managed database service that helps you set up, maintain, manage, and administer your relational databases in the cloud.

Cloud Run functions is a lightweight compute solution for developers to create single-purpose, standalone functions that respond to Cloud events without the need to manage a server or runtime environment.

Set up a Cloud SQL instance

  1. Enable the Cloud SQL Admin API in the Google Cloud project that you are connecting from, if you haven't already done so:

    Enable the API

  2. Create a Cloud SQL for MySQL instance. We recommend that you choose a Cloud SQL instance location in the same region as your Cloud Run service for better latency, to avoid some networking costs, and to reduce cross region failure risks.

    By default, Cloud SQL assigns a public IP address to a new instance. You also have the option to assign a private IP address. For more information about the connectivity options for both, see the Connecting Overview page.

Configure Cloud Run functions

The steps to configure Cloud Run functions depend on the type ofIP address that you assigned to your Cloud SQL instance.

Public IP (default)

To configure Cloud Run functions to enable connections to a Cloud SQLinstance:

  • Confirm that the instance created above has a public IP address. You can confirm this on the Overview page for the instance in the Google Cloud console. If you need to add a public IP address, see Configure public IP.
  • Get the instance's INSTANCE_CONNECTION_NAME. This value is available:
    • On the Overview page for the instance, in the Google Cloud console, or
    • By running the following command: gcloud sql instances describe [INSTANCE_NAME]
  • Configure the service account for your function. If the authorizing service account belongs to a different project from the Cloud SQL instance, enable the Cloud SQL Admin API, and add the IAM permissions listed below, on both projects. Confirm that the service account has the appropriate Cloud SQL roles and permissions to connect to Cloud SQL.
    • To connect to Cloud SQL, the service account needs one of the following IAM roles:
      • Cloud SQL Client (preferred)
      • Cloud SQL Editor
      • Cloud SQL Admin
      Or, you can manually assign the following IAM permissions:
      • cloudsql.instances.connect
      • cloudsql.instances.get
  • If you're using Cloud Run functions and not Cloud Run functions (1st gen), the following are required (also see Configure Cloud Run):
    1. Initially deploy your function.
      When you first begin creating a Cloud Run function in the Google Cloud console, the underlying Cloud Run service hasn't been created yet. You can't configure a Cloud SQL connection until that service is created (by deploying the Cloud Run function).
    2. In the Google Cloud console, in the upper right of the Function details page, under Powered by Cloud Run, click the link to access the underlying Cloud Run service.
    3. On the Cloud Run Service details page, select the Edit and deploy new revision tab.
    4. Follow the standard steps (as in the case of any configuration change) for setting a new configuration for a Cloud SQL connection.
      This creates a new Cloud Run revision, and subsequent revisions automatically receive this Cloud SQL connection, unless you explicitly change it.

Private IP

If the authorizing service account belongs to a different project than theone containing the Cloud SQL instance, do the following:

  • In both projects, enable the Cloud SQL Admin API.
  • For the service account in the project that contains the Cloud SQL instance, add the IAM permissions.
A Serverless VPC Access connector uses private IP addresses tohandle communication to your VPC network.To connect directly with private IP addresses, you must do the following:
  1. Make sure that the Cloud SQL instance created previously has a private IP address. If you need to add one, see Configure private IP for instructions.
  2. Create a Serverless VPC Access connector in the same VPC network as your Cloud SQL instance. Note the following conditions:
  • Unless you're using Shared VPC, your connector must be in the same project and region as the resource that uses it, but it can send traffic to resources in different regions.
  • Serverless VPC Access supports communication to VPC networks connected using Cloud VPN and VPC Network Peering.
  • Serverless VPC Access doesn't support legacy networks.
  • Configure Cloud Run functions to use the connector.
  • Connect using your instance's private IP address and port 3306.
  • Connect to Cloud SQL

    After you configure Cloud Run functions, you can connect to yourCloud SQL instance.

    Public IP (default)

    For public IP paths, Cloud Run functions provides encryption and connects using the Cloud SQL Auth Proxy in two ways:

    • Through Unix sockets
    • By using a Cloud SQL connector

    Connect with Unix sockets

    Once correctly configured, you can connect your service to your Cloud SQL instance's Unix domain socket accessed on the environment's filesystem at the following path: /cloudsql/INSTANCE_CONNECTION_NAME.

    The INSTANCE_CONNECTION_NAME uses the format project:region:instance-id. You can find it on the Overview page for your instance in the Google Cloud console or by running the following command:

    gcloud sql instances describe [INSTANCE_NAME]

    These connections are automatically encrypted without any additional configuration.

    The code samples shown below are extracts from more complete examples on the GitHub site. Click View on GitHub to see more.

    Python

    To see this snippet in the context of a web application, view the README on GitHub.

    import osimport sqlalchemydef connect_unix_socket() -> sqlalchemy.engine.base.Engine: """Initializes a Unix socket connection pool for a Cloud SQL instance of MySQL.""" # 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_user = os.environ["DB_USER"] # e.g. 'my-database-user' db_pass = os.environ["DB_PASS"] # e.g. 'my-database-password' db_name = os.environ["DB_NAME"] # e.g. 'my-database' unix_socket_path = os.environ[ "INSTANCE_UNIX_SOCKET" ] # e.g. '/cloudsql/project:region:instance' pool = sqlalchemy.create_engine( # Equivalent URL: # mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=<socket_path>/<cloud_sql_instance_name> sqlalchemy.engine.url.URL.create( drivername="mysql+pymysql", username=db_user, password=db_pass, database=db_name, query={"unix_socket": unix_socket_path}, ), # ... ) return pool

    Java

    To see this snippet in the context of a web application, view the README on GitHub.

    import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;public class ConnectorConnectionPoolFactory 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 INSTANCE_CONNECTION_NAME = System.getenv("INSTANCE_CONNECTION_NAME"); private static final String INSTANCE_UNIX_SOCKET = System.getenv("INSTANCE_UNIX_SOCKET"); 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"); 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:mysql:///<DB_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>& // socketFactory=com.google.cloud.sql.mysql.SocketFactory&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:mysql:///%s", DB_NAME)); config.setUsername(DB_USER); // e.g. "root", "mysql" config.setPassword(DB_PASS); // e.g. "my-password" config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory"); config.addDataSourceProperty("cloudSqlInstance", INSTANCE_CONNECTION_NAME); // Unix sockets are not natively supported in Java, so it is necessary to use the Cloud SQL // Java Connector to connect. When setting INSTANCE_UNIX_SOCKET, the connector will  // call an external package that will enable Unix socket connections. // Note: For Java users, the Cloud SQL Java Connector can provide authenticated connections // which is usually preferable to using the Cloud SQL Proxy with Unix sockets. // See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details. if (INSTANCE_UNIX_SOCKET != null) { config.addDataSourceProperty("unixSocketPath", INSTANCE_UNIX_SOCKET); } // ... Specify additional connection properties here. // ... // Initialize the connection pool using the configuration object. return new HikariDataSource(config); }}

    Node.js

    To see this snippet in the context of a web application, view the README on GitHub.

    const mysql = require('promise-mysql');// createUnixSocketPool initializes a Unix socket connection pool for// a Cloud SQL instance of MySQL.const createUnixSocketPool = 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. return mysql.createPool({ user: process.env.DB_USER, // e.g. 'my-db-user' password: process.env.DB_PASS, // e.g. 'my-db-password' database: process.env.DB_NAME, // e.g. 'my-database' socketPath: process.env.INSTANCE_UNIX_SOCKET, // e.g. '/cloudsql/project:region:instance' // Specify additional properties here. ...config, });};

    Go

    To see this snippet in the context of a web application, view the README on GitHub.

    package cloudsqlimport ("database/sql""fmt""log""os"_ "github.com/go-sql-driver/mysql")// connectUnixSocket initializes a Unix socket connection pool for// a Cloud SQL instance of MySQL.func connectUnixSocket() (*sql.DB, error) {mustGetenv := func(k string) string {v := os.Getenv(k)if v == "" {log.Fatalf("Fatal Error in connect_unix.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'dbName = mustGetenv("DB_NAME") // e.g. 'my-database'unixSocketPath = mustGetenv("INSTANCE_UNIX_SOCKET") // e.g. '/cloudsql/project:region:instance')dbURI := fmt.Sprintf("%s:%s@unix(%s)/%s?parseTime=true",dbUser, dbPwd, unixSocketPath, dbName)// dbPool is the pool of database connections.dbPool, err := sql.Open("mysql", dbURI)if err != nil {return nil, fmt.Errorf("sql.Open: %w", err)}// ...return dbPool, nil}

    PHP

    To see this snippet in the context of a web application, view the README on GitHub.

    namespace Google\Cloud\Samples\CloudSQL\MySQL;use PDO;use PDOException;use RuntimeException;use TypeError;class DatabaseUnix{ public static function initUnixDatabaseConnection(): 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' $instanceUnixSocket = getenv('INSTANCE_UNIX_SOCKET'); // e.g. '/cloudsql/project:region:instance' // Connect using UNIX sockets $dsn = sprintf( 'mysql:dbname=%s;unix_socket=%s', $dbName, $instanceUnixSocket ); // 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 $instanceUnixSocket (for UNIX socket mode). ' . 'The PHP error was %s', $e->getMessage() ), (int) $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/mysql/connect-external-app', $e->getMessage() ), (int) $e->getCode(), $e ); } return $conn; }}

    Connect with Cloud SQL connectors

    The Cloud SQL connectors are language specific libraries that provide encryption and IAM-based authorization when connecting to a Cloud SQL instance.

    Python

    To see this snippet in the context of a web application, view the README on GitHub.

    import osfrom google.cloud.sql.connector import Connector, IPTypesimport pymysqlimport sqlalchemydef connect_with_connector() -> sqlalchemy.engine.base.Engine: """ Initializes a connection pool for a Cloud SQL instance of MySQL. Uses the Cloud SQL Python Connector package. """ # 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. instance_connection_name = os.environ[ "INSTANCE_CONNECTION_NAME" ] # e.g. 'project:region:instance' 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' ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC connector = Connector(ip_type) def getconn() -> pymysql.connections.Connection: conn: pymysql.connections.Connection = connector.connect( instance_connection_name, "pymysql", user=db_user, password=db_pass, db=db_name, ) return conn pool = sqlalchemy.create_engine( "mysql+pymysql://", creator=getconn, # ... ) return pool

    Java

    To see this snippet in the context of a web application, view the README on GitHub.

    Note:

    • INSTANCE_CONNECTION_NAME should be represented as <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
    • See the JDBC socket factory version requirements for the pom.xml file here .
    import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;public class ConnectorConnectionPoolFactory 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 INSTANCE_CONNECTION_NAME = System.getenv("INSTANCE_CONNECTION_NAME"); private static final String INSTANCE_UNIX_SOCKET = System.getenv("INSTANCE_UNIX_SOCKET"); 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"); 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:mysql:///<DB_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>& // socketFactory=com.google.cloud.sql.mysql.SocketFactory&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:mysql:///%s", DB_NAME)); config.setUsername(DB_USER); // e.g. "root", "mysql" config.setPassword(DB_PASS); // e.g. "my-password" config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory"); config.addDataSourceProperty("cloudSqlInstance", INSTANCE_CONNECTION_NAME); // The ipTypes argument can be used to specify a comma delimited list of preferred IP types // for connecting to a Cloud SQL instance. The argument ipTypes=PRIVATE will force the // SocketFactory to connect with an instance's associated private IP. config.addDataSourceProperty("ipTypes", "PUBLIC,PRIVATE"); // ... Specify additional connection properties here. // ... // Initialize the connection pool using the configuration object. return new HikariDataSource(config); }}

    Go

    To see this snippet in the context of a web application, view the README on GitHub.

    package cloudsqlimport ("context""database/sql""fmt""log""net""os""cloud.google.com/go/cloudsqlconn""github.com/go-sql-driver/mysql")func connectWithConnector() (*sql.DB, error) {mustGetenv := func(k string) string {v := os.Getenv(k)if v == "" {log.Fatalf("Fatal Error in connect_connector.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 passwords and other secrets safe.var (dbUser = mustGetenv("DB_USER") // e.g. 'my-db-user'dbPwd = mustGetenv("DB_PASS") // e.g. 'my-db-password'dbName = mustGetenv("DB_NAME") // e.g. 'my-database'instanceConnectionName = mustGetenv("INSTANCE_CONNECTION_NAME") // e.g. 'project:region:instance'usePrivate = os.Getenv("PRIVATE_IP"))d, err := cloudsqlconn.NewDialer(context.Background())if err != nil {return nil, fmt.Errorf("cloudsqlconn.NewDialer: %w", err)}var opts []cloudsqlconn.DialOptionif usePrivate != "" {opts = append(opts, cloudsqlconn.WithPrivateIP())}mysql.RegisterDialContext("cloudsqlconn",func(ctx context.Context, addr string) (net.Conn, error) {return d.Dial(ctx, instanceConnectionName, opts...)})dbURI := fmt.Sprintf("%s:%s@cloudsqlconn(localhost:3306)/%s?parseTime=true",dbUser, dbPwd, dbName)dbPool, err := sql.Open("mysql", dbURI)if err != nil {return nil, fmt.Errorf("sql.Open: %w", err)}return dbPool, nil}

    Private IP

    For private IP paths, your application connects directly to yourinstance through a VPC network.This method uses TCP to connect directly to the Cloud SQLinstance without using the Cloud SQL Auth Proxy.

    Connect with TCP

    Connect using the private IP address of your Cloud SQL instance as the host and port 3306.

    Python

    To see this snippet in the context of a web application, view the README on GitHub.

    import osimport sqlalchemydef connect_tcp_socket() -> sqlalchemy.engine.base.Engine: """Initializes a TCP connection pool for a Cloud SQL instance of MySQL.""" # 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. 3306 pool = sqlalchemy.create_engine( # Equivalent URL: # mysql+pymysql://<db_user>:<db_pass>@<db_host>:<db_port>/<db_name> sqlalchemy.engine.url.URL.create( drivername="mysql+pymysql", username=db_user, password=db_pass, host=db_host, port=db_port, database=db_name, ), # ... ) return pool

    Java

    To see this snippet in the context of a web application, view the README on GitHub.

    Note:

    • INSTANCE_CONNECTION_NAME should be represented as <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
    • Using the argument ipTypes=PRIVATE will force the SocketFactory to connect with an instance's associated private IP
    • See the JDBC socket factory version requirements for the pom.xml file here .
    import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;public class TcpConnectionPoolFactory extends ConnectionPoolFactory { // Saving credentials in environment variables is convenient, but not secure - consider a more // secure solution such as 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:mysql://<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:mysql://%s:%s/%s", INSTANCE_HOST, DB_PORT, DB_NAME)); config.setUsername(DB_USER); // e.g. "root", "mysql" 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

    To see this snippet in the context of a web application, view the README on GitHub.

    const mysql = require('promise-mysql');const fs = require('fs');// createTcpPool initializes a TCP connection pool for a Cloud SQL// instance of MySQL.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 = { host: process.env.INSTANCE_HOST, // e.g. '127.0.0.1' port: process.env.DB_PORT, // e.g. '3306' user: process.env.DB_USER, // e.g. 'my-db-user' password: process.env.DB_PASS, // e.g. 'my-db-password' database: process.env.DB_NAME, // e.g. 'my-database' // ... Specify additional properties here. ...config, }; // Establish a connection to the database. return mysql.createPool(dbConfig);};

    Go

    To see this snippet in the context of a web application, view the README on GitHub.

    package cloudsqlimport ("crypto/tls""crypto/x509""database/sql""errors""fmt""io/ioutil""log""os""github.com/go-sql-driver/mysql")// connectTCPSocket initializes a TCP connection pool for a Cloud SQL// instance of MySQL.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'dbName = mustGetenv("DB_NAME") // e.g. 'my-database'dbPort = mustGetenv("DB_PORT") // e.g. '3306'dbTCPHost = mustGetenv("INSTANCE_HOST") // e.g. '127.0.0.1' ('172.17.0.1' if deployed to GAE Flex))dbURI := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true",dbUser, dbPwd, dbTCPHost, dbPort, dbName)// dbPool is the pool of database connections.dbPool, err := sql.Open("mysql", dbURI)if err != nil {return nil, fmt.Errorf("sql.Open: %w", err)}// ...return dbPool, nil}

    PHP

    To see this snippet in the context of a web application, view the README on GitHub.

    namespace Google\Cloud\Samples\CloudSQL\MySQL;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('mysql: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/mysql/connect-external-app', $e->getMessage() ), $e->getCode(), $e ); } return $conn; }}

    Best practices and other information

    You can use the Cloud SQL Auth Proxy when testingyour application locally. See thequickstart for using the Cloud SQL Auth Proxyfor detailed instructions.

    Connection Pools

    Connections to underlying databases may be dropped, either by the database server itself, or by the infrastructure underlying Cloud Run functions. We recommend using a client library that supports connection pools that automatically reconnect broken client connections.Additionally, we recommend using a globally scoped connection pool toincrease the likelihood that your function reuses the same connection forsubsequent invocations of the function, and closes the connection naturally whenthe instance is evicted (auto-scaled down).For more detailed examples on how to use connection pools, seeManaging database connections.

    Connection Limits

    Cloud SQL imposes a maximum limit on concurrent connections, and these limitsmay vary depending on the database engine chosen (seeCloud SQL Quotas and Limits).It's recommended to use a connection with Cloud Run functions, but it is importantto set the maximum number of connections to 1.

    Where possible, you should take care to only initialize a connection pool for functions that need access to your database. Some connection pools will create connections preemptively, which can consume excess resources and count towards your connection limits. For this reason, it's recommended to use Lazy Initialization to delay the creation of a connection pool until needed, and only include the connection pool in functions where it's used.

    For more detailed examples on how to limit the number of connections, seeManaging database connections.

    API Quota Limits

    Cloud Run functions provides a mechanism that connects using the Cloud SQL Auth Proxy,which uses the Cloud SQL Admin API.API quota limits apply to the Cloud SQL Auth Proxy. The Cloud SQL Admin API quotaused is approximately two times the number of Cloud SQL instancesconfigured times the total number of functions deployed. You canset thenumber of max concurrent invocations to modify the expected API quotaconsumed. Cloud Run functions also imposesrate limits on the numberof API calls allowed per 100 seconds.

    What's next

    Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

    Last updated 2024-09-10 UTC.

    Connect from Cloud Run functions  |  Cloud SQL for MySQL  |  Google Cloud (2024)
    Top Articles
    List of all fees, charges, and taxes on trading and investing
    What should you carry in your wallet? - Bankers Life Blog
    St Thomas Usvi Craigslist
    Lowe's Garden Fence Roll
    Average Jonas Wife
    Exclusive: Baby Alien Fan Bus Leaked - Get the Inside Scoop! - Nick Lachey
    30 Insanely Useful Websites You Probably Don't Know About
    360 Training Alcohol Final Exam Answers
    Bhad Bhabie Shares Footage Of Her Child's Father Beating Her Up, Wants Him To 'Get Help'
    Violent Night Showtimes Near Amc Fashion Valley 18
    Dark Souls 2 Soft Cap
    Strange World Showtimes Near Amc Braintree 10
    12 Best Craigslist Apps for Android and iOS (2024)
    Bernie Platt, former Cherry Hill mayor and funeral home magnate, has died at 90
    Identogo Brunswick Ga
    Uhcs Patient Wallet
    Tracking Your Shipments with Maher Terminal
    Bowlero (BOWL) Earnings Date and Reports 2024
    Playgirl Magazine Cover Template Free
    Byte Delta Dental
    Nashville Predators Wiki
    Tamilrockers Movies 2023 Download
    Vermont Craigs List
    Hennens Chattanooga Dress Code
    Happy Life 365, Kelly Weekers | 9789021569444 | Boeken | bol
    Ecampus Scps Login
    Gilchrist Verband - Lumedis - Ihre Schulterspezialisten
    Darrell Waltrip Off Road Center
    Radical Red Ability Pill
    Remnants of Filth: Yuwu (Novel) Vol. 4
    Possum Exam Fallout 76
    Ipcam Telegram Group
    Transformers Movie Wiki
    Baldur's Gate 3 Dislocated Shoulder
    Play 1v1 LOL 66 EZ → UNBLOCKED on 66games.io
    Barrage Enhancement Lost Ark
    20 Best Things to Do in Thousand Oaks, CA - Travel Lens
    Dadeclerk
    Final Jeopardy July 25 2023
    Ramsey County Recordease
    Wal-Mart 140 Supercenter Products
    'Guys, you're just gonna have to deal with it': Ja Rule on women dominating modern rap, the lyrics he's 'ashamed' of, Ashanti, and his long-awaited comeback
    Mcalister's Deli Warrington Reviews
    9:00 A.m. Cdt
    Stitch And Angel Tattoo Black And White
    Sherwin Source Intranet
    The Largest Banks - ​​How to Transfer Money With Only Card Number and CVV (2024)
    How to Do a Photoshoot in BitLife - Playbite
    Poster & 1600 Autocollants créatifs | Activité facile et ludique | Poppik Stickers
    North Park Produce Poway Weekly Ad
    683 Job Calls
    Latest Posts
    Article information

    Author: Jerrold Considine

    Last Updated:

    Views: 5997

    Rating: 4.8 / 5 (78 voted)

    Reviews: 93% of readers found this page helpful

    Author information

    Name: Jerrold Considine

    Birthday: 1993-11-03

    Address: Suite 447 3463 Marybelle Circles, New Marlin, AL 20765

    Phone: +5816749283868

    Job: Sales Executive

    Hobby: Air sports, Sand art, Electronics, LARPing, Baseball, Book restoration, Puzzles

    Introduction: My name is Jerrold Considine, I am a combative, cheerful, encouraging, happy, enthusiastic, funny, kind person who loves writing and wants to share my knowledge and understanding with you.