【问题标题】:Error connection to Google Cloud Postgres with GORM v2 after upgrade of GORM升级 GORM 后使用 GORM v2 连接到 Google Cloud Postgres 时出错
【发布时间】:2020-10-12 18:49:50
【问题描述】:

升级到 Gorm 版本后:

gorm.io/driver/postgres v1.0.2  
gorm.io/gorm v1.20.2

无法连接到 Google Cloud SQL PostgreSQL v12

连接在旧 GORM 版本上正常工作

db, err := gorm.Open("postgres", "host=/cloudsql/project_id:us-central1:sql_instance_name port=5432 user=... dbname=... password=... sslmode=disable")   

新的 GORM 版本在 localhost_golang / localhost_postgres 的本地安装 (mac) 上工作

Google Cloud 上的代码:

dsn := ""  
dsn += "user=postgres "  
dsn += "password=admin_password_here "  
dsn += "host=/cloudsql/project_id:us-central1:sql_instance_name "  
dsn += "dbname=db_name "  
dsn += "port=5432 "  
dsn += "sslmode=disable "  
fmt.Println("dsn:%v", dsn)

db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{   
    NamingStrategy: schema.NamingStrategy{  
        SingularTable: true,  
    }, 
})

Google Cloud 上的错误:
[0m[31m[error] [0mfailed to initialize database, got error failed to connect to host=/cloudsql/project_id:us-central1:sql_instance_name user=postgres database=db_name: dial error (dial unix /cloudsql/project_id:us-central1:sql_instance_name/.s.PGSQL.5432: connect: connection denied )

谢谢!

【问题讨论】:

    标签: google-cloud-sql go-gorm google-app-engine-golang


    【解决方案1】:

    App Engine 默认服务帐户需要适当的角色,即使 CLoud SQL 连接页面显示“App Engine 授权”,此项目中的所有应用程序都默认授权。 https://cloud.google.com/sql/docs/postgres/connect-app-engine-standard?_ga=2.121100104.-1170262708.1601472976

    配置 App Engine 标准环境以启用使用公共 IP 连接到 Cloud SQL 实例:

    确保上面创建的实例具有公共 IP 地址。您可以在 Google Cloud Console 中的实例的概览页面上验证这一点。如果您需要添加一个,请参阅配置公共 IP 页面以获取说明。

    为您的实例获取 INSTANCE_CONNECTION_NAME。这可以在 Google Cloud Console 中您的实例的概览页面上找到。或通过运行以下命令:gcloud sql instances describe [INSTANCE_NAME]。

    确保您的应用用于对 Cloud SQL 调用进行身份验证的服务帐号具有相应的 Cloud SQL 角色和权限。 您的服务的服务帐号需要以下 IAM 角色之一:

    - Cloud SQL Client (preferred)  
    - Cloud SQL Editor  
    - Cloud SQL Admin  
    

    或者,您可以手动分配以下 IAM 权限:

    - cloudsql.instances.connect  
    - cloudsql.instances.get   
    

    有关将 IAM 角色添加到服务帐号的详细说明,请参阅向服务帐号授予角色。 默认情况下,您的应用将使用 App Engine 服务帐户授权您的连接。服务帐号身份的格式为 PROJECT_ID@appspot.gserviceaccount.com。

    如果授权服务帐号与 Cloud SQL 实例属于不同的项目,则需要为这两个项目添加 Cloud SQL Admin API 和 IAM 权限。

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 2018-04-17
      • 2023-03-15
      • 1970-01-01
      • 2021-07-05
      • 2016-01-14
      • 1970-01-01
      • 2019-07-10
      • 2021-06-06
      相关资源
      最近更新 更多