חיבור באמצעות שרת proxy ל-Cloud SQL Auth

בדף הזה מוסבר איך להתחבר למכונה של Cloud SQL באמצעות Cloud SQL Auth Proxy.

מידע נוסף על Cloud SQL Auth Proxy

סקירה כללית

השיטה המומלצת להתחברות למכונת Cloud SQL היא באמצעות Cloud SQL Auth Proxy. שרת ה-proxy ל-Cloud SQL Auth:

  • פועל עם נקודות קצה של כתובות IP ציבוריות ופרטיות
  • מאמת את החיבורים באמצעות פרטי כניסה של משתמש או של חשבון שירות
  • עוטף את החיבור בשכבת הצפנה של SSL/TLS שמאושרת למכונה שלכם ב-Cloud SQL.

חלק Google Cloud מהשירותים והאפליקציות משתמשים ב-Cloud SQL Auth Proxy כדי לספק חיבורים לנתיבי כתובות IP ציבוריות עם הצפנה והרשאה, כולל:

אפליקציות שפועלות ב- Google Kubernetes Engine יכולות להתחבר באמצעות Cloud SQL Auth Proxy.

במדריך למתחילים לשימוש ב-Cloud SQL Auth Proxy יש מבוא בסיסי לשימוש בו.

אפשר גם להתחבר באמצעות לקוח sqlcmd ממחשב מקומי או מ-Compute Engine, עם או בלי Cloud SQL Auth Proxy.

לפני שמתחילים

לפני שמתחברים למכונת Cloud SQL, צריך לבצע את הפעולות הבאות:

    • למשתמש או לחשבון שירות, מוודאים שיש לחשבון את התפקיד Cloud SQL Client. התפקיד הזה מכיל את ההרשאה cloudsql.instances.connect, שמאפשרת לחשבון משתמש להתחבר לכל המכונות של Cloud SQL בפרויקט.

      כניסה לדף IAM

    • אפשר לכלול תנאי IAM בקישור של מדיניות ה-IAM, שנותן לחשבון הרשאה להתחבר רק למכונה ספציפית אחת של Cloud SQL.
  1. מפעילים את Cloud SQL Admin API, אם הוא עדיין לא מופעל.

    התפקידים שנדרשים כדי להפעיל ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    להפעלת ה-API

  2. מתקינים ומפעילים את ה-CLI של gcloud.
  3. זה שינוי אופציונלי. מתקינים את לקוח Docker של Cloud SQL Auth Proxy.

הורדת Cloud SQL Auth Proxy

לפני שמתחילים, צריך לקבוע את הארכיטקטורה של המכונה.

אם מריצים ב-Linux או ב-Mac, אפשר למצוא את זה על ידי הרצת הפקודה הבאה:

  uname -a
  

‏Linux‏ 64 סיביות

  1. מורידים את Cloud SQL Auth Proxy:
    curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.2/cloud-sql-proxy.linux.amd64
  2. הופכים את Cloud SQL Auth Proxy לקובץ הפעלה:
    chmod +x cloud-sql-proxy

‏Linux‏ 32 סיביות

  1. מורידים את Cloud SQL Auth Proxy:
    curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.2/cloud-sql-proxy.linux.386
  2. אם הפקודה curl לא נמצאה, מריצים את sudo apt install curl וחוזרים על פקודת ההורדה.
  3. הופכים את Cloud SQL Auth Proxy לקובץ הפעלה:
    chmod +x cloud-sql-proxy

macOS‏ 64 סיביות

  1. מורידים את Cloud SQL Auth Proxy:
    curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.2/cloud-sql-proxy.darwin.amd64
  2. הופכים את Cloud SQL Auth Proxy לקובץ הפעלה:
    chmod +x cloud-sql-proxy

Mac M1

  1. מורידים את Cloud SQL Auth Proxy:
      curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.2/cloud-sql-proxy.darwin.arm64
      
  2. הופכים את Cloud SQL Auth Proxy לקובץ הפעלה:
      chmod +x cloud-sql-proxy
      

‏Windows‏ 64 סיביות

לוחצים לחיצה ימנית על https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.2/cloud-sql-proxy.x64.exe ובוחרים באפשרות שמירת קישור בשם כדי להוריד את Cloud SQL Auth Proxy. משנים את שם הקובץ ל-cloud-sql-proxy.exe.

‏Windows‏ 32 סיביות

לוחצים לחיצה ימנית על https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.26.2/cloud-sql-proxy.x86.exe ובוחרים באפשרות שמירת קישור בשם כדי להוריד את Cloud SQL Auth Proxy. משנים את שם הקובץ ל-cloud-sql-proxy.exe.

קובץ אימג' של Docker ל-Cloud SQL Auth Proxy

ל-Cloud SQL Auth Proxy יש קובצי אימג' שונים של קונטיינרים, כמו distroless,‏ alpine ו-buster. קובץ האימג' של קונטיינר ברירת המחדל של Cloud SQL Auth Proxy משתמש ב-distroless, שלא מכיל מעטפת. אם אתם צריכים מעטפת או כלים קשורים, אתם יכולים להוריד תמונה שמבוססת על alpine או על buster. מידע נוסף מופיע במאמר קובצי אימג' של קונטיינרים של Cloud SQL Auth Proxy.

כדי להוריד את קובץ האימג' העדכני למחשב המקומי באמצעות Docker, משתמשים בפקודה הבאה:

docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.26.2

מערכת הפעלה אחרת

במערכות הפעלה אחרות שלא מופיעות כאן, אפשר להדר את Cloud SQL Auth Proxy מהמקור.

הפעלת Cloud SQL Auth Proxy

אפשר להפעיל את Cloud SQL Auth Proxy באמצעות שקעי TCP או קובץ האימג' של Docker ב-Cloud SQL Auth Proxy. קובץ הבינארי של Cloud SQL Auth Proxy מתחבר למכונה אחת או יותר של Cloud SQL שצוינו בשורת הפקודה, ופותח חיבור מקומי כשקע TCP. אפליקציות ושירותים אחרים, כמו קוד האפליקציה או כלי לקוח לניהול מסדי נתונים, יכולים להתחבר למכונות של Cloud SQL דרך החיבור הזה לשקע TCP.

שקעי TCP

בחיבורי TCP, כברירת מחדל שרת ה-Proxy של Cloud SQL Auth מאזין ל-localhost(127.0.0.1). לכן, כשמציינים --port PORT_NUMBER למכונה, החיבור המקומי הוא בכתובת 127.0.0.1:PORT_NUMBER.

אפשר גם לציין כתובת אחרת לחיבור המקומי. לדוגמה, כך מגדירים את Cloud SQL Auth Proxy להאזין בכתובת 0.0.0.0:1234 לחיבור המקומי:

./cloud-sql-proxy --address 0.0.0.0 --port 1234 INSTANCE_CONNECTION_NAME
  1. מעתיקים את INSTANCE_CONNECTION_NAME. אפשר למצוא את המידע הזה בדף Overview של המכונה במסוףGoogle Cloud , או באמצעות הרצת הפקודה הבאה:

        gcloud sql instances describe INSTANCE_NAME --format='value(connectionName)'

    לדוגמה: myproject:myregion:myinstance.

  2. אם למכונה מוגדרות גם כתובת IP ציבורית וגם כתובת IP פרטית, ואתם רוצים ש-Cloud SQL Auth Proxy ישתמש בכתובת ה-IP הפרטית, אתם צריכים לספק את האפשרות הבאה כשאתם מפעילים את Cloud SQL Auth Proxy:
    --private-ip
  3. אם אתם משתמשים בחשבון שירות כדי לאמת את Cloud SQL Auth Proxy, שימו לב למיקום במכונת הלקוח של קובץ המפתח הפרטי שנוצר כשנוצר חשבון השירות.
  4. מפעילים את Cloud SQL Auth Proxy.

    מחרוזות אפשריות להפעלת Cloud SQL Auth Proxy:

    • שימוש באימות Cloud SDK:
      ./cloud-sql-proxy --port 1433 INSTANCE_CONNECTION_NAME
      היציאה שצוינה לא יכולה להיות בשימוש, למשל על ידי שרת מסד נתונים מקומי.
    • שימוש בחשבון שירות וציון השם של חיבור המופע (מומלץ לסביבות ייצור):
      ./cloud-sql-proxy \
      --credentials-file PATH_TO_KEY_FILE INSTANCE_CONNECTION_NAME &

    מידע נוסף על האפשרויות של Cloud SQL Auth Proxy זמין במאמר אפשרויות לאימות של Cloud SQL Auth Proxy.

Docker

כדי להריץ את Cloud SQL Auth Proxy במאגר Docker, משתמשים בקובץ האימג' של Docker של Cloud SQL Auth Proxy שזמין ב-Google Container Registry.

אפשר להפעיל את Cloud SQL Auth Proxy באמצעות שקעי TCP, עם הפקודה שמוצגת למטה. באפשרות הזו נעשה שימוש בINSTANCE_CONNECTION_NAME כמחרוזת החיבור כדי לזהות מכונת Cloud SQL. אפשר למצוא את הערך של INSTANCE_CONNECTION_NAME בדף Overview של המכונה במסוףGoogle Cloud , או על ידי הרצת הפקודה הבאה:

gcloud sql instances describe INSTANCE_NAME

לדוגמה: myproject:myregion:myinstance.

שימוש בשקעי TCP

docker run -d \
  -v PATH_TO_KEY_FILE:/path/to/service-account-key.json \
  -p 127.0.0.1:1433:1433 \
  gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.26.2 \
  --address 0.0.0.0 --port 1433 \
  --credentials-file /path/to/service-account-key.json INSTANCE_CONNECTION_NAME

אם אתם משתמשים בפרטי הכניסה שסופקו על ידי המכונה של Compute Engine, אל תכללו את הפרמטר --credentials-file ואת השורה -v PATH_TO_KEY_FILE:/path/to/service-account-key.json.

תמיד צריך לציין את הקידומת 127.0.0.1 ב--p כדי ש-Cloud SQL Auth Proxy לא ייחשף מחוץ למארח המקומי. כדי שהיציאה תהיה נגישה מחוץ למאגר Docker, צריך להשתמש בדגל --address 0.0.0.0.

התחברות ללקוח sqlcmd

מחרוזת החיבור שבה משתמשים תלויה בשאלה אם הפעלתם את Cloud SQL Auth Proxy באמצעות שקע TCP או Docker.

שקעי TCP

  1. מפעילים את לקוח sqlcmd:
    sqlcmd -S tcp:127.0.0.1,1433 -U USERNAME -P PASSWORD

    כשמתחברים באמצעות שקעי TCP, מתבצעת גישה ל-Cloud SQL Auth Proxy דרך 127.0.0.1.

  2. אם מתבקשים, מזינים את הסיסמה.
  3. מופיעה שורת הפקודה של sqlcmd.

דרושה לך עזרה? לקבלת עזרה בפתרון בעיות ב-Cloud SQL Auth Proxy, אפשר לעיין במאמר פתרון בעיות בחיבורים של Cloud SQL Auth Proxy או בדף התמיכה ב-Cloud SQL.

קישור לאפליקציה

אפשר להתחבר ל-Cloud SQL Auth Proxy מכל שפה שמאפשרת להתחבר לשקע TCP. בהמשך מופיעים קטעי קוד מתוך דוגמאות פתורות ב-GitHub, שיעזרו לכם להבין איך הם פועלים יחד באפליקציה שלכם.

חיבור באמצעות TCP

הצהרת הפעלה של Cloud SQL Auth Proxy:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME &

Python

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין ב-README ב-GitHub.

import os

import sqlalchemy


def connect_tcp_socket() -> sqlalchemy.engine.base.Engine:
    """Initializes a TCP connection pool for a Cloud SQL instance of SQL Server."""
    # 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. 1433

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

    return pool

Java

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין ב-README ב-GitHub.

הערה:

  • המשתנה CLOUD_SQL_CONNECTION_NAME צריך להיות מיוצג בתור ‎<MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
  • השימוש בארגומנט ipTypes=PRIVATE יאלץ את SocketFactory להתחבר לכתובת ה-IP הפרטית שמשויכת למכונה
  • דרישות הגרסה של JDBC socket factory לקובץ pom.xml


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();

    // Configure which instance and what database user to connect with.
    config.setJdbcUrl(
        String.format("jdbc:sqlserver://%s:%s;databaseName=%s", INSTANCE_HOST, DB_PORT, DB_NAME));
    config.setUsername(DB_USER); // e.g. "root", "sqlserver"
    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

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין בקובץ ה-README ב-GitHub.

const mssql = require('mssql');

// createTcpPool initializes a TCP connection pool for a Cloud SQL
// instance of SQL Server.
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 = {
    server: process.env.INSTANCE_HOST, // e.g. '127.0.0.1'
    port: parseInt(process.env.DB_PORT), // e.g. 1433
    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'
    options: {
      trustServerCertificate: true,
    },
    // ... Specify additional properties here.
    ...config,
  };
  // Establish a connection to the database.
  return mssql.connect(dbConfig);
};

המשך

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין בקובץ ה-README ב-GitHub.

package cloudsql

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

	_ "github.com/denisenkom/go-mssqldb"
)

// connectTCPSocket initializes a TCP connection pool for a Cloud SQL
// instance of SQL Server.
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.\n", 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. '1433'
		dbName    = mustGetenv("DB_NAME")       // e.g. 'my-database'
	)

	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("sqlserver", dbURI)
	if err != nil {
		return nil, fmt.Errorf("sql.Open: %w", err)
	}

	// ...

	return dbPool, nil
}

C#‎

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין בקובץ ה-README ב-GitHub.

using Microsoft.Data.SqlClient;
using System;

namespace CloudSql
{
    public class SqlServerTcp
    {
        public static SqlConnectionStringBuilder NewSqlServerTCPConnectionString()
        {
            // Equivalent connection string:
            // "User Id=<DB_USER>;Password=<DB_PASS>;Server=<INSTANCE_HOST>;Database=<DB_NAME>;"
            var connectionString = new SqlConnectionStringBuilder()
            {
                // 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.
                DataSource = Environment.GetEnvironmentVariable("INSTANCE_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;
            // Specify additional properties here.
            return connectionString;
        }
    }
}

Ruby

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין בקובץ ה-README ב-GitHub.

tcp: &tcp
  adapter: sqlserver
  # 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") { 1433 }%> 

PHP

כדי לראות את קטע הקוד הזה בהקשר של אפליקציית אינטרנט, אפשר לעיין בקובץ ה-README ב-GitHub.

namespace Google\Cloud\Samples\CloudSQL\SQLServer;

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(
                'sqlsrv:server=%s;Database=%s',
                $instanceHost,
                $dbName
            );

            // 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/sqlserver/connect-external-app',
                    $e->getMessage()
                ),
                (int) $e->getCode(),
                $e
            );
        }

        return $conn;
    }
}

נושאים נוספים

ארגומנטים של שורת הפקודה ב-Cloud SQL Auth Proxy

הדוגמאות שלמעלה כוללות את תרחישי השימוש הנפוצים ביותר, אבל ל-Cloud SQL Auth Proxy יש גם אפשרויות הגדרה אחרות שאפשר להגדיר באמצעות ארגומנטים של שורת הפקודה. כדי לקבל עזרה בנושא ארגומנטים בשורת הפקודה, משתמשים בדגל --help כדי לראות את התיעוד העדכני:

./cloud-sql-proxy --help

ב-README במאגר של Cloud SQL Auth Proxy ב-GitHub יש דוגמאות נוספות לשימוש באפשרויות של שורת הפקודה של Cloud SQL Auth Proxy.

אפשרויות לאימות של Cloud SQL Auth Proxy

בכל האפשרויות האלה נעשה שימוש ב-INSTANCE_CONNECTION_NAME כמחרוזת החיבור כדי לזהות מכונת Cloud SQL. אפשר למצוא את INSTANCE_CONNECTION_NAME בדף Overview של המופע במסוףGoogle Cloud , או על ידי הפעלת הפקודה הבאה:

gcloud sql instances describe --project PROJECT_ID INSTANCE_CONNECTION_NAME.

לדוגמה: gcloud sql instances describe --project myproject myinstance .

בחלק מהאפשרויות האלה משתמשים בקובץ פרטי כניסה בפורמט JSON, שכולל את המפתח הפרטי של RSA לחשבון. במאמר יצירת חשבון שירות מוסבר איך יוצרים קובץ פרטי כניסה בפורמט JSON לחשבון שירות.

‫Cloud SQL Auth Proxy מספק כמה חלופות לאימות, בהתאם לסביבה שלכם. ‫Cloud SQL Auth Proxy בודק כל אחד מהפריטים הבאים, לפי הסדר הבא, ומשתמש בפריט הראשון שהוא מוצא כדי לנסות לבצע אימות:

  1. פרטי כניסה שסופקו על ידי הדגל credentials-file.

    משתמשים בחשבון שירות כדי ליצור ולהוריד את קובץ ה-JSON המשויך, ומגדירים את הדגל --credentials-file לנתיב של הקובץ כשמפעילים את Cloud SQL Auth Proxy. לחשבון השירות צריכות להיות ההרשאות הנדרשות למכונת Cloud SQL.

    כדי להשתמש באפשרות הזו בשורת הפקודה, מפעילים את הפקודה cloud-sql-proxy כשהדגל --credentials-file מוגדר לנתיב ולשם הקובץ של קובץ JSON שמכיל את פרטי הכניסה. הנתיב יכול להיות מוחלט או יחסי לספריית העבודה הנוכחית. לדוגמה:

    ./cloud-sql-proxy --credentials-file PATH_TO_KEY_FILE \
    INSTANCE_CONNECTION_NAME
      

    הוראות מפורטות להוספת תפקידי IAM לחשבון שירות מופיעות במאמר הקצאת תפקידים לחשבונות שירות.

    מידע נוסף על התפקידים שנתמכים ב-Cloud SQL זמין במאמר תפקידי IAM ב-Cloud SQL.

  2. פרטי הכניסה שסופקו על ידי אסימון גישה.

    יוצרים אסימון גישה ומפעילים את הפקודה cloud-sql-proxy כשהדגל --token מוגדר לאסימון גישה מסוג OAuth 2.0. לדוגמה:
    ./cloud-sql-proxy --token ACCESS_TOKEN \
    INSTANCE_CONNECTION_NAME
      
  3. פרטי כניסה שסופקו על ידי משתנה סביבה.

    האפשרות הזו דומה לשימוש בדגל --credentials-file, אבל במקום להשתמש בארגומנט שורת הפקודה --credentials-file, מציינים את קובץ פרטי הכניסה בפורמט JSON שהגדרתם במשתנה הסביבה GOOGLE_APPLICATION_CREDENTIALS.
  4. פרטי כניסה מלקוח מאומת של ה-CLI של gcloud.

    אם התקנתם את ה-CLI של gcloud ואתם מאומתים באמצעות החשבון האישי שלכם, Cloud SQL Auth Proxy יכול להשתמש באותם פרטי כניסה לחשבון. השיטה הזו שימושית במיוחד להגדרה ולהפעלה של סביבת פיתוח.

    כדי לאפשר ל-Cloud SQL Auth Proxy להשתמש בפרטי הכניסה של ה-CLI של gcloud, צריך להשתמש בפקודה הבאה כדי לאמת את ה-CLI של gcloud:

    gcloud auth application-default login
  5. פרטי הכניסה שמשויכים למכונה של Compute Engine.

    אם מתחברים ל-Cloud SQL ממכונת Compute Engine, שרת ה-Cloud SQL Auth Proxy יכול להשתמש בחשבון השירות שמשויך למכונת Compute Engine. אם לחשבון השירות יש את ההרשאות הנדרשות למכונה של Cloud SQL, Cloud SQL Auth Proxy יבצע אימות בהצלחה.

    אם המכונה של Compute Engine נמצאת באותו פרויקט כמו המכונה של Cloud SQL, לחשבון השירות שמוגדר כברירת מחדל למכונה של Compute Engine יש את ההרשאות שנדרשות לאימות של Cloud SQL Auth Proxy. אם שתי המכונות נמצאות בפרויקטים שונים, צריך להוסיף את חשבון השירות של המכונה ב-Compute Engine לפרויקט שמכיל את המכונה ב-Cloud SQL.

  6. חשבון השירות שמוגדר כברירת מחדל בסביבה

    אם Cloud SQL Auth Proxy לא מוצא פרטי כניסה באף אחד מהמקומות שצוינו קודם, הוא פועל לפי הלוגיקה שמתועדת במאמר הגדרת אימות לאפליקציות בסביבת ייצור של שרת לשרת. בסביבות מסוימות (כמו Compute Engine, ‏ App Engine ואחרות) יש חשבון שירות שמוגדר כברירת מחדל, שבו האפליקציה יכולה להשתמש כדי לבצע אימות. אם משתמשים בחשבון שירות שמוגדר כברירת מחדל, צריך להקצות לו את ההרשאות שמפורטות בקטע תפקידים והרשאות. למידע נוסף על גישת האימות של Google Cloud, קראו את הסקירה הכללית על אימות.

יצירה של חשבון שירות

  1. נכנסים לדף Service accounts במסוף Google Cloud .

    כניסה לדף Service accounts

  2. בוחרים את הפרויקט שמכיל את המכונה של Cloud SQL.
  3. לוחצים על יצירת חשבון שירות.
  4. בשדה Service account name, מזינים שם תיאורי לחשבון השירות.
  5. משנים את מזהה חשבון השירות לערך ייחודי וקל לזיהוי, ואז לוחצים על יצירה והמשך.
  6. לוחצים על השדה בחירת תפקיד ובוחרים אחד מהתפקידים הבאים:
    • ‫Cloud SQL > Cloud SQL Client
    • Cloud SQL > Cloud SQL Editor
    • Cloud SQL > Cloud SQL Admin
  7. לוחצים על Done כדי לסיים ליצור את חשבון השירות.
  8. לוחצים על תפריט הפעולות של חשבון השירות החדש ובוחרים באפשרות ניהול מפתחות.
  9. לוחצים על התפריט הנפתח Add key ואז על Create new key.
  10. מוודאים שסוג המפתח הוא JSON ולוחצים על Create.

    קובץ המפתח הפרטי יורד למחשב. אפשר להעביר אותו למיקום אחר. חשוב לשמור על קובץ המפתח מאובטח.

שימוש ב-Cloud SQL Auth Proxy עם כתובת IP פרטית

כדי להתחבר למכונת Cloud SQL באמצעות כתובת IP פרטית, ה-Cloud SQL Auth Proxy צריך להיות במשאב עם גישה לאותה רשת VPC כמו המכונה.

ה-Cloud SQL Auth Proxy משתמש ב-IP כדי ליצור חיבור למכונה שלכם ב-Cloud SQL. כברירת מחדל, Cloud SQL Auth Proxy מנסה להתחבר באמצעות כתובת IPv4 ציבורית.

אם למכונת Cloud SQL יש רק כתובת IP פרטית, או אם למכונה יש כתובת IP ציבורית וגם כתובת IP פרטית, ואתם רוצים ש-Cloud SQL Auth Proxy ישתמש בכתובת ה-IP הפרטית, אתם צריכים לספק את האפשרות הבאה כשאתם מפעילים את Cloud SQL Auth Proxy:

--private-ip

שימוש ב-Cloud SQL Auth Proxy כדי להתחבר לנקודת קצה לכתיבה

אתם יכולים להשתמש ב-Cloud SQL Auth Proxy כדי להתחבר למכונה ראשית של Cloud SQL שמוגדרת עם נקודת קצה לכתיבה. נקודת קצה לכתיבה היא שם גלובלי של שירות שמות דומיין (DNS) שאפשר להשתמש בו לחיבורים במקום בכתובת IP לצורך שחזור מתקדם אחרי אסון (DR), כמו ביצוע מעבר גיבוי או פעולת מעבר. אם מתרחש גיבוי או מעבר לגיבוי (failover או switchover) של המופע הראשי, Cloud SQL Auth Proxy מזהה את השינויים ברשומת ה-DNS באופן אוטומטי.

למידע נוסף על השימוש בשרת proxy ל-Cloud SQL Auth כדי להתחבר לנקודת קצה לכתיבה, אפשר לעיין במאמר חיבור לקוחות של מסד נתונים למכונות באמצעות שרת proxy ל-Cloud SQL Auth או מחברי שפה של Cloud SQL.

שימוש ב-Cloud SQL Auth Proxy עם מכונות שמופעל בהן Private Service Connect

אפשר להשתמש ב-Cloud SQL Auth Proxy כדי להתחבר למכונה של Cloud SQL עם Private Service Connect מופעל.

‫Cloud SQL Auth Proxy הוא מחבר שמספק גישה מאובטחת למכונה הזו בלי צורך ברשתות מורשות או בהגדרת SSL.

כדי לאפשר חיבורים של לקוחות Cloud SQL Auth Proxy, צריך להגדיר רשומת DNS שתואמת לשם ה-DNS המומלץ שסופק למכונה. רשומת ה-DNS היא מיפוי בין משאב DNS לבין שם דומיין.

מידע נוסף על השימוש ב-Cloud SQL Auth Proxy כדי להתחבר למכונות שמופעל בהן Private Service Connect זמין במאמר התחברות באמצעות Cloud SQL Auth Proxy.

הפעלת שרת proxy ל-Cloud SQL Auth בתהליך נפרד

כדי לא לערבב את הפלט של מסוף Cloud SQL Auth Proxy עם פלט מתוכנות אחרות, כדאי להריץ אותו בתהליך נפרד של מסוף Cloud Shell. כדי להפעיל את Cloud SQL Auth Proxy בתהליך נפרד, משתמשים בתחביר שמוצג בהמשך.

Linux

ב-Linux או ב-macOS, משתמשים ב-& בסוף שורת הפקודה כדי להפעיל את Cloud SQL Auth Proxy בתהליך נפרד:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME
  --credentials-file PATH_TO_KEY_FILE &

Windows

ב-Windows PowerShell, משתמשים בפקודה Start-Process כדי להפעיל את Cloud SQL Auth Proxy בתהליך נפרד:

Start-Process --filepath "cloud-sql-proxy.exe"
  --ArgumentList "
  --credentials-file PATH_TO_KEY_FILEINSTANCE_CONNECTION_NAME"

הפעלת Cloud SQL Auth Proxy בקונטיינר של Docker

כדי להריץ את Cloud SQL Auth Proxy בקונטיינר של Docker, משתמשים בקובץ האימג' של Cloud SQL Auth Proxy ל-Docker שזמין ב-Google Container Registry. כדי להתקין את קובץ אימג' של Docker של Cloud SQL Auth Proxy, משתמשים בפקודה הבאה:

docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.26.2
כדי להפעיל את Cloud SQL Auth Proxy באמצעות שקעי TCP, משתמשים בפקודה שמוצגת למטה.

שקעי TCP

docker run -d \
  -v PATH_TO_KEY_FILE:/path/to/service-account-key.json \
  -p 127.0.0.1:1433:1433 \
  gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.26.2 \
  --address 0.0.0.0 --port 1433 \
  --credentials-file /path/to/service-account-key.json \
  INSTANCE_CONNECTION_NAME

תמיד מציינים את הקידומת 127.0.0.1 ב--p כדי ששרת ה-proxy ל-Cloud SQL Auth לא ייחשף מחוץ למארח המקומי. כדי שהיציאה תהיה נגישה מחוץ למאגר Docker, צריך להשתמש בדגל --address 0.0.0.0.

אם אתם משתמשים בפרטי הכניסה שסופקו על ידי המכונה של Compute Engine, אל תכללו את הפרמטר --credentials-file ואת השורה -v PATH_TO_KEY_FILE:/path/to/service-account-key.json.

הפעלת Cloud SQL Auth Proxy כשירות

אפשר להריץ את Cloud SQL Auth Proxy כשירות שפועל ברקע לעומסי עבודה של פיתוח מקומי וייצור. במהלך פיתוח, כשצריך לגשת למכונת Cloud SQL, אפשר להפעיל את השירות ברקע ולהפסיק אותו כשמסיימים.

בשלב הזה, Cloud SQL Auth Proxy לא מספק תמיכה מובנית להפעלה כשירות Windows בעומסי עבודה בסביבת ייצור, אבל אפשר להשתמש במנהלי שירותים של צד שלישי כדי להפעיל אותו כשירות. לדוגמה, אפשר להשתמש ב-NSSM כדי להגדיר את Cloud SQL Auth Proxy כשירות של Windows, ו-NSSM עוקב אחרי Cloud SQL Auth Proxy ומפעיל אותו מחדש באופן אוטומטי אם הוא מפסיק להגיב. מידע נוסף מופיע במאמרי העזרה בנושא NSSM.

חיבור כשנדרש SSL

אכיפת השימוש ב-Cloud SQL Auth Proxy

מפעילים את השימוש ב-Cloud SQL Auth Proxy ב-Cloud SQL באמצעות ConnectorEnforcement.

אם אתם משתמשים במופע עם Private Service Connect, יש מגבלה. אם האכיפה של המחבר מופעלת במופע, אי אפשר ליצור רפליקות לקריאה עבור המופע. באופן דומה, אם למכונה יש רפליקות לקריאה, אי אפשר להפעיל אכיפת מחברים במכונה.

gcloud

הפקודה הבאה אוכפת את השימוש ב-Cloud SQL Connectors.

    gcloud sql instances patch INSTANCE_NAME \
    --connector-enforcement REQUIRED
  

כדי להשבית את האכיפה, משתמשים בשורת הקוד הבאה: --connector-enforcement NOT_REQUIRED העדכון לא מפעיל הפעלה מחדש.

REST v1

הפקודה הבאה אוכפת את השימוש במחברי Cloud SQL

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫project-id: מזהה הפרויקט.
  • ‫instance-id: מזהה המכונה.

ה-method של ה-HTTP וכתובת ה-URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

תוכן בקשת JSON:

{
  "settings": {                     
    "connectorEnforcement": "REQUIRED"    
  }                                             
}   

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "UPDATE",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

כדי להשבית את האכיפה, משתמשים במדיניות "connectorEnforcement": "NOT_REQUIRED" במקום זאת. העדכון לא מפעיל מחדש את המכשיר.

REST v1beta4

הפקודה הבאה אוכפת את השימוש ב-Cloud SQL Connectors.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫project-id: מזהה הפרויקט.
  • ‫instance-id: מזהה המכונה.

ה-method של ה-HTTP וכתובת ה-URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

תוכן בקשת JSON:

{
  "settings": {
    "connectorEnforcement": "REQUIRED"
  }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "UPDATE",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

כדי להשבית את האכיפה, משתמשים במדיניות "connectorEnforcement": "NOT_REQUIRED" במקום זאת. העדכון לא מפעיל מחדש את המכשיר.

טיפים לעבודה עם Cloud SQL Auth Proxy

שימוש ב-Cloud SQL Auth Proxy כדי להתחבר למספר מכונות

אפשר להשתמש בלקוח מקומי אחד של Cloud SQL Auth Proxy כדי להתחבר לכמה מכונות Cloud SQL. הדרך שבה עושים את זה תלויה בשאלה אם משתמשים ב-Unix sockets או ב-TCP.

שקעי TCP

כשמתחברים באמצעות TCP, מציינים יציאה במכונה שבה Cloud SQL Auth Proxy יאזין לכל מכונה של Cloud SQL. כשמתחברים לכמה מכונות של Cloud SQL, כל יציאה שמציינים צריכה להיות ייחודית וזמינה לשימוש במכונה.

לדוגמה:

    # Start the Cloud SQL Auth Proxy to connect to two different Cloud SQL instances.
    # Give the Cloud SQL Auth Proxy a unique port on your machine to use for each Cloud SQL instance.

    ./cloud-sql-proxy "myProject:us-central1:myInstance?port=1433" \
    "myProject:us-central1:myInstance2?port=1234"

    # Connect to "myInstance" using port 1433 on your machine:
    sqlcmd -U myUser -S "127.0.0.1,1433"

    # Connect to "myInstance2" using port 1234 on your machine:
    sqlcmd -U myUser -S "127.0.0.1,1234"
  

פתרון בעיות בחיבורים של Cloud SQL Auth Proxy

קובץ האימג' של Docker של Cloud SQL Auth Proxy מבוסס על גרסה ספציפית של Cloud SQL Auth Proxy. כשגרסה חדשה של Cloud SQL Auth Proxy זמינה, צריך למשוך את הגרסה החדשה של קובץ האימג' של Cloud SQL Auth Proxy Docker כדי שהסביבה תהיה מעודכנת. כדי לראות את הגרסה הנוכחית של Cloud SQL Auth Proxy, אפשר להיכנס ל דף הגרסאות של Cloud SQL Auth Proxy ב-GitHub.

אם אתם לא מצליחים להתחבר למכונה של Cloud SQL באמצעות Cloud SQL Auth Proxy, נסו את הפתרונות הבאים כדי לגלות מה גורם לבעיה.

  • בודקים את הפלט של Cloud SQL Auth Proxy.

    לרוב, הפלט של שרת ה-Proxy ל-Cloud SQL Auth יכול לעזור לכם לקבוע מה מקור הבעיה ואיך לפתור אותה. מעבירים את הפלט לקובץ או צופים בטרמינל של Cloud Shell שבו הפעלתם את Cloud SQL Auth Proxy.

  • אם אתם מקבלים שגיאה 403 notAuthorized ואתם משתמשים בחשבון שירות כדי לאמת את Cloud SQL Auth Proxy, ודאו שלחשבון השירות יש את ההרשאות הנכונות.

    כדי לבדוק את חשבון השירות, מחפשים את המזהה שלו בדף IAM. צריכה להיות לו ההרשאה cloudsql.instances.connect. התפקידים המוגדרים מראש Cloud SQL Admin,‏ Client ו-Editor כוללים את ההרשאה הזו.

  • אם אתם מתחברים מ-App Engine ומופיעה השגיאה 403 notAuthorized, בדקו את הערך app.yaml של cloud_sql_instances כדי לוודא ששם החיבור של המכונה נכון ומאוית נכון. שמות החיבור של המכונות מוצגים תמיד בפורמט PROJECT:REGION:INSTANCE.

    בנוסף, צריך לוודא שלחשבון השירות של App Engine (לדוגמה, ‎$PROJECT_ID@‎) יש את תפקיד הלקוח של Cloud SQL ב-IAM.

    אם שירות App Engine נמצא בפרויקט אחד (פרויקט א') ומסד הנתונים נמצא בפרויקט אחר (פרויקט ב'), השגיאה הזו מציינת שחשבון השירות של App Engine לא קיבל את תפקיד ה-IAM של לקוח Cloud SQL בפרויקט עם מסד הנתונים (פרויקט ב').

  • חשוב להפעיל את Cloud SQL Admin API.

    אם לא, יופיע פלט כמו Error 403: Access Not Configured ביומני Cloud SQL Auth Proxy.

  • אם אתם כוללים כמה מכונות ברשימת המכונות, הקפידו להשתמש בפסיק כמפריד, ללא רווחים. אם אתם משתמשים ב-TCP, הקפידו לציין יציאות שונות לכל מופע.

  • אם אתם מתחברים באמצעות שקעי UNIX, ודאו שהשקעים נוצרו על ידי הצגת הספרייה שסיפקתם כשהפעלתם את Cloud SQL Auth Proxy.

  • אם יש לכם מדיניות חומת אש ליציאה, ודאו שהיא מאפשרת חיבורים ליציאה 3307 במופע היעד של Cloud SQL.

  • כדי לוודא ש-Cloud SQL Auth Proxy הופעל כמו שצריך, אפשר לבדוק את היומנים בקטע Operations > Logging > Logs explorer במסוףGoogle Cloud . אם הפעולה בוצעה ללא שגיאות, התגובה אמורה להיות דומה לדוגמה הבאה:

    2021/06/14 15:47:56 Listening on /cloudsql/$PROJECT_ID:$REGION:$INSTANCE_NAME/1433 for $PROJECT_ID:$REGION:$INSTANCE_NAME
    2021/06/14 15:47:56 Ready for new connections
    
  • בעיות במכסות: כשחורגים מהמכסה של Cloud SQL Admin API, ‏Cloud SQL Auth Proxy מופעל עם הודעת השגיאה הבאה:

    There was a problem when parsing a instance configuration but ignoring due
    to the configuration. Error: googleapi: Error 429: Quota exceeded for quota
    metric 'Queries' and limit 'Queries per minute per user' of service
    'sqladmin.googleapis.com' for consumer 'project_number:$PROJECT_ID.,
    rateLimitExceeded
    

    אחרי שאפליקציה מתחברת לשרת ה-proxy, שרת ה-proxy מדווח על השגיאה הבאה:

    failed to refresh the ephemeral certificate for $INSTANCE_CONNECTION_NAME:
    googleapi: Error 429: Quota exceeded for quota metric 'Queries' and limit
    'Queries per minute per user' of service 'sqladmin.googleapis.com' for
    consumer 'project_number:$PROJECT_ID., rateLimitExceeded
    

    פתרון: צריך לזהות את מקור הבעיה במכסה. לדוגמה, יכול להיות שאפליקציה משתמשת במחבר בצורה לא נכונה ויוצרת חיבורים חדשים שלא לצורך. אפשרות נוספת היא לפנות לתמיכה כדי לבקש הגדלה של מכסת Cloud SQL Admin API. אם שגיאת המכסה מופיעה בהפעלה, צריך לפרוס מחדש את האפליקציה כדי להפעיל מחדש את ה-proxy. אם שגיאת המכסה מופיעה אחרי ההפעלה, אין צורך בפריסה מחדש.

המאמרים הבאים