🔐 Cloud SQL Auth Proxy

安全で簡単なCloud SQLへの接続を実現

📖 Cloud SQL Auth Proxyとは

🎯 概要

Cloud SQL Auth Proxy(クラウドSQL認証プロキシ)は、アプリケーションからCloud SQLインスタンスへの安全な接続を簡単に実現する軽量プロキシです。

Cloud SQL Auth Proxyの仕組み

💻
アプリケーション
Python、Java、Node.js
Go、.NET、Ruby等
🔐
Auth Proxy
ローカルプロセス
localhost:5432
IAM認証 + 暗号化
🗄️
Cloud SQL
PostgreSQL
MySQL
SQL Server
✅ 動作の流れ:
  1. アプリがlocalhost:5432(ローカルポート)に接続
  2. Auth ProxyがIAM認証情報を使ってCloud SQLに認証
  3. Auth Proxyが通信を自動的に暗号化
  4. アプリとCloud SQLの間でセキュアな接続が確立

🆚 Proxyあり vs なし

❌ Auth Proxyなし
直接接続(複雑で危険)
必要な設定:
• パブリックIPの有効化
• IPホワイトリストの管理
• SSL証明書の設定
• パスワード管理
• ファイアウォール設定
⚠️ 問題点:
  • セキュリティリスク増加
  • IPアドレス管理の手間
  • 証明書の管理が必要
  • パスワード漏洩リスク
  • 開発環境での接続が困難
  • 設定ミスでセキュリティ侵害
✅ Auth Proxyあり
プロキシ経由(簡単で安全)
必要な設定:
• Auth Proxyの起動
• IAM権限の付与
• localhostに接続

それだけ!
✅ メリット:
  • パブリックIP不要
  • IPホワイトリスト不要
  • SSL証明書不要
  • パスワード不要(IAM認証)
  • 自動暗号化
  • 設定が簡単

✨ 主要機能とメリット

🔐

IAM認証

  • IAMベースの認証
  • パスワード不要
  • サービスアカウント利用
  • セキュアな認証管理
🔒

自動暗号化

  • TLS 1.3で暗号化
  • SSL証明書不要
  • 透過的な暗号化
  • 中間者攻撃を防止
🌐

IPホワイトリスト不要

  • パブリックIP不要
  • 動的IPでも接続可
  • ファイアウォール設定簡素化
  • セキュリティグループ管理不要
💻

ローカル開発対応

  • 開発者PCから直接接続
  • VPN不要
  • 本番DBに安全アクセス
  • デバッグが容易
🚀

マルチプラットフォーム

  • Linux、macOS、Windows
  • Docker対応
  • Kubernetes対応
  • Cloud Run、App Engine対応
🔄

自動再接続

  • 接続断時に自動再接続
  • リトライロジック内蔵
  • 高可用性
  • エラーハンドリング

🔒 セキュリティレイヤー

Auth Proxyが提供する多層セキュリティ

レイヤー1: IAM認証

• Cloud SQL Clientロールを持つIAM認証情報が必要
• サービスアカウントまたはユーザーアカウント
• 認証情報がない場合は接続拒否

レイヤー2: TLS暗号化

• すべての通信がTLS 1.3で暗号化
• 証明書の自動管理
• 盗聴や改ざんを防止

レイヤー3: プライベート接続

• プライベートIPでの接続が可能
• パブリックインターネットを経由しない
• VPC内での安全な通信

レイヤー4: 接続制限

• 最大接続数の制限
• タイムアウト設定
• 異常なアクセスパターンの検出

💻 使い方

1. Auth Proxyのインストール

Linux / macOS:
# ダウンロード curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.13.0/cloud-sql-proxy.linux.amd64 # 実行権限を付与 chmod +x cloud-sql-proxy # /usr/local/binに移動(オプション) sudo mv cloud-sql-proxy /usr/local/bin/
Docker:
# Docker Hubから取得 docker pull gcr.io/cloud-sql-connectors/cloud-sql-proxy:latest

2. Auth Proxyの起動

接続文字列の形式

PROJECT_ID:REGION:INSTANCE_NAME
例: my-project:us-central1:my-postgres-instance
基本的な起動:
# PostgreSQLの場合(デフォルトポート5432) cloud-sql-proxy my-project:us-central1:my-postgres-instance # MySQLの場合(デフォルトポート3306) cloud-sql-proxy my-project:us-central1:my-mysql-instance # カスタムポート指定 cloud-sql-proxy my-project:us-central1:my-instance --port=5433
複数インスタンスへの接続:
# 複数のCloud SQLインスタンスに同時接続 cloud-sql-proxy \ my-project:us-central1:postgres-instance \ my-project:us-central1:mysql-instance
バックグラウンド実行:
# バックグラウンドで実行 nohup cloud-sql-proxy my-project:us-central1:my-instance & # ログファイルに出力 cloud-sql-proxy my-project:us-central1:my-instance > proxy.log 2>&1 &

3. アプリケーションからの接続

Python (psycopg2):
import psycopg2 # Auth Proxyが起動している前提 conn = psycopg2.connect( host="localhost", # または 127.0.0.1 port=5432, database="mydb", user="postgres", password="your-password" ) cursor = conn.cursor() cursor.execute("SELECT version();") print(cursor.fetchone())
Node.js (pg):
const { Client } = require('pg'); const client = new Client({ host: 'localhost', port: 5432, database: 'mydb', user: 'postgres', password: 'your-password' }); await client.connect(); const res = await client.query('SELECT NOW()'); console.log(res.rows[0]);
Java (JDBC):
import java.sql.Connection; import java.sql.DriverManager; String jdbcUrl = "jdbc:postgresql://localhost:5432/mydb"; String username = "postgres"; String password = "your-password"; Connection conn = DriverManager.getConnection(jdbcUrl, username, password);

4. Dockerでの使用

# Docker Composeの例 version: '3.8' services: cloud-sql-proxy: image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:latest command: - "my-project:us-central1:my-instance" ports: - "5432:5432" volumes: - ./service-account-key.json:/config/key.json environment: - GOOGLE_APPLICATION_CREDENTIALS=/config/key.json app: image: my-app depends_on: - cloud-sql-proxy environment: - DB_HOST=cloud-sql-proxy - DB_PORT=5432

☁️ GCPサービスでの利用

1. Cloud Run

# Cloud Runでは自動的にCloud SQL接続が設定される gcloud run deploy my-service \ --image gcr.io/my-project/my-image \ --add-cloudsql-instances my-project:us-central1:my-instance \ --set-env-vars DB_HOST="/cloudsql/my-project:us-central1:my-instance"

2. Cloud Functions

# Cloud Functionsでも同様に接続設定 gcloud functions deploy my-function \ --runtime python39 \ --trigger-http \ --set-cloudsql-instances my-project:us-central1:my-instance

3. Kubernetes (GKE)

# Cloud SQL Proxyをサイドカーコンテナとして実行 apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: spec: containers: - name: app image: gcr.io/my-project/my-app env: - name: DB_HOST value: "127.0.0.1" # Cloud SQL Proxyサイドカー - name: cloud-sql-proxy image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:latest command: - "/cloud-sql-proxy" - "my-project:us-central1:my-instance" securityContext: runAsNonRoot: true

4. App Engine

# app.yamlでの設定 runtime: python39 env_variables: DB_HOST: "/cloudsql/my-project:us-central1:my-instance" beta_settings: cloud_sql_instances: "my-project:us-central1:my-instance"

⚙️ 重要な設定オプション

オプション 説明
--port ローカルポートの指定 --port=5433
--private-ip プライベートIP経由で接続 --private-ip
--credentials-file サービスアカウントキーファイル --credentials-file=key.json
--max-connections 最大接続数 --max-connections=100
--structured-logs JSON形式のログ出力 --structured-logs
--quiet ログ出力を最小化 --quiet

🎯 ユースケース

1️⃣ ローカル開発

シナリオ: 開発者が自分のPCから本番DBにアクセス

実装:
  • 開発者のPCでAuth Proxyを起動
  • IAM権限(Cloud SQL Client)を付与
  • localhostに接続するだけ
メリット: VPN不要、IPホワイトリスト不要、安全

2️⃣ CI/CDパイプライン

シナリオ: GitHub ActionsからCloud SQLにマイグレーション実行

実装:
  • GitHub ActionsでAuth Proxyをコンテナで起動
  • Workload Identity Federationで認証
  • マイグレーションツール(Flyway、Liquibase等)を実行
メリット: 動的IPでも接続可能、セキュア

3️⃣ マイクロサービス

シナリオ: Kubernetesで複数のサービスがCloud SQLにアクセス

実装:
  • 各PodにサイドカーとしてAuth Proxyを配置
  • Workload Identityで認証
  • 各サービスはlocalhostに接続
メリット: セキュアな接続、簡単な設定

4️⃣ データ分析

シナリオ: データサイエンティストがJupyter NotebookからCloud SQLにクエリ

実装:
  • ローカルでAuth Proxyを起動
  • Jupyter NotebookからSQLAlchemyで接続
  • pandasでデータ分析
メリット: 簡単、セキュア、VPN不要

⚠️ 注意点とベストプラクティス

項目 推奨事項
IAM権限 最小権限の原則に従い、必要な権限のみ付与(Cloud SQL Client)
接続数制限 Cloud SQLの最大接続数を考慮し、Auth Proxyの接続数を制限
プライベートIP 可能な限りプライベートIP接続を使用(--private-ip
本番環境 サービスアカウントを使用し、ユーザーアカウントは使わない
モニタリング Cloud Loggingでプロキシのログを監視
バージョン管理 定期的に最新バージョンにアップデート
⚠️ よくある問題と解決策:

✅ セキュリティのベストプラクティス

📚 まとめ

🎓 Cloud SQL Auth Proxyの重要ポイント

💡 Auth Proxyを使うべき理由:
  • セキュリティ: パブリックIP不要、自動暗号化、IAM認証
  • 簡単: localhostに接続するだけ、複雑な設定不要
  • 柔軟: ローカル開発からプロダクションまで対応
  • 運用: IPホワイトリスト管理不要、証明書管理不要
Cloud SQL Auth Proxyで、
安全で簡単なデータベース接続を実現しましょう!