【发布时间】:2021-09-14 04:30:59
【问题描述】:
刚才一切正常,但突然 Google Cloud Run 无法连接 Cloud SQL。 Cloud Run 和 Cloud SQL 都在同一个项目中。 Cloud SQL 有公共 IP。
Cloud Run 正在运行一个容器化的 Django/uwsgi/nginx 应用程序。出现以下错误:
MySQLdb._exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'xx.xxx.xx.xxx:3306' (110)")
Django 设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': my_db_name,
'USER': my_db_user,
'PASSWORD': my_db_password,
'HOST': cloud_sql_ip_address,
'PORT': '3306',
}
}
以下是 Cloud Run yaml 片段:
annotations:
run.googleapis.com/client-name: gcloud
client.knative.dev/user-image: my_custom_manage
run.googleapis.com/client-version: 347.0.0
run.googleapis.com/cloudsql-instances: my_project_id:us-central1:my_sql_server
autoscaling.knative.dev/maxScale: '10'
run.googleapis.com/sandbox: gvisor
我也检查了这个 - https://cloud.google.com/sql/docs/mysql/connect-run
附加到 Cloud Run 服务的服务帐户具有Compute Engine default service account,这基本上意味着它具有所有访问权限。
解决方案:
对于可能遇到此问题的任何人,请使用套接字参考,而不是 IP 和端口。由于 Cloud Run 创建套接字以连接到 Cloud SQL,而 Django 的 IP:3306 不起作用。
我的更新 django DB 设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': my_db_name,
'USER': my_db_user,
'PASSWORD': my_db_password,
'HOST': f'/cloudsql/cloud_sql_connection_name'
}
}
我不确定为什么它之前使用 IP:3306 运行良好,但 Cloud Run 应该在启动本身时给出错误。
【问题讨论】:
-
Cloud run 使用 unix 套接字连接到 SQL。从您的错误消息看来,它试图直接连接到 IP。我会检查应用程序代码,看看是否有未检测到的更新,连接字符串应该基于套接字而不是 IP。套接字格式为:
/cloudsql/connection_id在这里查看更多信息:codingforentrepreneurs.com/blog/… -
像魅力一样工作,感谢@Pentium10。从来不知道我必须参考套接字。如果您将此评论作为答案发表,我会接受,非常感谢。
标签: django nginx google-cloud-sql uwsgi google-cloud-run