我有一个要连接到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”超级用户。
答案 0 :(得分:0)
最好请求Google Cloud Support帮助(公共跟踪器主要用于bug),因为这可能会导致很多问题。
但是话虽如此,我认为您已经具备以下条件:
我建议您启用flow logs和GCP firewall logs,同时运行connectivity test也会提示您可能阻止您的行为