套接字:连接到 cloudsql 时不允许操作

Posted

技术标签:

【中文标题】套接字:连接到 cloudsql 时不允许操作【英文标题】:socket: operation not permitted when connecting to cloudsql 【发布时间】:2017-12-05 10:14:30 【问题描述】:

尝试使用以下设置进行连接时,我在应用引擎上收到 socket:operation not permitted 错误,但在使用 cloud-sql-proxy 时却没有。以下代码在本地工作,但不适用于应用引擎:

connString = "user=USER_NAME password=PASSWORD host=/cloudsql/INSTANCE_NAME dbname=DB_NAME"
DBCon, err2 = sql.Open("postgres", connString)

应用引擎和云 sql 都在同一个项目中。有人对我缺少什么有任何见解吗?

【问题讨论】:

【参考方案1】:

很遗憾,AppEngine 标准尚不支持 Cloud SQL+postgres:

“注意:不支持从 App Engine 标准环境应用程序连接到 PostgreSQL 实例”

https://cloud.google.com/sql/docs/postgres/connect-app-engine

【讨论】:

我认为现在是允许的。【参考方案2】:

NOTE: This is for mysql second version db

main.go

import (
    _ "github.com/go-sql-driver/mysql",
    "database/sql"
)

func InitDB() (err error, db *DB) 
    db, err = sql.Open("mysql", os.Getenv("SQL_STRING"))

SQL_STRING: 'username:password@cloudsql(project:region:instance_id)/db'

更多参考https://cloud.google.com/appengine/docs/standard/go/cloud-sql/reference

【讨论】:

【参考方案3】:

我的 App Engine 项目使用 MySQL,但理论上连接应该是相同的。这是我的连接方式。如果这不适用于 Postgres,请告诉我

编辑第二代实例

connString:= "@unix(/cloudsql/<your instance>)"
if appengine.IsDevAppServer() 
    connString = "@tcp(<instance ip>:port)"

sqlUser := "<your user>"
sqlPass := "<your pass>"
connString = sqlUser + ":" + sqlPass + connString

// connect main db
db, err := sqlx.Connect("mysql", connString)
if err != nil 
    return nil, err

第一代的旧字符串: connString := "@cloudsql(&lt;your instance&gt;)"

【讨论】:

应用引擎标准似乎说要为 postgres 使用套接字 cloud.google.com/sql/docs/postgres/connect-app-engine 对于他们不久前发布的第二代实例,连接字符串是不同的。现在是“@unix(/cloudsql/)”。更新答案,谢谢。

以上是关于套接字:连接到 cloudsql 时不允许操作的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 unix 套接字从托管在不同 GCP 项目中的 App Engine 柔性环境连接到 Cloud SQL

Java如何使服务器允许连接到套接字端口?

Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器)

邮件发送失败。无法连接到远程服务器。套接字操作

无法使用私有 IP 地址连接到 GCP CloudSQL(CORS 错误预检缺少允许源标头)

PHPMailer:SMTP错误:10051无法连接到服务器:尝试对无法访问的网络执行套接字操作