无法从应用程序引擎连接到Postgres CloudSQL

时间:2019-05-17 13:03:49

标签: google-app-engine google-cloud-sql

我正在使用Go创建我的第一个App Engine项目。我在云控制台内部的同一项目中有一个云SQL实例和应用引擎。

我的app.yaml文件中包含以下内容:

service: myservice
runtime: go
api_version: go1

env_variables:
  #for deploying
  #POSTGRES_CONNECTION: "user=postgres password=<redacted> dbname=my_database host=/cloudsql/myproject:us-west1:myserver"

  #for testing locally via cloud proxy
  POSTGRES_CONNECTION: "user=postgres password=<redacted> dbname=mydatabase sslmode=disable"


beta_settings:
  cloud_sql_instances: myproject:us-west1:myserver

handlers:

# All URLs are handled by the Go application script
- url: /.*
  script: _go_app

在代码中,我像这样打开连接:

datastoreName := os.Getenv("POSTGRES_CONNECTION")
db, err := sql.Open("postgres", datastoreName)

在我的本地计算机上,我这样设置cloud_sql_proxy

./cloud_sql_proxy -instances=passio-nutrition-develop-bcb6:us-west1:nutrition-sqlite-source=tcp:5432

通过设置POSTGRES_CONNECTION进行本地测试,一切工作都很好。

但是,当我设置POSTGRES_CONNECTION进行部署并运行gcloud app deploy时,尝试打入端点时会收到错误消息:

{"Op":"dial","Net":"unix","Source":null,"Addr":{"Name":"/cloudsql/myproject:us-west1:myserver/.s.PGSQL.5432","Net":"unix"},"Err":{"Syscall":"socket","Err":1}}

我尝试了POSTGRES_CONNECTION的各种不同版本,包括在=tcp:5432host的末尾添加cloud_sql_instances,但是我无法使连接正常工作。 / p>

如果有人可以给我一些很棒的指针

2 个答案:

答案 0 :(得分:1)

确保已启用Cloud SQL Admin API,并且您的默认App Engine服务帐户具有正确的IAM权限(它需要具有Cloud SQL Connect角色或更高权限)。

答案 1 :(得分:0)

app.yaml示例

运行时:开始

api_version:go1

处理程序:

url:/ stylesheets

static_dir:样式表

url:/(。*。(gif | png | jpg))$

static_files:静态/ \ 1

上传:静态/.*。(gif | png | jpg)$

url:/.*

脚本:_go_app

连接到Postgresql

软件包主要

导入(

“数据库/ sql”

“ fmt”

_“ github.com/lib/pq”

const(

host =“ localhost”

端口= 5432

user =“ postgres”

password =“您的密码”

dbname =“ calhounio_demo”

func main(){

psqlInfo:= fmt.Sprintf(“主机=%s端口=%d用户=%s” +

"password=%s dbname=%s sslmode=disable",

host, port, user, password, dbname)

db,err:= sql.Open(“ postgres”,psqlInfo)

if err!= nil {

panic(err)

}

推迟db.Close()

err = db.Ping()

if err!= nil {

panic(err)

}

fmt.Println(“已成功连接!”)

}