无法使用私有IP从Cloud Functions连接到Cloud SQL SQL Server

时间:2020-10-14 11:38:38

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

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

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

错误:(gcloud.functions.call)ResponseError:状态= [400],代码= [错误请求],消息= [功能在加载用户代码时失败。错误消息:{“代码”:“ 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

创建云功能时,需要选择服务帐户和VPC连接器。我选择了connect-ip-sql连接器。对于服务帐户,我尝试使用App Engine默认服务帐户和Compute Engine服务帐户(均已指定Cloud SQL客户端的角色)。同样的错误。

由于我尝试更改网络(在另一个VPC中设置SQL Server)并且返回了CONNECTION TIMEOUT,这似乎是SQL Server登录的问题,而不是有关查找网络的问题。

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

select * from sys.server_triggers

有三个服务器触发器,但没有任何信息。

     gcloudsql_RoleManagement
     TRG_ProtectDropCustRootLogin
     TRG_DisableRemoteConnectionForDbRoot 

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

1 个答案:

答案 0 :(得分:0)

最好请求Google Cloud Support帮助(公共跟踪器主要用于bug),因为这可能会导致很多问题。

但是话虽如此,我认为您已经具备以下条件:

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

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