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

Jdbc connection error from Google Apps Script

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

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

我与另一个帐户共享了该文件,但突然看到一条红色错误消息:

'Failed to establish a database connection. Check connection string, username and password.'

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

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

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

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

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

There are two ways of establishing a connection with a Google Cloud SQL database using Apps Script's JDBC service:

  • (Recommended) Connecting using Jdbc.getCloudSqlConnection(url)
  • Connecting using Jdbc.getConnection(url)

备注:

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

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

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

Manage the data in your Google SQL Service instances

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

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

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

参考文献:


结论

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

  1. 可安装触发器(运行与您一样)。

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

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

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

首先,转到控制台。

https://console.cloud.google.com

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

我有一个使用 Google 云分贝的 GAS Add-On。我最初是这样设置的:

  1. 在我的 SQL 实例中将 Google Cloud IP 范围列入白名单
  2. 为 OAuth 同意屏幕获得 script.external_request 范围批准

对于 add-on,GAS 的这一切都很好,但我怀疑如果这个白名单不全面且不稳定(我希望如此),我会看到间歇性的连接问题。

我最近添加了一个需要访问相同 dB 的 Firebase 网络应用程序。我遇到了问题,因为 Firebase 不符合那些 Google IP 范围并且不会公开其 IP 以用于白名单。所以我不得不创建一个 socket layer connection 就好像 Firebase 是一个外部服务。

这让我开始思考,我是否应该在我的 GAS 中放置一个套接字层 Add-On?但是 GAS JBDC Class documentation 中没有任何内容表示套接字参数。

这让我想到了一个问题,这个问题在这个帖子中没有得到真正的回答:

有谁知道为什么 Jdbc.getCloudSqlConnection(url)“推荐” 方法?文档似乎暗示因为不需要 IP 白名单,Jdbc.getCloudSqlConnection(url) 正在使用套接字(或其他一些安全方法)连接到 dB?

如果是这样的话,我需要两个有两个敏感范围来管理 dB 连接,这似乎也很愚蠢。我宁愿不通过另一个 OAuth const 审计并要求我的用户接受另一个范围,除非这样做有好处。