Cloud SQL Auth Proxy を使用して接続する

このページでは、Cloud SQL Auth Proxy を使用して Cloud SQL インスタンスに接続する方法について説明します。

Cloud SQL Auth Proxy の動作の詳細については、Cloud SQL Auth Proxy についてをご覧ください。

概要

Cloud SQL インスタンスへの接続には、Cloud SQL Auth Proxy を使用することをおすすめします。Cloud SQL Auth Proxy は、次のことを行います。

  • パブリック IP エンドポイントとプライベート IP エンドポイントの両方で動作する。
  • ユーザーまたはサービス アカウントの認証情報を使用して接続を検証する。
  • Cloud SQL インスタンスに対して認可された SSL / TLS レイヤに接続をラップする。

一部の Google Cloud サービスとアプリケーションは、Cloud SQL Auth Proxy を使用して暗号化と認可を行い、パブリック IP パスの接続を可能にします。

Google Kubernetes Engine で実行されるアプリケーションは、Cloud SQL Auth Proxy を使用して接続できます。

基本的な使用方法については、Cloud SQL Auth Proxy を使用するためのクイックスタートをご覧ください。

ローカルマシンまたは Compute Engine から sqlcmd クライアントを使用して、Cloud SQL Auth Proxy の有無を問わず接続することもできます。

準備

Cloud SQL インスタンスに接続するには、次の作業が必要です。

    • ユーザーまたはサービス アカウントについて、そのアカウントに Cloud SQL クライアントのロールがあることを確認します。このロールには、プリンシパルがプロジェクト内のすべての Cloud SQL インスタンスに接続することを承認する cloudsql.instances.connect 権限が含まれています。

      IAM ページに移動

    • 必要に応じて、1 つの特定の Cloud SQL インスタンスにのみ接続する権限をアカウントに付与する IAM 条件を IAM ポリシー バインディングに含めることができます。
  1. Enable the Cloud SQL Admin API.

    Enable the API

  2. gcloud CLI をインストールして初期化します。
  3. 省略可。Cloud SQL Auth Proxy の Docker クライアントをインストールします。

Cloud SQL Auth Proxy をダウンロードする

Linux 64 ビット

  1. Cloud SQL Auth Proxy をダウンロードします。
    curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.14.1/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.14.1/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.14.1/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.14.1/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.14.1/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.14.1/cloud-sql-proxy.x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、Cloud SQL Auth Proxy をダウンロードします。ファイル名を cloud-sql-proxy.exe に変更します。

Cloud SQL Auth Proxy Docker イメージ

Cloud SQL Auth Proxy には、distrolessalpinebuster など、さまざまなコンテナ イメージがあります。デフォルトの Cloud SQL Auth Proxy コンテナ イメージでは、シェルを含まない distroless を使用します。シェルまたは関連ツールが必要な場合は、alpine または buster を基盤とするイメージをダウンロードします。詳細については、Cloud SQL Auth Proxy コンテナ イメージをご覧ください。

次のコマンドを使用して、ローカルマシンに最新のイメージを Docker で pull できます。

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

その他の OS

ここに記載されていないその他のオペレーティング システムの場合は、ソースから Cloud SQL Auth Proxy をコンパイルできます。

Cloud SQL Auth Proxy を起動する

TCP ソケットまたは Cloud SQL Auth Proxy の Docker イメージを使用して、Cloud SQL Auth Proxy を起動できます。Cloud SQL Auth Proxy バイナリは、コマンドラインで指定された 1 つ以上の Cloud SQL インスタンスに接続し、TCP ソケットとしてローカル接続を開きます。アプリケーション コードやデータベース管理クライアント ツールなど、他のアプリケーションやサービスは、これらの TCP ソケットの接続を介して Cloud SQL インスタンスに接続できます。

TCP ソケット

TCP 接続の場合、Cloud SQL Auth Proxy は、デフォルトでは localhost127.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 をコピーします。これは、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

Docker コンテナで Cloud SQL Auth Proxy を動作させるには、Google Container Registry から入手できる Cloud SQL Auth Proxy Docker イメージを使用します。

次のコマンドで、TCP ソケットまたは Unix ソケットのどちらかを使用して、Cloud SQL Auth Proxy を起動できます。このオプションは、Cloud SQL インスタンスを識別するための接続文字列として INSTANCE_CONNECTION_NAME を使用します。INSTANCE_CONNECTION_NAME は、Google Cloud Console のインスタンスの [概要] ページに表示されます。また、次のコマンドを実行して確認することもできます。

gcloud sql instances describe INSTANCE_NAME

例: myproject:myregion:myinstance

言語や環境に応じて、TCP ソケットまたは Unix ソケットのどちらかを使用して Cloud SQL Auth Proxy を起動できます。Unix ソケットは、Java プログラミング言語で作成されたアプリケーションや Windows 環境ではサポートされていません。

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.14.1 \\
  --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 の行を含めないでください。

Cloud SQL Auth Proxy がローカルホストの外部に公開されないように、常に -p に 127.0.0.1 の接頭辞を指定します。インスタンス パラメータに含まれる「0.0.0.0」は、Docker コンテナの外側からポートにアクセスできるようにするために必要です。

Unix ソケットの使用

docker run -d -v /cloudsql:/cloudsql \\
  -v PATH_TO_KEY_FILE:/path/to/service-account-key.json \\
  gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.1 --unix-socket=/cloudsql \\
  --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 の行を含めないでください。

コンテナ最適化イメージを使用している場合は、/cloudsql の代わりに書き込み可能なディレクトリを使用します。たとえば、次のようにします。

-v /mnt/stateful_partition/cloudsql:/cloudsql

複数のインスタンスをカンマで区切って指定できます。また、Compute Engine メタデータを使用して接続対象のインスタンスを動的に決定することもできます。Cloud SQL Auth Proxy パラメータについての詳細をご覧ください。

sqlcmd クライアントに接続する

Debian、Ubuntu

Debian/Ubuntu については、該当する SQL Server コマンドライン ツールをインストールするをご覧ください。

CentOS / RHEL

CentOS/RHEL の場合、該当する SQL Server コマンドライン ツールをインストールするをご覧ください。

openSUSE

openSUSE の場合、該当する SQL Server コマンドライン ツールをインストールするをご覧ください。

他のプラットフォーム

SQL サーバーをインストールするためのランディング ページと、SQL Server のダウンロード ページをご覧ください。

使用する接続文字列は、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 のサポートページをご覧ください。

アプリケーションに接続する

TCP ソケットに接続できる任意の言語を使用して、Cloud SQL Auth Proxy に接続できます。アプリケーションでどのように連携するのかを把握できるように、GitHub の詳細な例からコード スニペットをいくつか紹介します。

TCP で接続

Cloud SQL Auth Proxy 呼び出しステートメント:

./cloud-sql-proxy INSTANCE_CONNECTION_NAME &

Python

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

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

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

注:

  • CLOUD_SQL_CONNECTION_NAME は <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME> のように指定する必要があります。
  • 引数 ipTypes=PRIVATE を使用すると、SocketFactory はインスタンスに関連付けられたプライベート IP を使用して接続するようになります。
  • pom.xml ファイルの JDBC ソケット ファクトリ バージョン要件については、こちらをご覧ください。


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

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

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

Go

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

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#

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

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

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

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

このスニペットをウェブ アプリケーションのコンテキストで表示するには、GitHub の README をご覧ください。

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

Cloud SQL Auth Proxy コマンドライン オプションの使用方法のその他の例については、Cloud SQL Auth Proxy GitHub リポジトリの README をご覧ください。

Cloud SQL Auth Proxy の認証オプション

これらのオプションではすべて、Cloud SQL インスタンスを識別するための接続文字列として INSTANCE_CONNECTION_NAME を使用します。INSTANCE_CONNECTION_NAME は、Google Cloud Console のインスタンスの [概要] ページに表示されます。また、次のコマンドを実行して確認することもできます。

gcloud sql instances describe --project PROJECT_ID INSTANCE_CONNECTION_NAME

例: gcloud sql instances describe --project myproject myinstance

これらのオプションの中には、アカウントの RSA 秘密鍵を含む JSON 認証情報ファイルを使用するものもあります。サービス アカウントの JSON 認証情報ファイルを作成する手順については、サービス アカウントの作成をご覧ください。

Cloud SQL Auth Proxy では、環境に応じて、認証のための代替手段が複数用意されています。Cloud SQL Auth Proxy は、次の順序で各項目をチェックし、最初に見つかったものを使用して認証を試みます。

  1. credentials-file フラグによって指定された認証情報。

    サービス アカウントを使用して、関連付けられた JSON ファイルを作成してダウンロードし、Cloud SQL Auth Proxy を起動するとき、そのファイルのパスに --credentials-file フラグを設定します。サービス アカウントには、Cloud SQL インスタンスに対する必要な権限が付与されていることが必要です。

    コマンドラインでこのオプションを使用するには、--credentials-file フラグを JSON 認証情報ファイルのパスとファイル名に設定して、cloud-sql-proxy コマンドを呼び出します。パスは現在の作業ディレクトリへの絶対パス、または相対パスとして設定できます。例:

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

    サービス アカウントに IAM ロールを追加する方法の詳細については、サービス アカウントへのロールの付与をご覧ください。

    Cloud SQL がサポートするロールの詳細については、Cloud SQL に適用される IAM のロールをご覧ください。

  2. アクセス トークンによって指定された認証情報。

    アクセス トークンを作成し、OAuth 2.0 アクセス トークンに --token フラグを設定して cloud-sql-proxy コマンドを呼び出します。例:
    ./cloud-sql-proxy --token ACCESS_TOKEN \
    INSTANCE_CONNECTION_NAME
      
  3. 環境変数によって指定された認証情報。

    このオプションは、--credentials-file コマンドライン引数を使用する代わりに、GOOGLE_APPLICATION_CREDENTIALS 環境変数で設定する JSON 認証情報ファイルを指定する点を除けば、--credentials-file フラグを使用する場合と類似しています。
  4. 認証済みの gcloud CLI クライアントからの認証情報。

    gcloud CLI をインストールし、個人アカウントで認証した場合は、Cloud SQL Auth Proxy で同じアカウント認証情報を使用できます。この方法は、開発環境の運用を開始する際に特に便利です。

    Cloud SQL Auth Proxy で gcloud CLI 認証情報を使用できるようにするには、次のコマンドを使用して gcloud CLI を認証します。

    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 の認証に必要な権限が付与されています。この 2 つのインスタンスが別々のプロジェクトに属している場合は、Cloud SQL インスタンスが属するプロジェクトに Compute Engine インスタンスのサービス アカウントを追加する必要があります。

  6. 環境のデフォルトのサービス アカウント

    前述のいずれの場所でも認証情報を見つけることができない場合、Cloud SQL Auth Proxy はサーバー間での本番環境アプリケーションの認証の設定に記載されたロジックに従います。一部の環境(Compute Engine、App Engine など)では、アプリケーションがデフォルトで認証に使用できるデフォルトのサービス アカウントが用意されています。デフォルトのサービス アカウントを使用する場合は、アカウントにロールと権限で概説している権限が付与されている必要があります。Google Cloud の認証のアプローチについて詳しくは、認証の概要をご覧ください。

サービス アカウントを作成する

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. Cloud SQL インスタンスを含むプロジェクトを選択します。
  3. [サービス アカウントを作成] をクリックします。
  4. [サービス アカウント名] 欄に、サービス アカウントのわかりやすい名前を入力します。
  5. [サービス アカウント ID] を一意のわかりやすい値に変更し、[作成して続行] をクリックします。
  6. [ロールを選択] 項目をクリックして、以下のいずれかのロールを選択します。
    • [Cloud SQL] > [Cloud SQL クライアント]
    • [Cloud SQL] > [Cloud SQL 編集者]
    • [Cloud SQL] > [Cloud SQL 管理者]
  7. [完了] をクリックして、サービス アカウントの作成を完了します。
  8. 新しいサービス アカウントの操作メニューをクリックし、[鍵を管理] を選択します。
  9. [鍵を追加] プルダウン メニューをクリックして、[新しい鍵を作成] をクリックします。
  10. 鍵のタイプが JSON であることを確認し、[作成] をクリックします。

    秘密鍵ファイルがマシンにダウンロードされます。秘密鍵ファイルは、別の場所に移動できます。安全な場所に鍵ファイルを保管してください。

プライベート IP での Cloud SQL Auth Proxy の使用

プライベート IP を使用して Cloud SQL インスタンスに接続するには、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

Private Service Connect が有効化されたインスタンスで Cloud SQL Auth Proxy を使用する

Private Service Connect が有効化されている Cloud SQL インスタンスに、Cloud SQL Auth Proxy を使用して接続できます。

Cloud SQL Auth Proxy は、承認済みネットワークや SSL の構成を必要とせず、このインスタンスに安全にアクセスできるコネクタです。

Cloud SQL Auth Proxy クライアントの接続を許可するには、インスタンスに指定された推奨 DNS 名に一致する DNS レコードを設定する必要があります。DNS レコードは、DNS リソースとドメイン名のマッピングです。

Cloud SQL Auth Proxy を使用して Private Service Connect が有効化されているインスタンスに接続する方法については、Cloud SQL Auth Proxy を使用して接続するをご覧ください。

別のプロセスで Cloud SQL Auth Proxy を実行する

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"

Docker コンテナでの Cloud SQL Auth Proxy の実行

Docker コンテナで Cloud SQL Auth Proxy を動作させるには、Google Container Registry から入手できる Cloud SQL Auth Proxy Docker イメージを使用します。Cloud SQL Auth Proxy Docker イメージは、次の gcloud コマンドを使用してインストールできます。

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

次のコマンドで、TCP ソケットまたは Unix ソケットのどちらかを使用して、Cloud SQL Auth Proxy を起動できます。

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.14.1 \
      --address 0.0.0.0 \
      --credentials-file /path/to/service-account-key.json \
      INSTANCE_CONNECTION_NAME

Unix ソケット

    docker run -d \
      -v /PATH_TO_HOST_TARGET:/PATH_TO_GUEST_TARGET \
      -v PATH_TO_KEY_FILE:/path/to/service-account-key.json \
      gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.1 --unix-socket /cloudsql \
      --credentials-file /path/to/service-account-key.json/PATH_TO_KEY_FILE \
      INSTANCE_CONNECTION_NAME

コンテナ最適化イメージを使用している場合は、/cloudsql の代わりに書き込み可能なディレクトリを使用します。たとえば、次のようにします。

v /mnt/stateful_partition/cloudsql:/cloudsql

Compute Engine インスタンスによって提供される認証情報を使用している場合は、credential_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 の使用を適用する

ConnectorEnforcement を使用して Cloud SQL 内での Cloud SQL Auth Proxy の使用を有効にします。

Private Service Connect が有効になっているインスタンスを使用している場合は、制限があります。インスタンスでコネクタ適用が有効になっている場合、そのインスタンスのリードレプリカは作成できません。同様に、インスタンスにリードレプリカがある場合、インスタンスでコネクタ適用を有効にすることはできません。

gcloud

次のコマンドは、Cloud SQL コネクタの使用を強制します。

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

適用を無効にするには、コードの次の行を使用します。 --connector-enforcement NOT_REQUIRED 更新によって再起動はトリガーされません。

REST v1

次のコマンドは、Cloud SQL コネクタの使用を強制します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID。
  • instance-id: インスタンス ID

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 コネクタの使用を強制します。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID。
  • instance-id: インスタンス ID

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 を使用した複数のインスタンスへの接続

1 つのローカル Cloud SQL Auth Proxy クライアントを使用して、複数の Cloud SQL インスタンスに接続できます。これを行う方法は、Unix ソケットまたは 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 接続のトラブルシューティング

Cloud SQL Auth Proxy Docker イメージは、Cloud SQL Auth Proxy の特定のバージョンに基づいています。Cloud SQL Auth Proxy の新しいバージョンが利用可能になったら、Cloud SQL Auth Proxy Docker イメージの新しいバージョンを pull して、環境を最新の状態に保ってください。Cloud SQL Auth Proxy の最新バージョンは Cloud SQL Auth Proxy GitHub リリースページで確認できます。

Cloud SQL Auth Proxy を使用した Cloud SQL インスタンスへの接続の問題が発生した場合は、原因を特定するため、以下の点を確認してください。

  • インスタンスへの接続に IP アドレスを使用し、書き込みエンドポイントを使用していないことを確認します。

  • Cloud SQL Auth Proxy の出力を確認します。

    Cloud SQL Auth Proxy の出力は、多くの場合、問題の原因と解決方法を判断するのに役立ちます。出力をファイルに保存するか、Cloud SQL Auth Proxy を起動した Cloud Shell ターミナルを確認してください。

  • 403 notAuthorized エラーが発生し、サービス アカウントを使用して Cloud SQL Auth Proxy を認証する場合は、サービス アカウントに正しい権限が付与されていることを確認します。

    サービス アカウントを確認するには、IAM ページでその ID を検索します。cloudsql.instances.connect 権限が必要です。この権限は、事前定義ロールの Cloud SQL AdminClientEditor に含まれています。

  • App Engine から接続する際に 403 notAuthorized エラーが発生した場合は、app.yaml の値 cloud_sql_instances にスペルミスや不正なインスタンス接続名がないか確認してください。インスタンス接続名は常に PROJECT:REGION:INSTANCE の形式です。

    また、App Engine サービス アカウント(たとえば、$PROJECT_ID@appspot.gserviceaccount.com)に Cloud SQL クライアント IAM ロールがあることを確認します。

    App Engine サービスが 1 つのプロジェクト(プロジェクト A)に存在し、データベースは別のプロジェクト(プロジェクト B)にある場合、このエラーは、App Engine サービス アカウントには、そのデータベース(プロジェクト B)があるプロジェクトにおいて Cloud SQL クライアント IAM のロールが付与されていないことを意味します。

  • 必ず Cloud SQL Admin API を有効にしてください。

    有効になっていない場合は、Cloud SQL Auth Proxy に Error 403: Access Not Configured のような出力が含まれています。

  • インスタンス リストに複数のインスタンスを含めている場合は、区切り記号としてカンマを使用していることを確認します。TCP を使用している場合は、インスタンスごとに異なるポートを指定していることを確認してください。

  • UNIX ソケットを使用して接続している場合は、Cloud SQL Auth Proxy の起動時に指定したディレクトリを一覧表示して、ソケットが作成されていることを確認します。

  • 送信ファイアウォール ポリシーがある場合は、ターゲット Cloud SQL インスタンス上のポート 3307 への接続が許可されていることを確認してください。

  • Google Cloud コンソールの [オペレーション] > [ロギング] > [ログ エクスプローラ] でログを調べることで、Cloud SQL Auth Proxy が正しく開始されていることを確認できます。正常なオペレーションは次のようになります。

    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
    

    アプリケーションがプロキシに接続すると、プロキシから次のエラーが報告されます。

    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 割り当ての増加をリクエストします。起動時に割り当てエラーが発生した場合は、アプリケーションを再デプロイしてプロキシを再起動する必要があります。起動後に割り当てエラーが発生した場合、再デプロイは必要ありません。

次のステップ