【问题标题】:NodeJs:Unable to connect Google Cloud SQL from Google App EngineNodeJs:无法从 Google App Engine 连接 Google Cloud SQL
【发布时间】:2019-11-27 12:05:08
【问题描述】:

我从事 App Engine 和 Cloud SQL 已经有一段时间了。

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

我能够连接的唯一方法是在 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

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

连接 = mysql.createConnection({ 主机:'INSTANCE_CONNECTION_NAME', 用户:'db_user', 密码:'db_password', 数据库:'db_name' });

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

不知道为什么它需要INSTANCE_CONNECTION_NAME 两次。

【问题讨论】:

  • 使用 Google Cloud SQL 代理。 cloud.google.com/sql/docs/mysql/connect-app-engine
  • 按照链接中的步骤操作。还是同样的问题。同样的错误
  • 错误是什么?
  • getaddrinfo ENOTFOUND INSTANCE_CONNECTION_NAME INSTANCE_CONNECTION_NAME:3306 这是错误。

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


【解决方案1】:

我尝试复制您的用例场景,以下步骤对我有用。 您的 Cloud SQL 实例没有公共 IP,然后要从 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.

【讨论】:

  • 我有公共 IP,我所做的只是使全局访问被删除。虽然我会研究 VPN 的想法,但我现在还没有设置 VPN。
  • 如果我理解正确,您正在尝试使用私有 IP 连接,我的解决方案应该可以帮助您解决它。
【解决方案2】:

如果我理解您的问题,请说明。

您拥有公共 IP,但已将其设置为仅供您项目中的应用程序访问。如果是这种情况,并且考虑到您使用的是灵活的环境,我发现以下方法很有帮助

1) 建立连接时,提及Host为172.17.0.6

2) 在 app.yaml 中指定 INSTANCE_CONNECTION_NAME,如您的实例概述页面中所述。

3) 部署并运行。

这将作为灵活的 NodeJs 环境使用 Docker 构建。并且默认使用的DB容器是172.17.0.6,这里访问实例连接名,并在App EngineCloudSQL DB之间建立连接。

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2020-06-07
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多