外部アプリケーションから Cloud SQL に接続する

このページでは、Google Cloud の外部で実行されるアプリケーションから Cloud SQL への接続を確立する方法について説明します。

Cloud SQL への接続に関するさまざまなオプションについては、外部アプリケーション用の接続オプションをご覧ください。パブリック IP の構成方法については、パブリック IP を構成するをご覧ください。

データベース接続は、サーバーと接続元アプリケーションのリソースを消費します。アプリケーションのフットプリントを最小限に抑え、Cloud SQL の接続制限を超える可能性を少なくするには、常に適切な接続管理方法を使用してください。 詳細については、データベース接続の管理をご覧ください。

始める前に

アプリケーションへのアクセスを付与しても、データベース ユーザー アカウントがインスタンスに自動的に接続できるようになるわけではありません。インスタンスに接続するには、接続に使用できるデータベース ユーザー アカウントが必要です。新しいインスタンスの場合、デフォルトのユーザー アカウントを構成しておく必要があります。詳細

Cloud SQL インスタンスに接続するには、次の方法を使用できます。

プロキシを使用して外部アプリケーションから接続する

ローカルテスト環境用(本番環境用ではなく)に Cloud SQL Proxy を設定する場合は、これらの手順の代わりにプロキシ クイックスタートを使用してください。

Java または Go プログラミング言語を使用している場合、Cloud SQL Proxy を使用する以外の代替手段がいくつかあります。詳細

1. API を有効にする

Cloud SQL Admin API を有効にします。

APIを有効にする

2. ローカルマシンにプロキシ クライアントをインストールする

Linux 64 ビット

  1. プロキシをダウンロードします。
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

Linux 32 ビット

  1. プロキシをダウンロードします。
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

macOS 64 ビット

  1. プロキシをダウンロードします。
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

macOS 32 ビット

  1. プロキシをダウンロードします。
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

Windows 64 ビット

https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイル名を cloud_sql_proxy.exe に変更します。

Windows 32 ビット

https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイル名を cloud_sql_proxy.exe に変更します。
お使いのオペレーティング システムがここに記載されていない場合は、ソースからプロキシをコンパイルすることもできます。

3. プロキシを認証する方法を決定する

プロキシ認証オプションの詳細については、こちらをご覧ください

4. 認証方法で必要な場合は、サービス アカウントを作成する

  1. Google Cloud Console の [サービス アカウント] ページに移動します。

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

  2. Cloud SQL インスタンスを含むプロジェクトを選択します。
  3. [サービス アカウントを作成] をクリックします。
  4. [サービス アカウントの作成] ダイアログで、わかりやすいサービス アカウント名を指定します。
  5. [役割] で、次のいずれかの役割を選択します。
    • [Cloud SQL] > [Cloud SQL クライアント]
    • [Cloud SQL] > [Cloud SQL 編集者]
    • [Cloud SQL] > [Cloud SQL 管理者]

    あるいは、[プロジェクト] > [編集者] の順に選択して、編集者の基本的な役割を使用できますが、編集者の役割には Google Cloud 全体に対する権限が含まれています。

    これらの役割が表示されない場合、Google Cloud ユーザーに resourcemanager.projects.setIamPolicy 権限がない可能性があります。 権限を確認するには、Google Cloud Console の IAM ページにアクセスし、自分のユーザー ID を検索します。

  6. [サービス アカウント ID] を一意のわかりやすい値に変更します。
  7. [新しい秘密鍵の提供] をクリックし、キーのタイプが JSON であることを確認します。
  8. [作成] をクリックします。

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

5. プロキシに対するインスタンスの指定方法を決定する

プロキシ インスタンス指定オプションの詳細については、こちらをご覧ください

6. プロキシを開始する

プロキシに渡すオプションは、前に選択した認証とインスタンス指定のオプションによって異なります。

言語や環境に応じて、TCP ソケットまたは Unix ソケットのどちらかを使用してプロキシを開始できます。

TCP ソケット

  1. [インスタンスの詳細] ページからインスタンス接続名をコピーします。

    例: myproject:us-central1:myinstance

  2. サービス アカウントを使用してプロキシを認証する場合は、サービス アカウントを作成したときに作成された秘密鍵ファイルのクライアント マシン上での場所を記録しておきます。
  3. プロキシを開始します。

    考えられるプロキシ呼び出し文字列を以下にいくつか示します。

    • Cloud SDK 認証を使用する場合
      ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306
      
      指定されたポートは、ローカル データベース サーバーなどがまだ使用していないものにする必要があります。
    • サービス アカウントと明示的なインスタンス指定を使用する場合(本番環境で推奨)
      ./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306 \
                        -credential_file=<PATH_TO_KEY_FILE> &
      

    プロキシ オプションの詳細については、プロキシを認証するためのオプションインスタンスを指定するためのオプションをご覧ください。

Unix ソケット

  1. 明示的なインスタンス指定を使用する場合は、[インスタンスの詳細] ページからインスタンス接続名をコピーします。
  2. プロキシ ソケットを格納するディレクトリを作成します。
    sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
  3. サービス アカウントを使用してプロキシを認証する場合は、サービス アカウントを作成したときに作成された秘密鍵ファイルのクライアント マシン上での場所を記録しておきます。
  4. 新しいターミナル ウィンドウを開き、プロキシを開始します。

    考えられるプロキシ呼び出し文字列を以下にいくつか示します。

    • サービス アカウントと明示的なインスタンス指定を使用する場合(本番環境で推奨)
      ./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME> \
                        -credential_file=<PATH_TO_KEY_FILE> &
    • Cloud SDK 認証と自動インスタンス検出を使用する場合
      ./cloud_sql_proxy -dir=/cloudsql &

    専用のターミナルでプロキシを開始することが最善です。この場合、他のプログラムからの出力と混ざることなく出力をモニタリングできます。

    プロキシ オプションの詳細については、プロキシを認証するためのオプションインスタンスを指定するためのオプションをご覧ください。

  5. Unix ソケットを使用して Cloud SQL Proxy を使用する Cloud SQL に接続する場合、ソケットのファイル名の長さがシステムの上限を超えていないことを確認してください。システムによって異なりますが、通常は 91~108 文字です。Linux では、この長さが通常 108 文字と定義され、次のコマンドで確認できます。
    cat /usr/include/linux/un.h | grep "define UNIX_PATH_MAX"

7. プロキシを使用して Cloud SQL に接続するようにアプリケーションを更新する

プロキシを使用して Cloud SQL インスタンスに接続するために必要なコードの文の細部は、使用する言語とフレームワークによって異なります。

プロキシへの接続には、TCP や Unix ソケットの場合と同じ方法を使用します。ただし、プロキシの呼び出し方法によって異なります。

TCP ソケット

TCP ソケットでは、プロキシをローカルホストとして使用できます。

127.0.0.1:3306

Unix ソケット

Unix ソケットでは、次のパスを使用してプロキシを使用できます。

PROXY_PATH/INSTANCE_CONNECTION_NAME;
ここで、PROXY_PATH は、プロキシの起動時に -dir オプションで設定したディレクトリのパスです。このドキュメントの例では /cloudsql を使用します。インスタンスの接続名を見つけるには、Google Cloud Console のその [インスタンスの詳細] ページで、または PROJECT-ID:REGION:INSTANCE_NAME を使用します。

お困りの場合、プロキシのトラブルシューティングについては、Cloud SQL Proxy 接続のトラブルシューティングをご覧ください。または、Cloud SQL のサポートページを参照してください。

言語固有の情報と例

Unix または TCP ソケットに接続できる任意の言語を使用して、プロキシに接続できます。アプリケーションでどのように連携するのかを把握できるように、プロキシの呼び出しと接続ステートメントの例をいくつか次に紹介します。

Go

Go プログラミング言語では、次の 2 とおりの方法で Cloud SQL Proxy を使用できます。

  1. Go Proxy ライブラリを使用する
  2. Proxy をコンパニオン プロセスとして実行する

Go Proxy ライブラリ

ライブラリを使用する場合、プロキシを独自のプロセスとして明示的に開始する必要がないため、Go プログラムから Cloud SQL に接続するにはこれが最も簡単な方法です。

import (
    "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/mysql"
)
...
cfg := mysql.Cfg(INSTANCE_CONNECTION_NAME, DATABASE_USER, PASSWORD)
cfg.DBName = DATABASE_NAME
db, err := mysql.DialCfg(cfg)

詳しくは、Cloud SQL Proxy の Github ページをご覧ください。

コンパニオン プロセス

また、プロキシをコンパニオン プロセスとして実行し、アプリケーションから接続することもできます。

簡潔にするため、このプロキシ呼び出しステートメントではローカル Cloud SDK 認証を使用しています。実際の呼び出しステートメントは、認証方法やインスタンスの指定方法によって異なる場合があります。Cloud SQL Proxy を認証するためのオプションをご覧ください。

TCP ソケット

プロキシ呼び出しステートメント:

./cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306 &

接続ステートメント:

import (
       "database/sql"
        _ "github.com/go-sql-driver/mysql"
)

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s",
       DATABASE_USER,
       PASSWORD,
       "127.0.0.1:3306",
       DATABASE_NAME)
db, err := sql.Open("mysql", dsn)

Unix ソケット

プロキシ呼び出しステートメント:

./cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME] -dir=/cloudsql &

接続ステートメント:

import (
       "database/sql"
        _ "github.com/go-sql-driver/mysql"
)

dsn := fmt.Sprintf("%s:%s@unix(/cloudsql/%s)/%s",
       DATABASE_USER,
       PASSWORD,
       INSTANCE_CONNECTION_NAME,
       DATABASE_NAME)
db, err := sql.Open("mysql", dsn)

Java

Java プログラミング言語では、Unix ソケットのネイティブ サポートは提供されていません。TCP ソケット、または Cloud SQL Proxy との UNIX ソケット サポートを提供するライブラリを使用できますが、IP アドレスをホワイトリストに登録することなく第 2 世代インスタンスに接続する最も簡単な方法は、JDBC ソケット ファクトリを使用することです。

JDBC ソケット ファクトリは、クライアント側プロキシ ソフトウェアの代わりとなるもので、Cloud SQL Proxy と同様に、Cloud SQL API を有効にする必要があります。ソケット ファクトリは、プロキシと同じレベルの暗号化を提供し、Cloud SDK 認証情報を使用して認証します。ソケット ファクトリを使用する前に、Cloud SDK をインストールして認証する必要があります。

コードのサンプルについては、JDBC ドライバ用の Cloud SQL ソケット ファクトリをご覧ください。手順については、README をご覧ください。

PHP

PDO と TCP

プロキシを呼び出します。

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

次の例では、PHP Data Objects(PDO)を使用して Cloud SQL に接続します。

// Use a Data source name (DSN) to connect to Cloud SQL through the proxy
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=DATABASE_NAME';
// Instantiate your DB using the DSN, username, and password
$dbUser = 'DATABASE_USER';
$dbPass = 'PASSWORD';
$db = new PDO($dsn, $dbUser, $dbPass);

PDO ソケットと Unix ソケット

プロキシを呼び出します。

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql &

次の例では、PDO を使用して Cloud SQL に接続します。

// Use a Data source name (DSN) to connect to Cloud SQL through the proxy
$dsn = sprintf('mysql:unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME;dbname=DATABASE_NAME';
// Instantiate your DB using the DSN, username, and password
$dbUser = 'DATABASE_USER';
$dbPass = 'PASSWORD';
$db = new PDO($dsn, $dbUser, $dbPass);

mysqli と TCP

プロキシを呼び出します。

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

次の例では、mysqli を使用して Cloud SQL に接続します。

// Instantiate your DB using the database host, port, name, username, and password
$dbName = 'DATABASE_NAME';
$dbUser = 'DATABASE_USER';
$dbPass = 'PASSWORD';
$mysqli = new mysqli('127.0.0.1', $dbUser, $dbPass, $dbName, 3306);

mysqli と Unix ソケット

プロキシを呼び出します。

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql &

次の例では、mysqli を使用して Cloud SQL に接続します。

// Instantiate your DB using the database name, socket, username, and password
$dbName = 'DATABASE_NAME';
$dbUser = 'DATABASE_USER';
$dbPass = 'PASSWORD';
$dbSocket = '/cloudsql/INSTANCE_CONNECTION_NAME';
$mysqli = new mysqli(null, $dbUser, $dbPass, $dbName, null, $dbSocket);

Python

簡潔にするため、このプロキシ呼び出しステートメントではローカル Cloud SDK 認証を使用しています。実際の呼び出しステートメントは、認証方法やインスタンスの指定方法によって異なる場合があります。詳細

PyMySQL と TCP

プロキシを呼び出します。

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

接続ステートメント:

import pymysql
connection = pymysql.connect(host='127.0.0.1',
                             user='DATABASE_USER',
                             password='PASSWORD',
                             db='DATABASE_NAME')

PyMySQL と UNIX

プロキシを呼び出します。

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql &

接続ステートメント:

import pymysql
connection = pymysql.connect(unix_socket='/cloudsql/' + INSTANCE_CONNECTION_NAME,
                             user='DATABASE_USER',
                             password='PASSWORD',
                             db='DATABASE_NAME')

SQLAlchemy と TCP

プロキシを呼び出します。

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

接続ステートメント:

from sqlalchemy import create_engine
  engine = create_engine('mysql+pymysql://DATABASE_USER:PASSWORD@127.0.0.1/DATABASE_NAME')

SQLAlchemy と Unix

プロキシを呼び出します。

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql &

接続ステートメント:

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://DATABASE_USER:PASSWORD@/DATABASE_NAME?unix_socket=/cloudsql/INSTANCE_CONNECTION_NAME')

Ruby

mysql2 と TCP

プロキシを呼び出します。

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

次の例では、mysql2 RubyGem を使用して Cloud SQL に接続します。

require "mysql2"
client = Mysql2::Client.new host: "127.0.0.1", port: 3306,
    database: "DATABASE_NAME", username: "DATABASE_USER",
    password: "PASSWORD"

mysql2 と Unix ソケット

プロキシを呼び出します。

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql &

次の例では、mysql2 RubyGem を使用して Cloud SQL に接続します。

require "mysql2"
client = Mysql2::Client.new socket: "/cloudsql/CONNECTION_NAME",
    database: "DATABASE_NAME", username: "DATABASE_USER",
    password: "PASSWORD"

Rails と TCP

プロキシを呼び出します。

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

config/databases.yml では、次の構成を使用します。

mysql_settings: &mysql_settings
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: DATABASE_USER
  password: PASSWORD
  database: DATABASE_NAME
  host: 127.0.0.1:3306

Rails と Unix ソケット

プロキシを呼び出します。

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql &

config/databases.yml では、次の構成を使用します。

mysql_settings: &mysql_settings
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: DATABASE_USER
  password: PASSWORD
  database: DATABASE_NAME
  socket: /cloudsql/INSTANCE_CONNECTION_NAME

パブリック IP 接続のアクセスを構成する

アプリケーションが接続に使用するパブリック IP アドレスを承認することで、Cloud SQL インスタンスへのアクセスをアプリケーションに許可できます。

承認済みネットワークとしてプライベート ネットワーク(10.x.x.x など)を指定することはできません。

第 2 世代インスタンスのパブリック IP アドレス:

  • IPv6: 第 2 世代インスタンスは IPv6 をサポートしていません。
  • IPv4: 第 2 世代インスタンスには静的 IPv4 アドレスが自動的に割り当てられます。インスタンスがオフ(非アクティブ)の間も常に、IP アドレスにわずかな料金がかかります。

第 1 世代インスタンスのパブリック IP アドレス:

第 1 世代インスタンスの場合、Cloud SQL は IPv4 と IPv6 の両方のアドレスでのパブリック IP 接続をサポートします。どちらか一方または両方のプロトコルを使用して接続できます。ただし、同じ接続に両方の IP アドレス バージョンを混在させることはできません。

  • IPv6: 第 1 世代インスタンスには、それぞれ静的 IPv6 アドレスが自動的に割り当てられます。自分でインスタンスに IPv6 アドレスを割り当てる必要はありません。
  • IPv4: 第 1 世代インスタンスに IPv4 で接続する場合は、インスタンスを更新してパブリック IPv4 アドレスを割り当てる必要があります。この IP アドレスは静的です。インスタンスがオフ(停止中)の間も常に、IPv4 アドレスにわずかな料金がかかります。

IP 構成によるアクセスを設定するには、次の手順を実行します。

Console

  1. アプリケーションの IP アドレスを確認します。詳細
  2. アプリケーションの IP アドレスを承認して、インスタンスに接続します。

    詳しくは、承認されたアドレスを追加するをご覧ください。

  3. IPv4 で第 1 世代インスタンスに接続する場合、まだ行っていない場合は IPv4 アドレスをインスタンスに割り当てます。
    1. Google Cloud Console の Cloud SQL インスタンス ページに移動します。

      [Cloud SQL インスタンス] ページに移動

    2. インスタンス名をクリックして [概要] ページを開きます。
    3. [IP アドレス] タブを選択します。
    4. [IPv4 アドレスをリクエスト] をクリックします。

      インスタンスがオフの場合、IPv4 アドレスに対して課金されるので注意してください。詳細については、料金のページをご覧ください。

  4. インスタンスに割り当てられた IP アドレスは [インスタンスの詳細] ページで確認できます。この値は、アプリケーションの接続文字列に必要となります。

gcloud

  1. クライアント マシンの IP アドレスを確認します。詳細
  2. アプリケーションの IP アドレスを承認して、インスタンスに接続します。

    詳しくは、承認されたアドレスを追加するをご覧ください。

  3. IPv4 を使用して第 1 世代のインスタンスに接続するには、インスタンスに IPv4 アドレスを割り当てる必要があります。
    gcloud sql instances patch [INSTANCE_NAME] --assign-ip
    
  4. インスタンスの IP アドレスを取得します。
    gcloud sql instances describe [INSTANCE_NAME]
    

    出力の ipAddress フィールドを探します。この値は、アプリケーションの接続文字列に必要となります。

cURL

  1. アプリケーションの IP アドレスを確認します。詳細
  2. アプリケーションの IP アドレスを承認して、インスタンスに接続します。

    詳しくは、承認されたアドレスを追加するをご覧ください。

  3. IPv4 を使用して第 1 世代のインスタンスに接続するには、インスタンスに IPv4 アドレスを割り当てる必要があります。
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
           --header 'Content-Type: application/json' \
           --data '{"settings" : {"ipConfiguration" :
                                  {"ipv4Enabled" : "true"}}}' \
           -X PATCH \
           https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]
    
  4. インスタンスの IP アドレスを取得します。
    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
           -X GET \
           https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances/[INSTANCE_NAME]
    

    ipv6Address の値(第 1 世代のインスタンスのみ)をメモします。IPv4 の場合は ipAddresses.ipAddress です。この値は、アプリケーションの接続文字列に必要となります。

お困りの場合、プロキシのトラブルシューティングについては、Cloud SQL Proxy 接続のトラブルシューティングをご覧ください。または、Cloud SQL のサポートページを参照してください。

IP アドレスが動的に割り当てられるアプリケーションのアクセスを構成する

一部のアプリケーションでは、動的に割り当てられる一時的な IP アドレスを使用して、Cloud SQL インスタンスに接続する必要があります。これは、特に Platform as a Service(Paas)アプリケーションの場合に該当します。

このようなアプリケーションのソリューションとして最適なのは、Cloud SQL の第 2 世代インスタンスを使用し、Cloud SQL Proxy を使用して接続する方法です。 このソリューションでは、インスタンスに最善のアクセス制御が提供されます。

第 2 世代インスタンスを使用できない場合は、独自のプロキシをインストールするか、またはファイアウォールを開いて SSL を適用できます。ただし、どちらの場合も、第 2 世代インスタンスによって提供されるような接続ソリューションのセキュリティと制御は提供されません。

接続をテストする

mysql クライアントを使用して、ローカル環境からの接続状況をテストできます。詳細については、IP アドレスを使用して mysql クライアントを接続するCloud SQL Proxy を使用して mysql クライアントを接続するをご覧ください。

お困りの場合、プロキシのトラブルシューティングについては、Cloud SQL Proxy 接続のトラブルシューティングをご覧ください。または、Cloud SQL のサポートページを参照してください。

アプリケーションの IP アドレスを確認する

アプリケーションを実行しているパソコンの IP アドレスから Cloud SQL インスタンスへのアクセスを承認できるようにするため、そのパソコンの IP アドレスを確認するには、次のいずれかのオプションを使用します。

  • パソコンがプロキシの背後にない場合は、パソコンにログインし、このリンクを使用して IP アドレスを確認します。
  • パソコンがプロキシの背後にある場合は、パソコンにログインし、whatismyipaddress.com などのサービスやツールを使用して実際の IP アドレスを確認します。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...