先々月にGCP: 自動スケーリング時における Google Cloud SQL ホワイトリストの管理という記事を書きました。その続きです。
GCPのVMインスタンスからCloud SQLインスタンスへ接続するのにCloud SQL Proxyを使えばうまく行くんじゃないか、という考察で終わっていました。
結論から言えばその通りでした。
Ubuntu 18.04(64bit版)におけるセットアップ手順の概要は、次の通りです。
- VMインスタンスの設定で「すべての Cloud API に完全アクセス権を許可」を選ぶ。
- VMインスタンスにsshでログインして、
cloud_sql_proxy
をインストールする。 cloud_sql_proxy
のためのSystemd起動スクリプトを設置する。
これで、Cloud SQL インスタンスが PostgreSQL なら localhost:5432
で接続できるようになります。とても簡単です。
なお、GCP のドキュメントには「下位互換性のない方法で変更される可能性があり、 は、SLA または非推奨ポリシーの対象ではありません。」と書いてあります(2018年9月9日現在)。採用は自己責任でお願いします。
以下、詳しい説明です。
VMインスタンスの設定
VMインスタンスの「アクセス範囲」に関する設定を「デフォルトのアクセスを許可」から「すべての Cloud API に完全アクセス権を許可」に変更します。
cloud_sql_proxy
のインストール
VMインスタンスにsshでログインして、cloud_sql_proxy
をインストールします。
$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy $ sudo chown root:root cloud_sql_proxy $ sudo chmod +x cloud_sql_proxy $ sudo mv cloud_sql_proxy /usr/local/bin
起動スクリプトの設置
テキストエディタで新規ファイル /etc/systemd/system/cloud-sql-proxy.service
を以下の内容で作成します。
[Unit] Description=Cloud SQL Proxy After=network.target [Service] Type=simple ExecStart=/usr/local/bin/cloud_sql_proxy -dir=sqlproxy -instances=<ID>=tcp:5432 TimeoutSec=300 Restart=always [Install] WantedBy=multi-user.target
ただし、<ID>
の部分は Cloud SQL インスタンスの接続名で置き換えてください。GCP コンソールで Cloud SQL インスタンスの「概要」タブを見れば、「このインスタンスに接続」と書いてあるボックスの中に記載されています。具体的には
foo:asia-northeast1:bar
のような形式の文字列です。foo
がプロジェクト ID で、bar
が Cloud SQL インスタンス ID です。
なお、5432
の部分は接続に使用するポート番号です。適宜変更しても構いません。
サービスの起動
VM インスタンスのターミナルで次のコマンドを実行し、Cloud SQL Proxy サービスを起動します。
$ sudo systemctl start cloud-sql-proxy.service
サービスの状態を確認します。
$ sudo systemctl status cloud-sql-proxy.service
正常に動いていれば、次のようなログが表示されます。
Started Cloud SQL Proxy. Listening on sqlproxy/... Ready for new connections
失敗した場合、例えば次のようなログが表示されます。
Failed to start Cloud SQL Proxy.
テキストエディタで /etc/systemd/system/cloud-sql-proxy.service
を開き、インスタンスの接続名などが誤っていないかどうかを確認し、訂正してください。
次のコマンドを順に実行し、Cloud SQL Proxy サービスを起動し直します。
$ sudo systemctl daemon-reload $ sudo systemctl start cloud-sql-proxy.service
接続の確認
psql
コマンドで接続してみます。
$ psql -h localhost --port 5432 -U postgres postgres
サービスの有効化
正常にサービスが起動できるようになったら Cloud SQL Proxy サービスを有効化します。
$ sudo systemctl enable cloud-sql-proxy.service
直接 PostgreSQL に接続する場合とのパフォーマンスの違い(追記)
私の環境で実測したところ、直接 PostgreSQL に接続した場合に比べて Cloud SQL Proxy 経由で接続した場合、Rails アプリケーションのパフォーマンスが1割〜2割程度落ちる、という現象を観察しました。
ここで「パフォーマンス」は、レスポンス時間を指します。具体的に言えば、平均0.63秒が平均0.69秒になりました。いろいろと条件を変えて負荷試験を繰り返しましたが、レスポンス時間が1割〜2割増加するという事実は変化しませんでした。
Cloud SQL Proxy は設定を楽にしてくれますが、2018年9月の段階では、多少のデメリットもあるようです。