Conexión con el proxy de autenticación de Cloud SQL

Para obtener más información sobre cómo conectar un cliente sqlcmd a una instancia de Cloud SQL mediante una IP pública, consulta Conéctate mediante un cliente de base de datos.

Para obtener información acerca del funcionamiento del proxy, consulta Acerca del proxy de autenticación de Cloud SQL.

Antes de comenzar

Antes de poder conectar un sqlcmd a una instancia de Cloud SQL, debes haber hecho lo siguiente:

Opciones para autenticar el proxy de autenticación de Cloud SQL

Todas estas opciones usan un INSTANCE_CONNECTION_NAME como la string de conexión para identificar una instancia de Cloud SQL. Puedes encontrar el INSTANCE_CONNECTION_NAME en la página Descripción general de tu instancia en Google Cloud Console o ejecutando el siguiente comando:

gcloud sql instances describe INSTANCE_NAME.

Por ejemplo: myproject:myregion:myinstance.

Algunas de estas opciones usan un archivo de credenciales JSON que incluye la clave privada RSA de la cuenta. Si quieres obtener instrucciones para crear un archivo de credenciales JSON en una cuenta de servicio, consulta la sección sobre cómo crear una cuenta de servicio.

El proxy de autenticación de Cloud SQL ofrece varias alternativas de autenticación, según el entorno. El proxy de autenticación de Cloud SQL verifica cada uno de los siguientes elementos, en el siguiente orden, y usa el primero que encuentra para intentar llevar a cabo la autenticación:

  1. Credenciales provistas por la marca credential_file.

    Usa una cuenta de servicio para crear y descargar el archivo JSON asociado y establece la marca -credential_file en la ruta de acceso del archivo cuando inicias el proxy de autenticación de Cloud SQL. La cuenta de servicio debe tener los permisos necesarios para la instancia de Cloud SQL.

    Para usar esta opción en la línea de comandos, invoca el comando cloud_sql_proxy con la marca -credential_file establecida en la ruta y el nombre de archivo de un archivo de credenciales JSON. La ruta de acceso puede ser absoluta o relativa al directorio de trabajo actual. Por ejemplo:

    ./cloud_sql_proxy -credential_file=PATH_TO_KEY_FILE -instances=INSTANCE_CONNECTION_NAME
      

    Para obtener instrucciones detalladas sobre cómo agregar funciones de IAM a una cuenta de servicio, consulta la sección Cómo asignar funciones a las cuentas de servicio.

    Para obtener más información sobre las funciones que admite Cloud SQL, consulta la sección Control de acceso a proyectos para Cloud SQL.

  2. Credenciales provistas por un token de acceso.

    Crea un token de acceso y, luego, invoca el comando cloud_sql_proxy con la marca -token establecida en un token de acceso de OAuth 2.0. Por ejemplo:
    ./cloud_sql_proxy -token=ACCESS_TOKEN -instances=INSTANCE_CONNECTION_NAME
      
  3. Credenciales provistas por una variable de entorno.

    Esta opción es similar a usar la marca -credential_file, excepto que se especifica el archivo de credenciales JSON que estableciste en la variable de entorno GOOGLE_APPLICATION_CREDENTIALS, en lugar de usar el argumento de línea de comandos -credential_file.
  4. Credenciales de un cliente del SDK de Cloud autenticado.

    Si instalaste la herramienta de línea de comandos de la nube y te autenticaste con tu cuenta personal, el proxy de autenticación de Cloud SQL puede usar las mismas credenciales de cuenta. Este método es útil, en particular, para poner en ejecución un entorno de desarrollo.

    Si no se seleccionó ninguna cuenta para gcloud auth login, el proxy de autenticación de Cloud SQL verifica una cuenta que se seleccionó para gcloud auth application-default login.

  5. Credenciales asociadas con la instancia de Compute Engine.

    Si te conectas a Cloud SQL desde una instancia de Compute Engine, el proxy de autenticación de Cloud SQL puede usar la cuenta de servicio asociada con la instancia de Compute Engine. Si la cuenta de servicio tiene los permisos necesarios para la instancia de Cloud SQL, el proxy de autenticación de Cloud SQL se autentica correctamente.

    Si la instancia de Compute Engine se encuentra en el mismo proyecto que la instancia de Cloud SQL, la cuenta de servicio predeterminada para la instancia de Compute Engine tiene los permisos que se necesitan con el fin de autenticar el proxy de autenticación de Cloud SQL. Si las dos instancias se encuentran en proyectos diferentes, deberás agregar la cuenta de servicio de la instancia de Compute Engine al proyecto que contiene la instancia de Cloud SQL.

  6. Cuenta de servicio predeterminada del entorno

    Si el proxy de autenticación de Cloud SQL no puede encontrar credenciales en ninguno de los lugares mencionados anteriormente, sigue la lógica que se documenta en la sección cómo configurar la autenticación para aplicaciones de producción de servidor a servidor. Algunos entornos (como Compute Engine, App Engine y otros) proporcionan una cuenta de servicio predeterminada que tu aplicación puede usar para la autenticación según la configuración predeterminada. Si usas una cuenta de servicio predeterminada, debe tener los permisos descritos en funciones y permisos Si deseas obtener más información sobre el enfoque de Google Cloud para la autenticación, consulta la sección Descripción general de la autenticación.

Cree una cuenta de servicio

  1. Ve a la página Cuentas de servicio de Google Cloud Console.

    Ve a la página Cuentas de servicio

  2. Selecciona el proyecto que contiene la instancia de Cloud SQL.
  3. Haga clic en Crear cuenta de servicio.
  4. En el cuadro de diálogo Crear cuenta de servicio, ingresa un nombre descriptivo para la cuenta de servicio.
  5. Cambia el ID de cuenta de servicio por un valor único y reconocible y, luego, haz clic en Crear.
  6. En Función, selecciona una de las siguientes funciones, haz clic en Continuar y, luego, haz clic en Listo:
    • Cloud SQL > Cliente de Cloud SQL
    • Cloud SQL > Editor de Cloud SQL
    • Cloud SQL > Administrador de Cloud SQL
  7. Haz clic en el menú de acciones de tu nueva cuenta de servicio y, luego, selecciona Administrar claves.
  8. Haz clic en el menú desplegable Agregar clave y, luego, en Crear clave nueva.
  9. Confirma que el tipo de clave sea JSON y, luego, haz clic en Crear.

    El archivo de claves privadas se descargará en tu equipo. Puedes moverlo a otra ubicación. Protege el archivo de clave.

Instala el proxy de autenticación de Cloud SQL

Linux de 64 bits

  1. Descarga el proxy de autenticación de Cloud SQL:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
    chmod +x cloud_sql_proxy
    

Linux de 32 bits

  1. Descarga el proxy de autenticación de Cloud SQL:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
    chmod +x cloud_sql_proxy
    

macOS de 64 bits

  1. Descarga el proxy de autenticación de Cloud SQL:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
    chmod +x cloud_sql_proxy
    

macOS de 32 bits

  1. Descarga el proxy de autenticación de Cloud SQL:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Haz que el proxy de autenticación de Cloud SQL sea ejecutable:
    chmod +x cloud_sql_proxy
    

Windows de 64 bits

Para descargar el proxy de autenticación de Cloud SQL, haz clic con el botón derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe y selecciona Guardar vínculo como. Cambia el nombre del archivo por cloud_sql_proxy.exe.

Windows de 32 bits

Para descargar el proxy de autenticación de Cloud SQL, haz clic derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe y selecciona Guardar vínculo como. Cambia el nombre del archivo por cloud_sql_proxy.exe.

Imagen de Docker del proxy de autenticación de Cloud SQL

Para mayor comodidad, el equipo de Cloud SQL mantiene varias imágenes de contenedor que poseen el proxy de autenticación de Cloud SQL para que lo usen nuestros clientes. Para obtener más información sobre estas imágenes, consulta el repositorio del proxy de autenticación de Cloud SQL en GitHub. Puedes extraer la última imagen a tu máquina local usando Docker mediante el siguiente comando:
docker pull gcr.io/cloudsql-docker/gce-proxy:1.19.1

Otro SO

Para otros sistemas operativos que no se incluyen aquí, puedes compilar el proxy de autenticación de Cloud SQL desde el origen.

Inicia el proxy de autenticación de Cloud SQL

Puedes iniciar el proxy de autenticación de Cloud SQL mediante sockets TCP o la imagen de Docker del proxy de autenticación de Cloud SQL. El objeto binario del proxy de autenticación de Cloud SQL se conecta a una o más instancias de Cloud SQL especificadas en la línea de comandos y abre una conexión local como socket TCP. Otras aplicaciones y servicios, como el código de la aplicación o las herramientas cliente de la administración de bases de datos, pueden conectarse a las instancias de Cloud SQL a través de esa conexión de socket TCP.

Sockets TCP

En el caso de las conexiones TCP, el proxy de autenticación de Cloud SQL escucha en localhost(127.0.0.1) de forma predeterminada. Por lo tanto, cuando especificas tcp:PORT_NUMBER en una instancia, la conexión local está en 127.0.0.1:PORT_NUMBER.

Como alternativa, puedes especificar una dirección diferente para la conexión local. Por ejemplo, a continuación, se muestra cómo hacer que el proxy de autenticación de Cloud SQL escuche en 0.0.0.0:1234 para la conexión local:

  ./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:1234
  1. Copia tu INSTANCE_CONNECTION_NAME. Puedes encontrarlo en la página Descripción general de la instancia en Google Cloud Console o mediante la ejecución del siguiente comando:

    gcloud sql instances describe INSTANCE_NAME
    .

    Por ejemplo: myproject:myregion:myinstance.

  2. Si la instancia tiene configuradas una IP pública y una IP privada, y quieres que el proxy de autenticación de Cloud SQL use la dirección IP privada, debes proporcionar la siguiente opción cuando inicies el proxy de autenticación de Cloud SQL:
    -ip_address_types=PRIVATE
  3. Si usas una cuenta de servicio para autenticar el proxy de autenticación de Cloud SQL, toma nota de la ubicación del archivo de claves privadas que se generó en la máquina cliente cuando creaste la cuenta de servicio.
  4. Inicia el proxy de autenticación de Cloud SQL.

    Estas son algunas strings posibles para invocar al proxy de autenticación de Cloud SQL:

    • Si usas la autenticación del SDK de Cloud:
      ./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:1433
      
      El puerto especificado no debe estar en uso, por ejemplo, por un servidor de base de datos local.
    • Si usas una cuenta de servicio y también incluyes de forma explícita el nombre de la conexión de la instancia (recomendado para entornos de producción):
      ./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAM=tcp:1433 \
                        -credential_file=PATH_TO_KEY_FILE &
      

    Si deseas obtener más información sobre las opciones del proxy de autenticación de Cloud SQL, consulta las opciones para autenticar el proxy de autenticación de Cloud SQL y las opciones para especificar instancias.

Imagen de Docker del proxy de autenticación de Cloud SQL

Para ejecutar el proxy de autenticación de Cloud SQL en un contenedor de Docker, usa la imagen de Docker del proxy de autenticación de Cloud SQL disponible en Google Container Registry.

Puedes iniciar el proxy de autenticación de Cloud SQL mediante sockets TCP o sockets Unix con los comandos que se muestran a continuación. Las opciones usan un INSTANCE_CONNECTION_NAME como la string de conexión para identificar una instancia de Cloud SQL. Puedes encontrar el INSTANCE_CONNECTION_NAME en la página Descripción general de tu instancia en Google Cloud Console o ejecutando el siguiente comando:

gcloud sql instances describe INSTANCE_NAME
.

Por ejemplo: myproject:myregion:myinstance.

Según tu lenguaje y entorno, puedes iniciar el proxy de autenticación de Cloud SQL con sockets TCP o Unix. Los sockets Unix no son compatibles con aplicaciones escritas en el lenguaje de programación Java o con el entorno de Windows.

Usa sockets TCP

docker run -d \\
  -v PATH_TO_KEY_FILE:/config \\
  -p 127.0.0.1:1433:1433 \\
  gcr.io/cloudsql-docker/gce-proxy:1.19.1 /cloud_sql_proxy \\
  -instances=INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:1433 -credential_file=/config

Si usas las credenciales proporcionadas por tu instancia de Compute Engine, no incluyas el parámetro credential_file y la línea -v PATH_TO_KEY_FILE:/config.

Especifica siempre el prefijo 127.0.0.1 en -p para que el proxy de autenticación de Cloud SQL no se exponga fuera del host local. El “0.0.0.0” en el parámetro de las instancias es necesario para que se pueda acceder al puerto desde afuera del contenedor de Docker.

Usa sockets Unix

docker run -d -v /cloudsql:/cloudsql \\
  -v PATH_TO_KEY_FILE:/config \\
  gcr.io/cloudsql-docker/gce-proxy:1.19.1 /cloud_sql_proxy -dir=/cloudsql \\
  -instances=INSTANCE_CONNECTION_NAME -credential_file=/config

Si usas las credenciales proporcionadas por tu instancia de Compute Engine, no incluyas el parámetro credential_file y la línea -v PATH_TO_KEY_FILE:/config.

Si usas una imagen optimizada para contenedores, usa un directorio que admita operaciones de escritura en lugar de /cloudsql, por ejemplo:

-v /mnt/stateful_partition/cloudsql:/cloudsql

Puedes especificar más de una instancia, separadas por comas. También puedes usar los metadatos de Compute Engine a fin de determinar de forma dinámica las instancias que se conectarán. Obtén más información acerca del proxy de autenticación de Cloud SQL.

Otros argumentos de la línea de comandos

Los ejemplos anteriores abarcan los casos de uso más comunes, pero el proxy de autenticación de Cloud SQL también tiene otras opciones de configuración que se pueden establecer con argumentos de línea de comandos. Si necesitas ayuda con los argumentos de la línea de comandos, usa la marca -help para ver la documentación más reciente:

./cloud_sql_proxy -help

Consulta el archivo README en el repositorio del proxy de autenticación de Cloud SQL en GitHub para ver ejemplos adicionales sobre cómo usar las opciones de línea de comandos del proxy de autenticación de Cloud SQL.

Conéctate al proxy de autenticación de Cloud SQL

La string de conexión que usas depende de si iniciaste el proxy de autenticación de Cloud SQL con un socket TCP o Docker.

Sockets TCP

  1. Inicia el cliente sqlcmd:
    sqlcmd -S tcp:127.0.0.1,1433 -U USERNAME -P PASSWORD
    

    Cuando te conectas con los sockets TCP, se accede al proxy de autenticación de Cloud SQL a través de 127.0.0.1.

  2. Si se te solicita, ingresa la contraseña.
  3. Se mostrará el mensaje de sqlcmd.

¿Necesitas ayuda? Para solucionar problemas del proxy, consulta Soluciona problemas de conexión del proxy de autenticación de Cloud SQL. También puedes consultar nuestra página de asistencia de Cloud SQL.

Muestras de código específicas de lenguaje

Puedes conectarte al proxy de autenticación de Cloud SQL desde cualquier lenguaje que te permita conectarte a un socket de TCP. A continuación, se incluyen algunos fragmentos de código de ejemplos completos en GitHub para ayudarte a comprender cómo funcionan juntos en tu aplicación.

Conéctate con TCP

Declaración de invocación del proxy de autenticación de Cloud SQL:

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:1433 &

Python

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

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

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

# SQL Server drivers don't account for this
if db_hostname == "localhost":
    db_hostname = "127.0.0.1"

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

Java

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

// Note: For Java users, the Cloud SQL JDBC Socket Factory can provide authenticated connections
// which is preferred to using the Cloud SQL Proxy with Unix sockets.
// See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details.

// The configuration object specifies behaviors for the connection pool.
HikariConfig config = new HikariConfig();

// The following is equivalent to setting the config options below:
// jdbc:sqlserver://;user=<DB_USER>;password=<DB_PASS>;databaseName=<DB_NAME>;
// socketFactoryClass=com.google.cloud.sql.sqlserver.SocketFactory;
// socketFactoryConstructorArg=<CLOUD_SQL_CONNECTION_NAME>

// 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
    .setDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerDataSource");
config.setUsername(DB_USER); // e.g. "root", "sqlserver"
config.setPassword(DB_PASS); // e.g. "my-password"
config.addDataSourceProperty("databaseName", DB_NAME);

config.addDataSourceProperty("socketFactoryClass",
    "com.google.cloud.sql.sqlserver.SocketFactory");
config.addDataSourceProperty("socketFactoryConstructorArg", CLOUD_SQL_CONNECTION_NAME);

// ... Specify additional connection properties here.

// ...

// Initialize the connection pool using the configuration object.
DataSource pool = new HikariDataSource(config);

Node.js

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

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

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

Comienza a usarlo

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

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

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

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

// ...

return dbPool, nil

C#

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

            // Equivalent connection string:
            // "User Id=<DB_USER>;Password=<DB_PASS>;Server=<DB_HOST>;Database=<DB_NAME>;"
            var connectionString = new SqlConnectionStringBuilder()
            {
                // Remember - storing secrets in plain text is potentially unsafe. Consider using
                // something like https://cloud.google.com/secret-manager/docs/overview to help keep
                // secrets secret.
                DataSource = Environment.GetEnvironmentVariable("DB_HOST"),     // e.g. '127.0.0.1'
                // Set Host to 'cloudsql' when deploying to App Engine Flexible environment
                UserID = Environment.GetEnvironmentVariable("DB_USER"),         // e.g. 'my-db-user'
                Password = Environment.GetEnvironmentVariable("DB_PASS"),       // e.g. 'my-db-password'
                InitialCatalog = Environment.GetEnvironmentVariable("DB_NAME"), // e.g. 'my-database'

                // The Cloud SQL proxy provides encryption between the proxy and instance
                Encrypt = false,
            };
            connectionString.Pooling = true;
            // ...
            return connectionString;

Ruby

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

development:
  adapter: sqlserver
  # Configure additional properties here.
  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("DB_HOST") { "127.0.0.1" }%> # '172.17.0.1' if deployed to GAE Flex
  port: <%= ENV.fetch("DB_PORT") { 1433 }%> 

PHP

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

// $username = 'your_db_user';
// $password = 'yoursupersecretpassword';
// $dbName = 'your_db_name';
// $dbHost = "127.0.0.1";

// Connect using TCP
$dsn = sprintf('sqlsrv:server=%s;Database=%s', $dbHost, $dbName);

// Connect to the database
$conn = new PDO($dsn, $username, $password, $connConfig);

Temas adicionales

Usa el proxy con una dirección IP privada

Para conectarse a una instancia de Cloud SQL mediante una IP privada, el proxy debe estar en un recurso que tenga acceso a la misma red de VPC que la instancia.

El proxy usa una IP para establecer una conexión con tu instancia de Cloud SQL. De forma predeterminada, el proxy intenta conectarse a través de una dirección IPv4 pública. Si la instancia de Cloud SQL solo tiene IP privadas, el proxy usa la dirección IP privada para conectarse.

Si la instancia tiene configuradas IP públicas y privadas, y quieres que el proxy use la dirección IP privada, deberás proporcionar la siguiente opción cuando inicies el proxy:

-ip_address_types=PRIVATE

Ejecuta el proxy en un proceso separado

Ejecutar el proxy de autenticación de Cloud SQL en un proceso terminal separado puede ser útil para evitar mezclar el resultado de la consola con el de otros programas. Utiliza la sintaxis que se muestra a continuación para invocar el proxy en un proceso separado.

Linux

En Linux o macOS, usa un & al final de la línea de comandos para iniciar el proxy en un proceso separado:

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:PORT_NUMBER
  -credential_file=PATH_TO_KEY_FILE &

Windows

En Windows PowerShell, usa el comando Start-Process para iniciar el proxy en un proceso separado:

Start-Process -filepath "cloud_sql_proxy.exe"
  -ArgumentList "-instances=INSTANCE_CONNECTION_NAME=tcp:PORT_NUMBER
  -credential_file=PATH_TO_KEY_FILE"

Ejecuta el proxy de autenticación de Cloud SQL en un contenedor de Docker

Para ejecutar el proxy de autenticación de Cloud SQL en un contenedor de Docker, usa la imagen de Docker del proxy disponible en Google Container Registry. Puedes instalar la imagen de Docker del proxy con este comando gcloud:

docker pull gcr.io/cloudsql-docker/gce-proxy:1.19.1

Puedes iniciar el proxy con sockets TCP o Unix, con los comandos que se muestran a continuación.

Sockets TCP

    docker run -d \
      -v PATH_TO_KEY_FILE:/config \
      -p 127.0.0.1:1433:1433 \
      gcr.io/cloudsql-docker/gce-proxy:1.19.1 /cloud_sql_proxy \
      -instances=INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:1433 \
      -credential_file=/config

Sockets Unix

    docker run -d \
      -v /PATH_TO_HOST_TARGET:/PATH_TO_GUEST_TARGET \
      -v PATH_TO_KEY_FILE:/config \
      gcr.io/cloudsql-docker/gce-proxy:1.19.1 /cloud_sql_proxy -dir=/cloudsql \
      -instances=INSTANCE_CONNECTION_NAME
      -credential_file=/config/PATH_TO_KEY_FILE

Si usas una imagen optimizada para contenedores, usa un directorio que admita operaciones de escritura en lugar de /cloudsql, por ejemplo:

-v /mnt/stateful_partition/cloudsql:/cloudsql

Si usas las credenciales que proporciona tu instancia de Compute Engine, no incluyas el parámetro credential_file ni la línea -v PATH_TO_KEY_FILE:/config.

Ejecuta el proxy de autenticación de Cloud SQL como servicio

Ejecutar el proxy como un servicio en segundo plano puede ser conveniente para desarrollar y realizar pruebas de forma local. Cuando necesites acceder a tu instancia de Cloud SQL, puedes iniciar el servicio en segundo plano y detenerlo cuando termines.

  • En este momento, el proxy de autenticación de Cloud SQL no cuenta con compatibilidad integrada para ejecutarse como un servicio de Windows, pero puedes usar administradores de servicios de terceros a fin de hacerlo. Por ejemplo, puedes usar NSSM para configurar el proxy como un servicio de Windows, y NSSM supervisa el proxy y lo reinicia automáticamente si deja de responder. Consulta la documentación de NSSM para obtener más información.

Sugerencias para trabajar con el proxy de autenticación de Cloud SQL

Usa el proxy para conectarte a varias instancias

Puedes usar un cliente de proxy local para conectarte a varias instancias de Cloud SQL. La forma de hacerlo depende de si usas sockets Unix o TCP.

Sockets TCP

Si te conectas mediante TCP, debes especificar el puerto en tu máquina que se usará para conectarte a la instancia, cada instancia debe tener su propio puerto. La herramienta sqlcmd usa el puerto 1433 de forma predeterminada, pero puedes especificar otro.

Por ejemplo:

    # Start the proxy for two instances, each with its own port:

    ./cloud_sql_proxy -instances=myProject:us-central1:myInstance=tcp:1433,myProject:us-central1:myInstance2=tcp:1234

    # Connect to "myInstance" on port 1433, and "myInstance2" on port 1234

    sqlcmd -U myUser -S "127.0.0.1,1433"
    sqlcmd -U myUser -S "127.0.0.1,1234"
  

Solución de problemas de conexión del proxy de autenticación de Cloud SQL

La imagen de Docker del proxy se basa en una versión específica del proxy de autenticación de Cloud SQL. Cuando esté disponible una versión nueva del proxy de autenticación de Cloud SQL, extrae la versión nueva de la imagen de Docker del proxy para mantener actualizado el entorno. Puedes ver la versión actual del proxy de autenticación de Cloud SQL si consultas la página de versiones de GitHub del proxy de autenticación de Cloud SQL.

Si tienes problemas para conectar tu instancia de Cloud SQL con el proxy de autenticación de Cloud SQL, ten en cuenta los siguientes consejos a fin de intentar descubrir la causa del problema.

  • Verifica el resultado del proxy.

    A menudo, el resultado del proxy te ayudará a determinar el origen del problema y cómo resolverlo. Canaliza el resultado a un archivo o mira la terminal desde la que iniciaste el proxy.

  • Si recibes un error 403 notAuthorized y usas una cuenta de servicio para autenticar el proxy, asegúrate de que la cuenta de servicio tenga los permisos correctos.

    Para verificar la cuenta de servicio, puedes buscar su ID en la página de IAM. Debe tener el permiso cloudsql.instances.connect. Las funciones predefinidas Cloud SQL Admin, Client y Editor tienen este permiso.

  • Asegúrate de habilitar la API de Administrador de Cloud SQL.

    De lo contrario, verás un resultado como Error 403: Access Not Configured en los registros de proxy.

  • Si incluyes varias instancias en tu lista de instancias, asegúrate de usar una coma como delimitador, sin espacios. Si usas TCP, asegúrate de especificar puertos diferentes para cada instancia.

  • Si te conectas con sockets UNIX, confirma que los sockets se crearon con la lista del directorio que proporcionaste cuando se inició el proxy.

  • Si tienes una política de firewall saliente, asegúrate de que permita conexiones al puerto 3307 en la instancia de Cloud SQL de destino.

¿Qué sigue?