お久しぶりです。GMO NIKKOのharuです。
私が担当するサービスGood!Appsは、GCPを用いて本番環境をクラウド上に構築しております。当然データベースもCloud SQLを使用しているのですが、次のような用途でローカルからCloud SQLに接続したいことがあります。今回は、公式が提供しているCloud SQL Auth ProxyというCloud SQLコネクタを使用した方法をお伝えします。
主な用途
- データ確認: 開発中にCloud SQL内のデータを確認したい場合。
- データ修正: 何らかの理由でCloud SQL内のデータを直接修正する必要がある場合。
- データベースマイグレーション: Cloud Runなどのコンテナ環境からCloud SQLにデータを移行したい場合。
注意点
- 本番環境のデータベースに接続するため、操作は慎重に行ってください。
- 不要な時は接続を閉じることを強く推奨します。
前提条件
接続を始める前に、次の条件を満たしていることを確認してください。
- Cloud SQL Admin APIが有効になっていること。
- Cloud SQLへのアクセス権を持つユーザーまたはサービスアカウントの認証情報を保持していること。
- ユーザーアカウントの場合
- gcloud CLIのインストール 参考:gcloud CLI をインストールする | Google Cloud CLI のドキュメント
-
1gcloud auth application-default login
- ~/.config/gcloud/application_default_credentials.jsonに認証情報が保存される
- サービスアカウントの場合
- サービスアカウントキーを作成し、認証情報(jsonファイル)をローカルに保存 参考:サービス アカウント キーの作成と管理 | IAM のドキュメント | Google Cloud
- ユーザーアカウントの場合
詳細な情報は公式docを参照:Cloud SQL Auth Proxy について | Cloud SQL for PostgreSQL | Google Cloud
Cloud SQL Auth Proxyの起動
ローカル環境の差分影響を最小限に抑えるため、DockerコンテナでCloud SQL Auth Proxyを起動します。(Dockerのインストール方法は割愛)
- Google Container RegistryからCloud SQL Auth Proxy Dockerイメージをインストール
-
1docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1
-
- Cloud SQL Auth Proxyコンテナを起動
-
123456789docker run -d \--name cloud-sql-proxy \-v {認証情報を格納したパス}:/config/gcloud/application_default_credentials.json \-p 127.0.0.1:{ローカルのport番号 e.g. 3306}:{コンテナ内のport番号 e.g. 3306} \gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 \--address 0.0.0.0 \--port {コンテナ内のport番号 e.g. 3306} \--credentials-file /config/gcloud/application_default_credentials.json \"{GCPプロジェクト名}:{Cloud SQLインスタンスのリージョン}:{Cloud SQLインスタンス名}"
- 複数のインスタンスに接続する場合
-
12345678910docker run -d \--name cloud-sql-proxy \-v {認証情報を格納したパス}:/config/gcloud/application_default_credentials.json \-p 127.0.0.1:{ローカルのport番号 e.g. 3306}:{コンテナ内のport番号 e.g. 3306} \-p 127.0.0.1:{ローカルのport番号 e.g. 3307}:{コンテナ内のport番号 e.g. 3307} \gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.1 \--address 0.0.0.0 \--credentials-file /config/gcloud/application_default_credentials.json \"{GCPプロジェクト名}:{Cloud SQLインスタンスのリージョン}:{Cloud SQLインスタンス名}?port={コンテナ内のport番号 e.g. 3306}" \"{GCPプロジェクト名}:{Cloud SQLインスタンスのリージョン}:{Cloud SQLインスタンス名}?port={コンテナ内のport番号 e.g. 3307}"
※既に使用されているポート番号を指定するとエラーが発生するので、使用されていないポート番号を指定してください。
-
ローカルのGUIクライアントツールとの接続
- Cloud SQL Auth Proxy Dockerの起動
- GUIクライアントツールを起動し、次の値を入力して接続
-
- Databese: 接続するDB名
- Username: ユーザー名
- Password: パスワード
- Host: 127.0.0.1
- Port: cloud-sql-proxyコンテナの外部port番号(起動時に指定したもの)
以下はSequel Proの例
ローカルのバックエンドサーバーとの接続
Cloud Runなどのコンテナ内に入れない環境に存在するバックエンドサーバーから、Cloud SQLをマイグレーションする方法はいくつか存在します。
-
バックエンドサーバーのDockerFile内にマイグレーション処理を記述して、CI/CD時に実行
- Cloud Runジョブを用いてマイグレーション
- ローカル開発環境のバックエンドサーバーから、Cloud SQL Auth Proxyを用いてマイグレーション
それぞれ一長一短ありますが、今回は本記事テーマのCloud SQL Auth Proxyを用いる方法について説明します。Ruby on Railsを例に説明しますが、他のフレームワークでも同様です。
-
Cloud SQL Auth Proxy Dockerの起動
-
config/database.ymlを修正1234567development:<<: *defaultdatabase: 接続するDB名host: localhostusername: ユーザー名password: パスワードport: cloud-sql-proxyコンテナの外部port番号(起動時に指定したもの)
-
アプリケーションルートディレクトリでマイグレーションを実行1bundle exec rails db:migrate
Dockerコンテナ内にローカル開発環境のバックエンドサーバーが存在する場合
前提として、バックエンドサーバーにDockerネットワークが指定されている必要があります。
-
–network {バックエンドサーバーが存在するDockerネットワーク名}オプションを追加して、Cloud SQL Auth Proxy Dockerを起動
-
config/database.ymlを修正1234567development:<<: *defaultdatabase: 接続するDB名host: cloud-sql-proxy(起動時にnameオプションで指定したもの)username: ユーザー名password: パスワードport: cloud-sql-proxyコンテナの内部port番号(起動時に指定したもの)
-
バックエンドサーバーのコンテナに入る1docker exec -it {バックエンドサーバーのコンテナ名} bash
-
アプリケーションルートディレクトリでマイグレーションを実行1bundle exec rails db:migrate
さいごに
今回はCloud SQL Auth Proxyを使用したCloud SQLへの接続方法を紹介しました。みなさんの助けになれば幸いです。それではまたの機会に。