gcp-cloud-sql について
Google Cloud 上でリレーショナルデータベースを導入・管理するエンジニア向けのスキルです。PostgreSQL、MySQL、SQL Server の Cloud SQL を扱い、高可用性、バックアップ、レプリカ、接続設定を解説します。
主な機能
- 01PostgreSQL、MySQL、SQL Server インスタンスの作成
- 02プライベート IP と接続プロキシの設定
- 03読み取りレプリカとクロスリージョンレプリカの管理
- 04バックアップ作成とポイントインタイムリカバリ
- 05gcloud と Terraform によるインスタンス管理
活用シーン
- 01オンプレミスの PostgreSQL や MySQL から Cloud SQL への移行
- 02本番データベースのリージョン高可用性設定
- 03災害復旧用レプリカの作成
- 04プロキシまたはプライベート IP 経由でのアプリ接続
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill gcp-cloud-sqlインストール後、Claude Code で/gcp-cloud-sqlを入力して読み込まれたか確認します。
詳細
GCP Cloud SQL
Google Cloud 上でフルマネージドのリレーショナルデータベース(PostgreSQL、MySQL、SQL Server)をデプロイして管理します。
使用する場面
- レプリケーション、パッチ適用、バックアップを管理せずに、本番環境のリレーショナルデータベースを運用する場合
- オンプレミスの PostgreSQL または MySQL のワークロードをマネージドサービスに移行する場合
- ACID トランザクション、リレーショナルスキーマ、SQL クエリのサポートが必要なアプリケーション
- リージョン間のフェイルオーバーを伴う自動高可用性が必要なワークロード
前提条件
- Google Cloud SDK(
gcloud)がインストールされ、認証されていること - Cloud SQL Admin API と Service Networking API が有効になっていること
- 全管理権限を持つ IAM ロール
roles/cloudsql.admin
gcloud services enable sqladmin.googleapis.com servicenetworking.googleapis.com
インスタンス階層のリファレンス
| 階層 | vCPU | メモリ | 用途 |
|---|---|---|---|
| db-f1-micro | 共有 | 0.6 GB | 開発/テストのみ |
| db-g1-small | 共有 | 1.7 GB | トラフィックの少ないステージング |
| db-custom-2-8192 | 2 | 8 GB | 小規模な本番環境 |
| db-custom-4-16384 | 4 | 16 GB | 中規模な本番環境 |
| db-custom-8-32768 | 8 | 32 GB | トラフィックの多い本番環境 |
PostgreSQL インスタンスの作成
gcloud sql instances create prod-db \
--database-version=POSTGRES_16 \
--tier=db-custom-4-16384 \
--region=us-central1 \
--availability-type=REGIONAL \
--storage-type=SSD --storage-size=100GB --storage-auto-increase \
--backup-start-time=02:00 --enable-point-in-time-recovery \
--retained-backups-count=14 \
--maintenance-window-day=SUN --maintenance-window-hour=4 \
--database-flags=max_connections=200,log_min_duration_statement=1000 \
--root-password=$(openssl rand -base64 24) \
--labels=env=production,team=backend
gcloud sql databases create myapp --instance=prod-db --charset=UTF8
gcloud sql users create appuser --instance=prod-db \
--password=$(openssl rand -base64 24)
MySQL インスタンスの作成
gcloud sql instances create mysql-prod \
--database-version=MYSQL_8_0 \
--tier=db-custom-4-16384 --region=us-central1 \
--availability-type=REGIONAL \
--storage-type=SSD --storage-size=100GB --storage-auto-increase \
--backup-start-time=02:00 --enable-bin-log --retained-backups-count=14 \
--database-flags=slow_query_log=on,long_query_time=2,max_connections=500 \
--root-password=$(openssl rand -base64 24)
プライベート IP の設定
# Allocate IP range and create private connection
gcloud compute addresses create google-managed-services \
--global --purpose=VPC_PEERING --prefix-length=16 --network=my-vpc
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=google-managed-services --network=my-vpc
# Create instance with private IP only
gcloud sql instances create private-db \
--database-version=POSTGRES_16 --tier=db-custom-2-8192 \
--region=us-central1 \
--network=projects/${PROJECT_ID}/global/networks/my-vpc \
--no-assign-ip --availability-type=REGIONAL \
--storage-type=SSD --storage-size=50GB --storage-auto-increase
リードレプリカ
# Same-region replica
gcloud sql instances create prod-db-replica-1 \
--master-instance-name=prod-db --tier=db-custom-4-16384 \
--region=us-central1 --availability-type=ZONAL
# Cross-region replica for DR
gcloud sql instances create prod-db-replica-eu \
--master-instance-name=prod-db --tier=db-custom-4-16384 \
--region=europe-west1 --availability-type=ZONAL
# Promote a replica to standalone (disaster recovery)
gcloud sql instances promote-replica prod-db-replica-eu
バックアップと復元
gcloud sql backups create --instance=prod-db --description="pre-migration"
gcloud sql backups list --instance=prod-db
# Point-in-time recovery
gcloud sql instances clone prod-db prod-db-pitr \
--point-in-time="2026-03-23T10:00:00Z"
# Export / import
gcloud sql export sql prod-db gs://my-bucket/export.sql.gz --database=myapp
gcloud sql import sql prod-db gs://my-bucket/export.sql.gz --database=myapp
Cloud SQL Auth Proxy
curl -o cloud-sql-proxy \
https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.11.0/cloud-sql-proxy.linux.amd64
chmod +x cloud-sql-proxy
./cloud-sql-proxy ${PROJECT_ID}:us-central1:prod-db --port=5432 --auto-iam-authn
# Unix socket (for Kubernetes sidecar pattern)
./cloud-sql-proxy ${PROJECT_ID}:us-central1:prod-db --unix-socket=/tmp/cloudsql
psql "host=/tmp/cloudsql/${PROJECT_ID}:us-central1:prod-db user=appuser dbname=myapp"
接続方法の概要
| 方法 | 用途 | 要件 |
|---|---|---|
| パブリック IP + SSL | 開発/テストアクセス | 承認済みネットワークの設定 |
| Cloud SQL Auth Proxy | 本番環境の GCE/GKE | roles/cloudsql.client を持つ SA |
| プライベート IP | VPC ネイティブアプリ | VPC ピアリングの設定 |
| Cloud SQL Connector ライブラリ | アプリケーションレベルの統合 | SA 認証情報 |
Terraform の設定
resource "google_sql_database_instance" "main" {
name = "prod-db"
database_version = "POSTGRES_16"
region = "us-central1"
settings {
tier = "db-custom-4-16384"
availability_type = "REGIONAL"
disk_type = "PD_SSD"
disk_size = 100
disk_autoresize = true
backup_configuration {
enabled = true
start_time = "02:00"
point_in_time_recovery_enabled = true
backup_retention_settings { retained_backups = 14 }
}
ip_configuration {
ipv4_enabled = false
private_network = google_compute_network.vpc.id
require_ssl = true
}
maintenance_window { day = 7; hour = 4 }
database_flags { name = "max_connections"; value = "200" }
user_labels = { env = "production" }
}
deletion_protection = true
depends_on = [google_service_networking_connection.private_vpc]
}
resource "google_sql_database" "app" {
name = "myapp"
instance = google_sql_database_instance.main.name
}
resource "google_sql_user" "app" {
name = "appuser"
instance = google_sql_database_instance.main.name
password = random_password.db_password.result
}
resource "google_sql_database_instance" "replica" {
name = "prod-db-replica-1"
master_instance_name = google_sql_database_instance.main.name
region = "us-central1"
database_version = "POSTGRES_16"
replica_configuration { failover_target = false }
settings {
tier = "db-custom-4-16384"
disk_type = "PD_SSD"
disk_autoresize = true
ip_configuration {
ipv4_enabled = false
private_network = google_compute_network.vpc.id
}
}
}
resource "google_compute_global_address" "private_ip" {
name = "google-managed-services"
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 16
network = google_compute_network.vpc.id
}
resource "google_service_networking_connection" "private_vpc" {
network = google_compute_network.vpc.id
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.private_ip.name]
}
よく使う操作
gcloud sql instances list
gcloud sql instances describe prod-db \
--format="yaml(state,settings.tier,settings.availabilityType,ipAddresses)"
gcloud sql instances patch prod-db --storage-size=200GB
gcloud sql instances patch prod-db --database-flags=max_connections=300
gcloud sql instances restart prod-db
トラブルシューティング
| 症状 | 原因 | 対処方法 |
|---|---|---|
パブリック IP 経由で Connection refused | IP が承認済みネットワークに含まれていない | gcloud sql instances patch --authorized-networks で IP を追加する |
SSL required エラー | require_ssl=true だが、クライアントが SSL を使用していない | Cloud SQL Proxy を使用するか、sslmode=require を渡す |
| レプリケーションの遅延が大きい | レプリカの階層が小さすぎる、またはプライマリの書き込み負荷が高い | レプリカの階層を上げ、書き込み負荷を減らす |
| RUNNABLE にもかかわらずインスタンスの動作が遅い | CPU/メモリの割り当て不足 | gcloud sql instances patch --tier で階層をスケールする |
プロキシが ECONNREFUSED を返す | 接続名が間違っているか、IAM ロールが不足している | project:region:instance の形式を確認し、roles/cloudsql.client を付与する |
| プライベート IP インスタンスを作成できない | VPC ピアリングが確立されていない | 最初に gcloud services vpc-peerings connect を実行する |
| バックアップの復元に失敗する | バージョンに互換性がない | ソースとターゲットのデータベースのメジャーバージョンが同じであることを確認する |
関連スキル
- gcp-networking - Cloud SQL のプライベート IP に向けた VPC とプライベートサービス接続
- terraform-gcp - Infrastructure as Code を使用した Cloud SQL のプロビジョニング
- gcp-gke - サイドカープロキシ経由で Kubernetes ワークロードを Cloud SQL に接続
- gcp-compute - Cloud SQL に接続する Compute Engine 上のアプリケーションの実行
コメント
Markdown 対応