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分配目标数据库的连接及操作权限:
- 首先创建目标数据库(若未创建)
- 通过
postgresqlprovider为用户授权
添加以下配置到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" }
注意:使用
postgresqlprovider需确保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
相关产品推荐
相关产品推荐

