【问题标题】:Connecting to Cloud SQL from Google Cloud Function using Python and SQLAlchemy使用 Python 和 SQLAlchemy 从 Google Cloud Function 连接到 Cloud SQL
【发布时间】:2019-02-14 09:12:56
【问题描述】:

我阅读了所有与从 GCF 连接到托管在 Cloud SQL 中的 MySQL 相关的 documentation,但仍然无法连接。此外,尝试了SQLAlchemy related to this 文档中的所有提示。 我正在使用以下连接

con = 'mysql+pymysql://USER:PASSWORD@/MY_DB?unix_socket=/cloudsql/Proj_ID:Zone:MySQL_Instance_ID'
mysqlEngine = sqlalchemy.create_engine(con)

我得到的错误是:

(pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection denied)") (这个错误的背景:http://sqlalche.me/e/e3q8)

【问题讨论】:

  • 您能否使用telnet <server ip> <port>检查主机服务器是否可以连接到该服务器\
  • 是的@AmilaMGunawardana,我可以使用 Kubernetes 连接到它,也可以使用 vpn 从我的笔记本电脑连接到它,但不使用云功能。当然,我使用的不是 UNIX 套接字,而是 ip:port 格式

标签: python sqlalchemy google-cloud-platform google-cloud-functions google-cloud-sql


【解决方案1】:

您需要确保使用正确的/cloudsql/<INSTANCE_CONNECTION_NAME>(格式为<PROJECT_ID>:<REGION>:<INSTANCE_ID>)。如果您的 Cloud SQL 实例与您的函数在同一个项目和区域中,那么这应该是所有需要的。

GCF 文档还强烈建议将您的池限制为单个连接。这意味着您应该在引擎设置中同时设置pool_size=1max_overflow=0

如果您想查看如何设置这些设置的示例,请查看Github 上的此示例应用程序。

【讨论】:

  • 我使用的是云功能而不是 App Engine
  • 相关代码(关于使用unix套接字和引擎创建)是相同的。您只需要调整我在回答中提到的参数即可。
【解决方案2】:

我相信您的问题在于<PROJECT_ID>:<REGION>:<INSTANCE_ID> 表示的Connection_namecon 字符串变量的末尾。

顺便说一句应该引用的:

con = 'mysql+pymysql://USER:PASSWORD@/MY_DB?unix_socket=/cloudsql/<PROJECT_ID>:<REGION>:<INSTANCE_ID>'

用这个命令检查你是否写对了:

gcloud sql instances describe <INSTANCE_ID> | grep connectionName

如果不是这样,请记住these considerations present in the Cloud Functions official documentation

第一代 MySQL 实例必须与您的 Cloud Function 位于同一区域。第二代 MySQL 实例和 PostgreSQL 实例可在任何区域使用 Cloud Functions。

您的 Cloud Function 可以访问您项目中的所有 Cloud SQL 实例。如果您的 Cloud Function 服务帐号(列在 GCP Console 的 Cloud Function 常规选项卡上)作为成员添加到具有 Cloud SQL 实例的项目的 IAM 中,则您可以访问其他项目中的第二代 MySQL 实例和 PostgreSQL 实例( s) 具有 Cloud SQL 客户端角色。

【讨论】:

  • 感谢您的回复,是的,确实应该引用字符串,所以我更新了我的问题。我运行了您建议的 gcloud 命令,它抱怨名称中存在“:”,因此我删除了除实例名称本身之外的所有内容。结果与我在字符串中使用的结果相同。在没有项目和区域的情况下仅使用实例名称更新代码会引发以下错误:(2003,“无法连接到‘localhost’上的 MySQL 服务器([Errno 2] 没有此类文件或目录)我使用的是第二代 MySQL实例,因此无论 GCF 区域如何,它都应该可用
  • gcloud 命令在抱怨是什么意思?如果您要给一个有效的<INSTANCE_ID> 小费,它会输出connectionName: <PROJECT_ID>:<REGION>:<INSTANCE_ID>
  • 我首先尝试使用完整路径名 ::,得到解释的错误。所以我使用了 确实有效,它带来了相同的 :: 我在我的问题中使用的连接字符串
  • 我仍然认为您在用户名、密码、db_name... 变量之一中存在拼写错误。但是,如果您认为错误不在您的代码中,请打开 Google Cloud 支持票证。他们有内部工具来检查连接是否存在问题。
【解决方案3】:

在与 Google Support 进行了长时间的讨论后,我们发现原因是:我们应该在没有任何防火墙规则的情况下启用对 Cloud SQL 的公共访问。它是无证的,可能会让你发疯,但支持团队的灵丹妙药是:它处于测试阶段!

【讨论】:

    【解决方案4】:

    我遇到了这个问题。服务帐户是正确的,具有正确的权限,与我的 App Engine 应用程序中的连接字符串完全相同。日志中仍然有这个。

    dial unix /cloudsql/project:region:instance connect: no such file or directory

    从第 2 代 Cloud Function 切换到第 1 代解决了这个问题。没有看到它记录在 2nd 无法连接到 Cloud SQL 实例的任何地方。

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 2019-05-26
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多