首页 > 解决方案 > 标准环境下的 GCP:MySQL 数据库连接被拒绝

问题描述

我的目标是让 Python 2.7 项目(MySQL + MS Word 文件)在 GCP 工作。我意识到我需要

  1. App Engine - 应用程序将在哪里运行(缩放等)。
  2. Cloud SQL 作为 MySQL 数据库工作。为此,我遵循了Cloud SQL for MySQL tut
    • Cloud SQL 实例是使用root用户创建的。
    • App Engine 应用和 Cloud SQL 实例都在同一个项目中。
  3. 云储存

SQL二代实例创建成功,并设置了root用户。

我如何运行或部署

我使用 Cloud Shell 来测试应用程序 -dev_appserver.py $PWD并从 Cloud Shell 部署应用程序 - gcloud app deploy它在 apppot.com 上工作,直到我尝试在其中使用 MySQL 连接。

MySQL 连接

MySQL 连接代码取自这里

import MySQLdb
import webapp2    

CLOUDSQL_CONNECTION_NAME = os.environ.get('CLOUDSQL_CONNECTION_NAME')
CLOUDSQL_USER = os.environ.get('CLOUDSQL_USER')
CLOUDSQL_PASSWORD = os.environ.get('CLOUDSQL_PASSWORD')    
DB_NAME='test-db'
def connect_to_cloudsql():
    # When deployed to App Engine, the `SERVER_SOFTWARE` environment variable
    # will be set to 'Google App Engine/version'.
    if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
        # Connect using the unix socket located at
        # /cloudsql/cloudsql-connection-name.
        cloudsql_unix_socket = os.path.join(
            '/cloudsql', CLOUDSQL_CONNECTION_NAME)

        db = MySQLdb.connect(
            unix_socket=cloudsql_unix_socket,
            user=CLOUDSQL_USER,
            passwd=CLOUDSQL_PASSWORD)

    # If the unix socket is unavailable, then try to connect using TCP. This
    # will work if you're running a local MySQL server or using the Cloud SQL
    # proxy, for example:
    #
    #   $ cloud_sql_proxy -instances=your-connection-name=tcp:3306
    #
    else:
        db = MySQLdb.connect(
            host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD, db=DB_NAME)

    return db
db = connect_to_cloudsql()

变量在app.yaml中设置:

runtime: python27
api_version: 1
threadsafe: true
env_variables:
    CLOUDSQL_CONNECTION_NAME: coral-heuristic-215610:us-central1:db-basic-1
    CLOUDSQL_USER: root
    CLOUDSQL_PASSWORD: xxxxx

当应用程序通过测试模式运行dev_appserver.py $PWD并且我选择使用 MySQL 连接时,出现错误:

ERROR    2018-09-13 08:37:42,492 wsgi.py:263]
Traceback (most recent call last):
  ...
  File "/home/.../mysqldb.py", line 35, in connect_to_cloudsql
    host='127.0.0.1', user=CLOUDSQL_USER, passwd=CLOUDSQL_PASSWORD)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 204, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2003, 'Can\'t connect to MySQL server on \'127.0.0.1\' (111 "Connection refused")')

云 SQL 代理

我已经下载并运行了 Win-64 的云代理(https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe)但问题仍然存在......似乎代理后台应用程序仅用于连接到 Cloud SQL从我的本地机器。

您无需使用代理或配置 SSL 即可从 App Engine 标准或柔性环境连接到 Cloud SQL。(来源

为什么连接被拒绝?

我应该使用第一代 Cloud sql 实例来简化与 App Engine 的连接吗?

更新 1

我在 Cloud Console 上编辑代码,到目前为止 Cloud Console 运行良好。

更新 2

我已成功通过 Cloud Shell 连接到 sql 实例:

(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root

Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 48841
Server version: 5.7.14-google-log (Google)
MySQL [(none)]>

更新 3

对类似问题的评论涉及Cloud SQL 实例App Engine 应用应位于的区域,即在同一区域中。

就我而言,我已经检查过:

这些是一个地区的吗?- 原来这些是一个地区的

更新 4

我本可以想办法打开数据库连接:

DB connection: <_mysql.connection open to '127.0.0.1' at 7f628c02bc00>

但这似乎只有在我用相同的项目 ( coral-heuristic-215610 ) 打开另一个 Cloud Shell 实例之后才发生。在那个实例中,我已经开始连接到 SQL 实例并且它是成功的:

(coral-heuristic-215610)$ gcloud sql connect db-basic-1 --user=root

Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:

我猜第一个 cloud shell 实例开始连接到 db 因为第二个实例已将我的 IP 列入白名单,不是吗?

标签: pythongoogle-app-enginegoogle-cloud-platformgoogle-cloud-sqlgoogle-app-engine-python

解决方案


我通过向 app.yaml 添加以下内容解决了连接被拒绝的问题:

beta_settings:
    cloud_sql_instances: "<CONNECTION_NAME>"

推荐阅读