【问题标题】:Connecting App Engine to Cloud SQL Access Denied将 App Engine 连接到 Cloud SQL 访问被拒绝
【发布时间】:2020-05-29 17:28:51
【问题描述】:

我正在尝试让我的 Flask App Engine 项目读取存储在 Cloud SQL MySQL 5.7 数据库中的数据。出了点问题,因为我得到的只是pymysql.err.OperationalError。我一直按照这里的说明进行操作:https://cloud.google.com/sql/docs/mysql/connect-app-engine

  1. Cloud SQL Admin API 已启用。

  2. 根据链接文档:

    App Engine 使用服务帐号来授权您与 Cloud SQL 的连接。此服务帐户必须具有正确的 IAM 权限才能成功连接。除非另有配置,否则默认服务帐户的格式为 service-PROJECT_NUMBER@gae-api-prod.google.com.iam.gserviceaccount.com。

列出我的项目权限的 IAM 页面不包含上述格式的成员。 “App Engine 默认服务帐户”的格式为:my-project-name@appspot.gserviceaccount.com。此服务帐号具有 Cloud SQL 客户端和编辑者角色。

  1. 虽然我的查询不成功,但每次尝试后我都会在日志查看器中记录: 7183 [Note] Access denied for user 'www-data'@'cloudsqlproxy~xxx.xxx.xx.xx' (using password: YES) (IP 地址已编辑)。这有点令人困惑,因为“www-data”不是我在代码中指定的用户。

  2. 用于连接的代码:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://' + ':' + db_user + '@/' + db_name + '?unix_socket=/cloudsql/' + connection_name

我哪里出错了,我该如何解决?

【问题讨论】:

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


    【解决方案1】:

    当尝试使用错误的凭据连接到数据库时,此错误是 mySQL 错误。

    请验证您使用的值是否正确。

    如果您不记得数据库用户名和密码,您可以按照以下步骤在控制台上更改它,这些步骤也已说明here

    • 转到CloudSQL console
    • 选择您的数据库
    • 转到用户
    • 点击用户旁边的三个点
    • 然后选择更改密码
    • 输入新密码并点击确定

    【讨论】:

    • 你的第一句话就成功了!在这种情况下,连接到数据库时出现错误,因为连接字符串的格式不正确。对比:app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://' + ':' + db_user + '@/' + db_name + '?unix_socket=/cloudsql/' + connection_name 与:app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://' + db_user + ':' + db_pass + '@/' + db_name + '?unix_socket=/cloudsql/' + connection_name
    【解决方案2】:

    您很可能是在本地构建和测试您的应用,并在其中提供具有 Cloud SQL 访问权限的用户名的凭据。在构建时,除非您另外指定,否则默认用户名将分配给应用引擎实例。

    要解决这个问题:

    1. 前往 IAM 和管理员
    2. 搜索应用引擎账号-->以gae-api-prod.google.com.iam.gserviceaccount.com结尾
    3. 编辑
    4. 分配权限Cloud SQL 客户端

    如果这能解决你的问题,请告诉我!

    【讨论】: