我有一个云函数,我想连接到SQL Server实例。根据文档,您只能使用专用IP进行连接。
每次我尝试连接时,我都会收到错误:
错误:(gcloud.functions.call(ResponseError:状态=【400】,代码=【错误请求】,消息=[加载用户代码时函数失败。错误消息:{quot;code":"ELOGIN","originalError":{"消息":"由于触发器执行,登录名"sqlserver"的登录失败。","代码":"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连接器
默认网络已应用于SQL Server实例的专用IP配置。
SQL Server实例配置
创建云功能时,需要选择服务账号和VPC连接器。我选择了connect-ip-sql连接器。对于服务帐户,我尝试了应用引擎默认服务帐户和计算引擎服务帐户(都被赋予了云SQL客户端的角色(。同样的错误。
这似乎是SQL Server登录的问题,而不是查找网络的问题,因为我尝试更改网络(在另一个VPC中设置SQL Server(,结果返回CONNECTION TIMEOUT。
我可以使用默认用户名密码在SSMS中使用公共ip登录。当我运行查询时:
select * from sys.server_triggers
有三个服务器触发器,但没有关于它们的作用的信息
gcloudsql_RoleManagement
TRG_ProtectDropCustRootLogin
TRG_DisableRemoteConnectionForDbRoot
您不能删除或更改它们,因为云SQL是一个托管服务,您无权访问"sa"超级用户。
最好请求谷歌云支持帮助(公共跟踪器主要用于bug(,因为这里可能会出现很多问题。
但话虽如此,我认为你已经具备了以下条件:
- GCP防火墙规则,允许从/到您的Cloud Funtion和Cloud SQL MSSQL的流量
- Cloud SQL使用VPC对等进行RFC-1918连接,所以我假设您的VPC连接器路由是导出的,MSSQL路由也是导入的
- 您的Cloud Funtion VPC连接器与您的Cloud MSSQL位于同一区域
我建议您启用流量日志和GCP防火墙日志,同时运行连接测试也可以为您提供可能阻止的提示