如何与谷歌应用引擎上的Compute Engine实例上运行的mysql服务器进行通信?我们使用谷歌应用引擎作为前端。我们希望在Compute Engine上运行的mysql服务器上托管我们的数据库。有没有办法实现这个目标?
我们经历过这个: https://cloud.google.com/solutions/mysql-remote-access
代码段:
if (os.getenv('SERVER_SOFTWARE') and
os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
db=MySQLdb.connect(host="InternalIP", port=3306, db='test_database', user='root',passwd="db_password")
else:
db = MySQLdb.connect(host='127.0.0.1', port=3306, db='test_database', user='root', charset='utf8')
cursor = db.cursor()
logging.info("Hey there looks like I am connected")
答案 0 :(得分:3)
伊戈尔comment above hints at如何使这个工作;我设法制作了一个有效的应用,并对documented solution进行了以下更改。
host
参数指定公共(外部)IP地址,而不是unix_socket
。pymysql
。特别是,您希望将该GitHub存储库中的pymysql
目录复制到您的应用程序目录中。使用pymysql
也意味着您不需要将MySQLdb
添加到app.yaml的libraries:
部分。在connections.py
左右第52行,更改以下行:
if _py_version == (2, 7) and not IRONPYTHON
到
if _py_version == (2, 7) and not IRONPYTHON and not os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine'):
您可能需要在mysql中更改MySQL权限授予以允许the App Engine source IP addresses访问。
需要此解决方法的原因是App Engine套接字库未实现_socketio
中pymysql
包装器使用的某些异步IO基元。与此同时,App Engine附带的MySQLdb
模块包装了一个C库,该库不知道如何使用App Engine sockets
库(可能没有编译套接字支持)。
我将查看后一种组合是否可以解决,但与此同时,上述3个步骤应提供一种解决方法,可用于连接到您自己的MySQL或version 2 of Cloud SQL。< / p>
答案 1 :(得分:0)
如果您在Appengine中运行此代码,那么它不可能,因为appengine不允许自定义Socket连接。您需要将受管VM用于此实例
幸运的是,从Appengine迁移到Managed VM实例非常简单。 在app.yaml上,您只需要添加 vm:true
module: default
runtime: python27
api_version: 1
threadsafe: yes
vm: true
default_expiration: 1h
handlers:
# Main script
- url: .*
script: main.main_app
login: required
使用此命令(来自Cloud SDK):
进行部署gcloud preview app deploy app.yaml