You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP中Terraform创建的google_sql_user无法连接问题求助

问题排查:GCP Cloud SQL PostgreSQL 用户 ttuser 无法连接

问题描述

通过Github Actions流水线使用Terraform将资源部署至GCP环境,采用google_sql_user模块创建PostgreSQL用户ttuser。数据库已成功部署,ttuser在数据库中存在,但使用该用户无法连接;使用postgres用户(与ttuser密码相同)可正常连接,请求排查Terraform配置遗漏。

当前Terraform配置

variable "project_id" {
  type = string
  description = "GCP Account Project ID"
}

variable "db_password" {
  type = string
  description = "Password for DB user"
}

provider "google" {
  project     = var.project_id
  region      = "us-central1"
  zone        = "us-central1-c"
}

resource "google_sql_database_instance" "main" {
  name             = "training-tracker-dev"
  database_version = "POSTGRES_15"
  region           = "us-central1"

  root_password = var.db_password

  settings {
    tier = "db-f1-micro"
  }
}

resource "google_sql_user" "users" {
  name = "ttuser"
  instance = google_sql_database_instance.main.name
  password = var.db_password
  depends_on = [ google_sql_database_instance.main ]
}

排查与修复方案

1. 缺少数据库权限分配

默认创建的PostgreSQL用户没有任何数据库的访问权限,postgres作为超级用户自带全量权限。需为ttuser分配目标数据库的连接及操作权限:

  • 首先创建目标数据库(若未创建)
  • 通过postgresql provider为用户授权

添加以下配置到Terraform代码中:

# 创建目标数据库
resource "google_sql_database" "main" {
  name      = "training_tracker_db"
  instance  = google_sql_database_instance.main.name
  charset   = "UTF8"
  collation = "en_US.UTF8"
}

# 配置postgresql provider连接Cloud SQL
provider "postgresql" {
  host            = google_sql_database_instance.main.public_ip_address # 根据你的连接方式选择公网/私有IP
  port            = 5432
  username        = "postgres"
  password        = var.db_password
  sslmode         = "require"
  connect_timeout = 15
}

# 授予用户数据库连接权限
resource "postgresql_grant" "ttuser_connect" {
  database   = google_sql_database.main.name
  role       = google_sql_user.users.name
  privileges = ["CONNECT"]
  schema     = "public"
}

# 授予用户public schema下的表操作权限
resource "postgresql_grant" "ttuser_table_access" {
  database    = google_sql_database.main.name
  role        = google_sql_user.users.name
  privileges  = ["SELECT", "INSERT", "UPDATE", "DELETE"]
  schema      = "public"
  object_type = "table"
}

注意:使用postgresql provider需确保Terraform所在环境(Github Actions)的IP已添加到Cloud SQL的授权网络列表中,或使用VPC peering连接。

2. 连接时未指定目标数据库

PostgreSQL默认会尝试连接与用户名同名的数据库,若不存在ttuser数据库,连接会失败。而postgres用户默认可连接postgres系统数据库。

  • 连接时需显式指定目标数据库,例如:
    psql -U ttuser -d training_tracker_db -h <INSTANCE_IP>
    
  • 或在应用连接字符串中添加database=training_tracker_db参数。

3. 验证用户连接范围

确认ttuser的连接来源限制是否正确:
默认google_sql_user的host参数为%(允许所有IP连接),若需限制特定IP可手动指定。确保你的连接IP已在Cloud SQL的授权网络中(postgres能连接说明此条件已满足,可快速排除)。

4. 确认密码有效性

尽管密码与postgres相同,仍可通过Cloud SQL控制台重置ttuser密码并重新测试,或执行terraform apply确保密码配置已正确同步到实例。


内容的提问来源于stack exchange,提问作者user3054977

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:20:35