标准环境下的GCP:MySQL数据库连接被拒绝

2024-06-15 02:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是让一个正在工作的python2.7项目(MySQL+msword文件)在GCP工作。 我意识到我需要

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

成功创建SQL第二代实例并设置用户。在

如何运行或部署

我使用云Shell测试应用程序-dev_appserver.py $PWD,并从cloudshell-gcloud app deploy部署应用程序。It works at appspot.com直到我尝试在其中使用MySQL连接。在

MySQL连接

MySQL连接代码取自here

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()

变量设置在应用程序yaml

^{pr2}$

当应用程序通过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)的云代理,但问题仍然存在。。。似乎代理后台应用程序只用于从本地机器连接到云SQL。在

You do not need to use the proxy or configure SSL to connect to Cloud SQL from the App Engine standard or flexible environment. (source)

为什么连接被拒绝?

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

更新1

我在云控制台编辑代码,到目前为止,云控制台运行良好。在

更新2

我已经通过云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

comment on a similar issue关系到云SQL实例App Engine App应该所在的区域,即在同一个区域中。在

就我而言,我检查过:

  • 要连接到的云SQL实例:us-central1-a
  • 应用程序引擎应用程序:美国中央银行

这些是同一地区的吗?-发现了一个区域的这些区域。在

更新4

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

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

但这似乎是在我用同一个项目打开另一个云Shell实例(coral-heuristic-215610)之后发生的。在那个实例中,我已经开始连接到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:

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


Tags: theto实例app应用程序fordbsql
2条回答

GAE应用程序和Google云SQL实例必须部署在同一个区域if you’re using MySQL First Generation,否则,我验证了只要使用第二代MySQL,它们就可以位于不同的区域。在

我很难理解你想从哪里联系。我假设您希望使用代理和Cloud SDK Credentials从Google云Shell连接。根据有关Cloud SQL Proxy的文件:

The Cloud SQL Proxy provides secure access to your Cloud SQL Second Generation instances without having to whitelist IP addresses or configure SSL.

The Cloud SQL Proxy works by having a local client, called the proxy, running in the local environment. Your application communicates with the proxy with the standard database protocol used by your database. The proxy uses a secure tunnel to communicate with its companion process running on the server.

请记住,由于您没有部署应用程序,所以它不会使用您在应用程序yaml. 因此,您必须自己导出并在本地计算机中设置它们:

export CLOUDSQL_CONNECTION_NAME=your-connection-name
export CLOUDSQL_USER=root
export CLOUDSQL_PASSWORD=xxxxx

通过执行echo $CLOUDSQL_CONNECTION_NAME验证它们是否已设置。当您使用gcloud app deploy部署应用程序时,这是不必要的,因为GAE设置了在应用程序yaml. 在

在尝试按照these步骤建立连接之前,必须启动代理:

下载代理:

^{pr2}$

授予it执行权限:

chmod +x cloud_sql_proxy

启动代理,将<INSTANCE_CONNECTION_NAME>替换为云SQL实例连接名称:

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306

你应该在结尾看到类似的内容:

 2018/11/09 13:24:32 Rlimits for file descriptors set to {&{8500 1048576}} 
 2018/11/09 13:24:35 Listening on 127.0.0.1:3306 for my-project:cloud-sql-region:cloud-sql-name 
 2018/11/09 13:24:35 Ready for new connections

此时,您可以从GoogleCloud Shell instance连接到本地运行的代理服务器,该代理又将您连接到云SQL实例。在

打开另一个Cloud Shell session(或制表符)并用python myapp.py启动代码。您将连接到本地运行的代理。您也可以通过运行mysql -h 127.0.0.1 user=root -p来测试连接。在

我通过添加应用程序yaml以下内容:

beta_settings:
    cloud_sql_instances: "<CONNECTION_NAME>"

相关问题 更多 >