【发布时间】: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