我的目标是让一个可用的 Python 2.7 项目(MySQL + MS Word 文件)在 GCP 上工作。
我意识到我需要
- App Engine - 应用程序将在其中运行(缩放等)。
- Cloud SQL working as MySQL db.
For that I've followed that Cloud SQL for MySQL tut https://cloud.google.com/appengine/docs/standard/python/cloud-sql/using-cloud-sql-mysql and
- Cloud SQL 实例的创建方式为
root
user.
- App Engine 应用和 Cloud SQL 实例位于同一项目中。
- 云储存
SQL二代实例创建成功并显示root用户已设置。
我如何运行或部署
我使用 Cloud Shell 来测试该应用 -dev_appserver.py $PWD
并从 Cloud Shell 部署应用程序 -gcloud app deploy
. 它适用于 appspot.com https://coral-heuristic-215610.appspot.com/直到我尝试在其中使用 MySQL 连接。
MySQL连接
MySQL连接代码取自here https://cloud.google.com/appengine/docs/standard/python/cloud-sql/using-cloud-sql-mysql#code_sample_overview:
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 https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe)但问题仍然存在...似乎代理后台应用程序仅用于从我的本地计算机连接到 Cloud SQL。
您无需使用代理或配置 SSL 即可从 App Engine 标准或灵活环境连接到 Cloud SQL。 (source https://cloud.google.com/sql/docs/mysql/sql-proxy#what_the_proxy_provides)
为什么连接被拒绝?
我应该使用第一代 Cloud sql 实例来简化与 App Engine 的连接吗?
Update 1
我在 Cloud Console 中编辑代码,到目前为止 Cloud Console 运行良好。
Update 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)]>
Update 3
The 对类似问题发表评论 https://github.com/GoogleCloudPlatform/getting-started-python/issues/129#issuecomment-367348828涉及的地区云 SQL 实例 and 应用程序引擎应用程序应该是,即在同一地区.
就我而言,我检查过:
- 要连接到的 Cloud SQL 实例:美国中央1-a
- 应用程序引擎应用程序:美国中央银行
这些是同一个地区的吗?- 结果是一个地区的这些.
Update 4
我本可以想出打开数据库连接:
DB connection: <_mysql.connection open to '127.0.0.1' at 7f628c02bc00>
但这似乎仅在我使用同一项目打开另一个 Cloud Shell 实例后才发生(珊瑚-启发式-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:
我猜第一个cloud shell实例开始连接到db是因为第二个实例已将我的 IP 列入白名单,不是吗?