如何在 Go 中从云功能连接到 Cloud-SQL?



对于一个项目,我正在尝试将云函数连接到云 SQL 数据库设置,如本快速入门指南中所述。

该功能配置在同一区域,服务账号具有角色Cloud SQL-Client。我通过我的计算机调用了该函数,如下所示:

gcloud functions call <function-name> --region=<region> --data '{"recipient":"hello","requester":"hello","message":"test"}'

与函数的连接正在工作,似乎只是对数据库的身份验证不起作用,但我没有得到失败的地方。

我多次检查密码,用户名和连接名称,重置密码,但仍然不起作用。 我发现这里的问题与将云函数连接到云 sql 有关。

我尝试用单引号将密码括在dsn字符串中,以确保密码中字符的转义不是问题。

我还检查了进来的环境变量,它们是我在配置中输入的变量。

该函数只是出于测试目的对数据库进行 ping 操作:

package receiver
import (
"database/sql"
"fmt"
"net/http"
"os"
// Import Postgres SQL driver
_ "github.com/lib/pq"
)
// Receives a message and stores it
func Receive(w http.ResponseWriter, r *http.Request) {
connectionName := os.Getenv("POSTGRES_INSTANCE_CONNECTION_NAME")
dbUser         := os.Getenv("POSTGRES_USER")
dbPassword     := os.Getenv("POSTGRES_PASSWORD")
dsn            := fmt.Sprintf("user=%s password='%s' host=/cloudsql/%s dbname=messages", dbUser, dbPassword, connectionName)
var err error
db, err := sql.Open("postgres", dsn)
if err != nil {
fmt.Fprintf(w, "Could not open db: %v n", err)
}
// Only allow 1 connection to the database to avoid overloading
db.SetMaxIdleConns(1)
db.SetMaxOpenConns(1)
defer db.Close()
if pingerror := db.Ping(); pingerror != nil {
fmt.Fprintf(w, "Failed to ping database: %s n", pingerror)
return
}
}

变量POSTGRES_INSTANCE_CONNECTION_NAME的格式如此处所述为ProjectID:Region:InstanceID

预期是成功消息或没有错误,我实际上收到此消息:

pq: password authentication failed for user "postgres" 

注意:我还使用我的sql数据库设置创建了一个包含演示代码的函数,错误是相同的。似乎我在设置用户或sql实例时错过了一些步骤。但我找不到哪个。

回答我自己的问题感觉很奇怪,但这里是:由于某种原因,与postgres用户连接不起作用。最后,我为该函数创建了一个新的数据库用户和一个仅包含字母数字字符的密码。

/cloudsql/{connectionName}处的 unix 套接字仅在 GCF 运行时中提供。在本地运行时,需要更改连接字符串或使用 Cloud SQL 代理在同一路径上模拟 unix 套接字。

相关内容

  • 没有找到相关文章

最新更新