一段时间以来,我一直在研究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
。
答案 0 :(得分:2)
如果我了解您的问题,请告诉我。
您拥有公共IP,但仅当项目中的应用程序可以访问时才可以对其进行访问。如果是这种情况,并且考虑到您使用的是灵活环境,我发现以下方法会有所帮助
1)建立连接时,将Host命名为172.17.0.6
2)并按照您的“实例概述”页面中所述,在app.yaml中指定 INSTANCE_CONNECTION_NAME 。
3)部署并运行。
这将在使用Docker构建Flexible NodeJs环境时起作用。并且使用的默认数据库容器位于172.17.0.6
,在此处访问实例连接名称,并在App Engine
和CloudSQL 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。