postgresql - 如何从 Go 中的 Cloud Function 连接到 Cloud-SQL?
问题描述
对于一个项目,我正在尝试将云功能连接到云 sql 数据库设置,如本快速入门指南中所述。
该功能配置在同一区域,服务帐户具有 Role Cloud SQL-Client
。我通过我的电脑调用了这个函数,如下所示:
gcloud functions call <function-name> --region=<region> --data '{"recipient":"hello","requester":"hello","message":"test"}'
与函数的连接正在工作,似乎只是对数据库的身份验证不起作用,但我不知道我失败的地方。
我多次检查密码,用户和连接名称,重置密码,它仍然不起作用。我在这里发现了与将云功能连接到云 sql 相关的问题。
我尝试dsn
用单引号将 -string 中的密码括起来,以确保密码中的字符转义不是问题。
我还检查了进来的环境变量,它们是我在配置中输入的。
该函数只是出于测试目的对数据库执行 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
用户联系不起作用。最后,我为该函数创建了一个新的数据库用户和一个仅包含字母数字字符的密码。
推荐阅读
- c++ - 如何将张量列表转换为 Torch::Tensor?
- c# - 在 WPF 中的 DataGridTextColumn 的 Header 属性中使用转换器绑定不起作用
- vue.js - 如何在 vue jest 中使用 addEventListener 模拟元素
- xml - 具有依赖列表框的多选下拉列表
- java - Android - 无法在相对布局上执行 setOnClickListener
- c# - RestSharp 返回:'值不能为空。/n 参数名称:src' - http 状态 0
- android - Firebase Firestore Android - 空列表
- html - 导航栏不适用于视频背景
- java - 循环字符串的摩尔斯电码解码器问题
- websocket - 无法在 windows 命令上使用 wscat 订阅目的地