Google Cloud Platform(以下GCP)のGoogle Compute Engine(以下GCE)からCloud SQLへ接続する場合、Cloud SQL Proxy経由で接続することで以下の恩恵が受けられます。
- 安全な接続: プロキシは、データベースとの間で送受信されるトラフィックを自動的に暗号化します。クライアントとサーバーの ID の確認には、SSL 証明書が使用されます。
- 簡単な接続管理: プロキシが Google Cloud SQL との認証を処理するので、静的な IP アドレスを提供する必要がなくなります。
イメージは以下です。
※https://cloud.google.com/sql/docs/sql-proxy?hl=ja#gce
プロキシの設定も簡単で以下の流れで出来ます。
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy
chmod +x cloud_sql_proxy
ここまで来たらプロキシを開始します。
言語や環境に応じて、TCPソケットまたはUnixソケットのどちらかを使用してプロキシを開始できます。ここではUnixソケットを利用します。
sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME>
※INSTANCE_CONNECTION_NAMEは自身のCloud SQLのインスタンス接続名です。
実際に上記の流れでプロキシを開始しCloud SQLへ接続を試みると、以下のようなエラーに遭遇しました。
見にくいですが、内容は以下です。
2017/11/15 17:06:27 errors parsing config:
googleapi: Error 403: The client is not authorized to make this request., notAuthorized
認証に失敗していることは分かります。
これだけではちょっと・・・ってことでここでかなりハマりましたが、真面目に公式ドキュメントを読んでみたら案外簡単に解決しました。
Cloud SQL に Compute Engine インスタンスから接続している場合、プロキシは Compute Engine インスタンスに関連付けられているサービス アカウントを使用できます。Cloud SQL インスタンスに対する少なくとも Editor 権限がサービス アカウントにある場合、プロキシの認証は成功します。
Compute Engine インスタンスが Cloud SQL インスタンスと同じプロジェクトにある場合、Compute Engine インスタンスのデフォルトのサービス アカウントはプロキシの認証に必要な権限を持っています。2 つのインスタンスが異なるプロジェクトにある場合は、Editor 権限を持つ Cloud SQL インスタンスを含むプロジェクトにサービス アカウントを追加する必要があります。
※https://cloud.google.com/sql/docs/sql-proxy?hl=ja#environment
つまり、サービスアカウントをプロジェクトに追加して編集者権限の付与が必要ということのようです。IAMで確認してみると、案の定ユーザが1人いるだけでサービスアカウントがプロジェクトに存在していませんでした。
そのため、以下のようにサービスアカウントをプロジェクトに追加して編集者権限を付与し、
再度、SSHでコンソールからプロキシを開始しCloud SQLへ接続してみると、うまくいきました。
2017/11/17 追記
Cloud SQLへの接続はCloud SQL Client (roles/cloudsql.client) というロールがあるので、それでも接続可能です。
https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=en#permissions
以上です。