これまで、安全なデータベース接続を実現するには、承認済みネットワークの設定やSSL証明書の管理など、煩雑な運用を行う必要がありました。本記事で取り扱うCloud SQL Auth Proxy は、安全なDB接続を確立するために設計されたDBコネクタであり、承認済みネットワークやSSL構成を必要とせずともMySQL インスタンスをはじめとする様々な Cloud SQL インスタンスに安全に接続することが可能となります。

この記事で扱うこと

本記事では、ブラウザからアクセスし、MySQLのバージョン情報やテストデータを表示することで接続を確認するデモアプリケーションを用い、Cloud Run から Cloud SQL MySQL インスタンスへ、Cloud SQL Auth Proxy を使用してプライベートIP経由で安全に接続するための具体的な方法について紹介します。

また、本記事ではAuth Proxyを用いたデータベース接続に焦点を当てるため、デモアプリケーション自体やアプリケーション構築において必要となるIAM周りに関する説明は省略します。

Cloud SQLの準備

Private IP を有効にした Cloud SQL for MySQL インスタンスを作成する

まず、パブリック IP を無効化した Cloud SQL for MySQL インスタンスを作成します。

gcloud sql instances create {Cloud SQL ID} \
--project={project ID} \
--network=projects/{project ID}/global/networks/{VPC Name} \
--database-version=MYSQL_8_0 \
--no-assign-ip \
--region=asia-northeast1 \
--backup \
--backup-start-time=15:00 \
--deletion-protection \
--enable-bin-log
  • database-version=MYSQL_8_0: 使用する MySQL のバージョンを指定します。必要に応じて変更してください。
  • no-assign-ip: パブリック IP アドレスを割り当てないように設定します。
  • region=asia-northeast1: Cloud SQL インスタンスを作成するリージョンを指定します。Cloud Run サービスと同じリージョンを選択することを推奨します。
  • backup: 自動バックアップを有効にします。
  • backup-start-time=15:00: 自動バックアップを開始する UTC 時間を指定します。
  • deletion-protection: インスタンスの誤削除を防ぐための削除保護を有効にします。
  • enable-bin-log: バイナリログを有効にします (高可用性構成やポイントインタイムリカバリに必要)。

データベースを作成する

次に、作成した Cloud SQL インスタンス内にアプリケーションで使用するデータベースを作成します。

gcloud sql databases create {DB Name} \
--project={project ID} \
--instance={Cloud SQL ID}

データベースユーザーを作成する

アプリケーションがデータベースにアクセスするためのユーザーを作成します。

gcloud sql users create {DB User Name} \
--project={Project ID} \
--instance={Cloud SQL ID} \
--password={DB Password}

Auth Proxyの設定

Dockerfile 内で Auth Proxy を設定する

Cloud Run にデプロイするコンテナ内で Cloud SQL Auth Proxy を実行するように Dockerfile を記述します。

...

# Cloud SQL Auth Proxy バイナリをダウンロードし、実行権限を与える
RUN curl -o /usr/local/bin/cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.15.1/cloud-sql-proxy.linux.amd64
&& chmod +x /usr/local/bin/cloud-sql-proxy

# Cloud SQL Auth Proxyとアプリを並行実行する
CMD ["bash", "-c", "cloud-sql-proxy ${CLOUDSQL_CONNECTION_NAME} --port 3306 --private-ip & python demo_application.py"]

Cloud Run サービスをデプロイする

作成した Docker イメージを Cloud Run にデプロイします。

gcloud run deploy check-db-connection-test-auth \
--image asia-northeast1-docker.pkg.dev/{Project ID}/check-db-connection-repo/check-db-connection \
--region=asia-northeast1 \
--project={Project ID} \
--set-env-vars DB_HOST=127.0.0.1,DB_USER={DB User Name},DB_PASSWORD={DB Password},DB_NAME={DB Name},DB_PORT=3306,CLOUDSQL_CONNECTION_NAME={Cloud SQL Connection Name} \
--network={VPC Name} \
--subnet={Subnet Name} \
--platform managed \
--allow-unauthenticated

動作確認

Cloud Run サービスの URL にアクセスするとMYSQLのバージョン情報が表示され、データベースへの接続ができていることが確認できました!

まとめ

今回の検証を通じて、Cloud RunからCloud SQLへのセキュアな接続を、Cloud SQL Auth ProxyとプライベートIPの組み合わせで実現できることを確認できました。

Auth Proxyを採用することで、ファイアウォール設定の複雑さやSSL証明書の管理負担を軽減し、高セキュリティなDB接続を確立できます これにより、開発者はインフラの複雑さに煩わされることなく、アプリケーション開発に集中できます。ぜひ皆さんのプロジェクトでも、この効率的なDB接続方法をご検討ください。