来自 Google Apps 脚本的 Jdbc 连接错误

Posted

技术标签:

【中文标题】来自 Google Apps 脚本的 Jdbc 连接错误【英文标题】:Jdbc connection error from Google Apps Script 【发布时间】:2018-12-14 13:05:31 【问题描述】:

我创建了一个 Google Cloud Project mysql 数据库,以与 Google Apps Script 提供的 Jdbc 服务结合使用。一切都按计划进行。我基本上按照文档中的方式进行连接。

var conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);

我与另一个帐户共享文件,突然我看到一个红色错误提示:

'建立数据库连接失败。检查连接字符串、用户名和密码。'

代码中没有任何变化,但是有一个错误。当我回到我的原始帐户并运行相同的代码时,没有错误。这里发生了什么?有什么想法吗?

【问题讨论】:

您能否检查 MySQL 数据库的权限以查看您使用的凭据是否仅限于特定主机 (IP)? @GordThompson 我对控制台非常陌生,请原谅我。我的用户帐户有“主机名:%(任何主机)” 在文档中,如果您从不同的提供商developers.google.com/apps-script/guides/… 连接,它还建议添加 IP 范围,我添加了所有这些以防万一但仍然出现该错误。我认为我什至不需要它们,因为它是一个 Google Cloud 项目。 基于此link,有一个known bug 会导致使用主机名的jdbc 连接出现问题。尝试改用 IP 地址。 【参考方案1】:

Jdbc.getConnection 适用于:我的帐户和另一个帐户:

var conn = Jdbc.getConnection('jdbc:mysql://' + IP + ':3306/' + database_name, user, password)

我真的很困惑,因为recommended 方法不起作用。

有两种方法可以与 Google Cloud 建立连接 使用 Apps Script 的 JDBC 服务的 SQL 数据库:

(推荐)使用Jdbc.getCloudSqlConnection(url)连接 使用Jdbc.getConnection(url) 连接

注意事项:

IP 是数据库控制台中 OVERVIEW 选项卡中的公共 IP 地址: 我在创建用户时允许任何主机:

【讨论】:

感谢@Max 很高兴知道另一个用户也遇到了这个问题。尝试文档建议的许多选项需要很长时间。最后你上面的格式为我解决了。渴望了解为什么推荐版本似乎不起作用。 如果您遵循此建议,请记住将此处列出的应用脚本 IP 地址列入白名单:developers.google.com/apps-script/guides/…【参考方案2】:

我不确定这个问题是否已经解决,但让我添加这个答案。

我也遇到了同样的问题,但我找到了解决办法。我所做的是:

首先,进入控制台。

https://console.cloud.google.com

然后,打开 IAM。 并将帐户添加为成员并添加此权限:“Cloud SQL Client”。

【讨论】:

刚刚遇到同样的问题,通过实验,赫伯特的回答似乎对getCloudSqlConnection() 是正确的:我在任何地方都找不到它的文档,但似乎getCloudSqlConnection() 通过了活动用户的google 帐户,并要求该用户在 Cloud Project 的 IAM 控制台中具有 SQL 相关权限。未经许可的用户会收到“无法建立...”错误。 这在我的情况下不起作用。我拥有该成员的“云 SQL 客户端”权限,但该成员运行的 Apps 脚本(实际上一直是我)仍然返回错误。一定是缺少其他东西【参考方案3】:

我认为这是您第二个帐户的权限问题。您的问题中缺少必要的信息。但是,第二个帐户,如果作为另一个用户运行,则不一定有您的 sqlservice 授权。权限,

https://www.googleapis.com/auth/sqlservice

管理您的 Google SQL 服务实例中的数据

需要使用Jdbc.getCloudSqlConnection(url),而Jdbc#getConnectionUrl()只需要外链连接权限

https://www.googleapis.com/auth/script.external_request

我相信您只能使用getCloudSqlConnection() 连接到您拥有的sql 实例,甚至不需要外部连接权限。此方法可能会在内部调用您的 sql 实例。

参考资料:

Jdbc#getCloudConnection

Jdbc#getConnection


结论

要连接到任何外部服务,您需要external_request 权限。但是,您不需要该权限来连接到您自己的文档,例如,您拥有的电子表格/具有编辑访问权限 - 通过 SpreadsheetApp.openByUrl()。我相信Jdbc.getCloudSqlConnection() 也是如此。它在内部调用您的 Google sql - 因此,即使您授予外部请求权限,它也不起作用。这种方法的工作原理是

    可安装的触发器(随您运行)。

    将第二个帐户也添加为 GCP-IAM 中的所有者(虽然可能不起作用)参见this answer

【讨论】:

谢谢!您能否分享带有文本的链接:“管理您的 Google SQL 服务实例中的数据”? @Max 点击here 查看。我在任何身份验证范围文档中都找不到它(最接近的是 sqlservice.admin 文档)。所以,我刚刚用getCloudsql()创建了一个新项目> 尝试运行它> Google 将在没有外部请求权限的情况下请求此权限。然而,上面的链接是一个游乐场链接。 这可能与您提到的未向用户请求的范围有关吗?自从我遇到这个问题已经有一段时间了,我从来没有清楚地理解我做错了什么或者我的解决方法是如何解决这个问题的。 另外,我觉得我应该改变接受的答案,但是,我会等着看@MaxMakhrov 说什么。 @Jordan 要连接到任何外部服务,您需要external_request 权限。但是,您不需要该权限来连接到您自己的文档,例如,您拥有的电子表格/具有编辑访问权限 - 通过SpreadsheetApp.openByUrl。我相信Jdbc.getCloudSqlConnection() 也一样。它在内部调用您的 Google sql - 因此,即使您授予外部请求权限,它也不起作用。对这种方法有用的是 1.Installable 触发器(随您运行)。我将尝试的另一件事是:2. 在 GCP-IAM 中将第二个帐户也添加为所有者(但可能不起作用)。【参考方案4】:

我会再次仔细检查所有应列入白名单的 IP 范围。根据您的描述,它在第一个帐户中运行良好,可能在第二个帐户中,Apps 脚本使用另一个 IP 进行连接,该 IP 未列入白名单或因某些错字而被列入白名单。您能否分享一下屏幕截图,您是如何将 article 中的范围准确列入白名单的?

【讨论】:

我将其标记为正确,但是,它并不能解决 getCloudSqlConnection() 的问题。 IP 地址仅适用于 getConnection 方法。 好吧,也许您的项目中有多个脚本文件 .gs 具有相同的函数名和不同的参数?

以上是关于来自 Google Apps 脚本的 Jdbc 连接错误的主要内容,如果未能解决你的问题,请参考以下文章

获取 Google Apps 脚本中最后插入行的标识

Google Apps Script JDBC - 仅当 cpanel 中的远程数据库访问主机设置为全开时有效

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

使用 Google Apps Script、Google Cloud SQL 和 JDBC 存储日期

在 Google Apps 中查询 MySql 多个语句

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表