【问题标题】:Cannot connect to Cloud SQL SQL Server from Cloud Functions using private IP无法使用私有 IP 从 Cloud Functions 连接到 Cloud SQL SQL Server
【发布时间】:2021-01-28 19:23:51
【问题描述】:

我有一个要连接到 SQL Server 实例的云函数。 根据文档,您只能使用私有 IP 进行连接。

每次我尝试连接时都会收到错误消息:

错误:(gcloud.functions.call)ResponseError:状态=[400],代码=[错误请求],消息= [加载用户代码时功能失败。错误信息:{"code":"ELOGIN","originalError": {"message":"由于触发器执行,登录 'sqlserver' 登录失败。","code":"ELOGIN"},"name":"ConnectionError"}]

我的云函数代码:

const sql = require('mssql');

exports.test = (req, res) => {
  
  const config = {
                user: 'sqlserver',
                password: 'test',
                server: '10.60.80.3',
                port:1433,
                pool: {
                    max: 10,
                    min: 0,
                    idleTimeoutMillis: 30000
                }
            };
            
  const pool = new sql.ConnectionPool(config);
  pool.connect()
            .then(() => {
                res.status(200).send({message: "Connection ready."});
                })
            .catch(err => {
                res.status(500).send(err);
                pool.close();
            });
};

我做了以下配置:

VPC Connector on default network

默认网络已应用于 SQL Server 实例的私有 IP 配置。

SQL Server Instance configuration

创建 Cloud Function 时,您需要选择服务帐户和 VPC 连接器。我选择了 connect-ip-sql 连接器。对于服务帐户,我尝试使用 App Engine Default Service Account 和 Compute Engine Service Account(两者都给出了 Cloud SQL 客户端的角色)。同样的错误。

这似乎是 SQL Server 登录的问题,而不是寻找网络的问题,因为我尝试更改网络(在另一个 VPC 中设置 SQL Server)并返回 CONNECTION TIMEOUT。

我可以使用默认用户名密码在我的 SSMS 中使用公共 ip 登录。当我运行查询时:

select * from sys.server_triggers

有三个服务器触发器,但没有关于它们的作用的信息。

     gcloudsql_RoleManagement
     TRG_ProtectDropCustRootLogin
     TRG_DisableRemoteConnectionForDbRoot 

您无法删除或更改它们,因为 Cloud SQL 是一项托管服务,您无权访问“sa”超级用户。

【问题讨论】:

  • 仍然开放!!今年年初(我想是在一月份)我在 Alpha 中测试它时遇到了这个错误。我向支持人员开了一个案例……我发现问题仍然存在。 public tracker also 上存在未解决的问题。 AFAIK,Cloud Run 没有这个问题。试一试(您可以重复使用相同的连接器,只需将功能打包到网络服务器中)
  • 我也尝试过 App Engine。同样的错误。我从VM实例尝试过,它连接成功。但是从 Cloud Functions 来看,App Engine 仍然是个问题。文档说可以连接..

标签: javascript node.js google-cloud-platform google-cloud-functions google-cloud-sql


【解决方案1】:

最好请求 Google Cloud 支持帮助(公共跟踪器主要针对错误),因为这里可能会出现很多问题。

但话虽如此,我假设您已具备以下条件:

  • GCP 防火墙规则,允许流量进出您的 Cloud Funtion 和 Cloud SQL MSSQL
  • Cloud SQL 使用 VPC 对等互连进行 RFC-1918 连接,因此我假设您的 VPC 连接器路由已导出,而您的 MSSQL 路由已导入并存在
  • 您的 Cloud Funtion VPC 连接器与您的 Cloud MSSQL 位于同一区域

我建议您启用 flow logs 和 GCP firewall logs,同时运行 connectivity test 还可以提示您可能会阻止您的原因

【讨论】:

  • 我在同一网络中创建了一个虚拟机实例,并使用 SQL Server Management Studio,它与私有 IP 成功连接。虚拟机实例不使用 VPC 连接器,它直接连接。连接 Cloud Functions -> Cloud SQL 时会出现问题。与 App Engine - Cloud SQL 和 Cloud Run - Cloud SQL 相同。它只发生在 SQL Server 上,因为使用相同的设置而不更改网络中的任何配置,它适用于 MySQL。
猜你喜欢
  • 2019-12-28
  • 2020-04-29
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2020-01-01
  • 2022-01-24
  • 2017-08-18
相关资源
最近更新 更多