NodeJ:无法从Google App Engine连接Google Cloud SQL

时间:2019-07-18 14:06:08

标签: mysql node.js google-app-engine google-cloud-platform google-cloud-sql

一段时间以来,我一直在研究App Engine和Cloud SQL。

最近我已禁用了数据库上的公共访问权限。从那时起,我无法使用我的App Engine连接到CloudSQL(App Engine和Cloud SQL都在同一个Google Cloud Project中)。

我唯一可以连接的方法是在CloudSQL上将App Engine IP列入白名单时。但是在新的部署中,IP发生了变化,因此添加静态IP并不是解决此问题的理想方法。

在Cloud SQL连接选项卡中,它显示以下内容:

  

App Engine授权

  默认情况下,此项目中的所有应用程序都经过授权。要授权其他项目中的应用,请按照以下步骤操作。

     

此项目中的应用:已全部授权。   在这种情况下不正确。

启用了Cloud SQL API和Cloud SQL Admin API。

已经搜索了问题,并按照文档和其他stackoverflow问题中的步骤进行操作:

1)Cannot access Google Cloud SQL database from my App Engine
2)Node JS Mysql PROTOCOL ENQUEUE AFTER FATAL ERROR
3)"PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR" in Node-MySqL
4)Error: Cannot enqueue Query after fatal error in mysql node
5)not able to connect google cloud sql from google app engine

所有这些都没有太大帮助。

connection = mysql.createConnection({
  host     : 'INSTANCE_CONNECTION_NAME',
  user     : 'db_user',
  password : 'db_password',
  database : 'db_name'
});

预期: Get a Connection.
实际: getaddrinfo ENOTFOUND INSTANCE_CONNECTION_NAME INSTANCE_CONNECTION_NAME:3306

不确定为什么要花两次INSTANCE_CONNECTION_NAME

2 个答案:

答案 0 :(得分:2)

如果我了解您的问题,请告诉我。

您拥有公共IP,但仅当项目中的应用程序可以访问时才可以对其进行访问。如果是这种情况,并且考虑到您使用的是灵活环境,我发现以下方法会有所帮助

1)建立连接时,将Host命名为172.17.0.6

2)并按照您的“实例概述”页面中所述,在app.yaml中指定 INSTANCE_CONNECTION_NAME

3)部署并运行。

这将在使用Docker构建Flexible NodeJs环境时起作用。并且使用的默认数据库容器位于172.17.0.6,在此处访问实例连接名称,并在App EngineCloudSQL DB之间建立了连接。

答案 1 :(得分:0)

我试图复制您的用例场景,以下步骤对我有用。 您有没有公共IP的Cloud SQL实例,然后为了从App Engine连接到它,您将需要为两个服务使用相同的VPN网络。因此,您将必须编辑Cloud SQL实例以指示要使用的网络并编辑app.yaml配置文件。 同样重要的是,两个服务都必须在同一地区运行。

您必须在app.yaml配置文件中添加以下标签:

network:
    name: [YOUR_NETWORK_NAME]
    subnetwork_name: [YOUR_SUBNETWORK_NAME]

并使用数据库环境变量:

env_variables:
  SQL_USER: [YOUR_USER]
  SQL_PASSWORD: [YOUR_PASSWORD]
  SQL_DATABASE: [YOUR_DATABASE-NAME]
  # e.g. my-awesome-project:us-central1:my-cloud-sql-instance
  INSTANCE_CONNECTION_NAME:<INSTANCE_CONNECTION_NAME>
# [END gae_flex_mysql_env]

最后一行如下:

beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME>

请记住,您必须用所需的数据替换“ <>”或“ []”中的内容。

有关更多信息,您可以查看此文档 Connecting from App Engine