从GAE的Compute Engine实例上运行的mysql服务器连接

时间:2016-01-28 12:04:38

标签: mysql python-2.7 google-app-engine google-compute-engine

如何与谷歌应用引擎上的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")

2 个答案:

答案 0 :(得分:3)

伊戈尔comment above hints at如何使这个工作;我设法制作了一个有效的应用,并对documented solution进行了以下更改。

  1. host参数指定公共(外部)IP地址,而不是unix_socket
  2. 将MySQLdb替换为pymysql。特别是,您希望将该GitHub存储库中的pymysql目录复制到您的应用程序目录中。使用pymysql也意味着您不需要将MySQLdb添加到a​​pp.yaml的libraries:部分。
  3. 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'):
    
  4. 您可能需要在mysql中更改MySQL权限授予以允许the App Engine source IP addresses访问。

  5. 需要此解决方法的原因是App Engine套接字库未实现_socketiopymysql包装器使用的某些异步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