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 - 因此,即使您授予外部请求权限,它也不会起作用。此方法的作用是
可安装触发器(运行与您一样)。
将第二个帐户也添加为 GCP-IAM 中的所有者(虽然可能不起作用)请参见
我不确定这个问题是否已经解决,但让我添加这个答案。
我也遇到了同样的问题,但我找到了解决办法。我所做的是:
首先,转到控制台。
https://console.cloud.google.com
然后,打开 IAM。
并将帐户添加为成员并添加此权限:"Cloud SQL Client".
我有一个使用 Google 云分贝的 GAS Add-On。我最初是这样设置的:
- 在我的 SQL 实例中将 Google Cloud IP 范围列入白名单
- 为 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 审计并要求我的用户接受另一个范围,除非这样做有好处。
我已经创建了一个 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 - 因此,即使您授予外部请求权限,它也不会起作用。此方法的作用是
可安装触发器(运行与您一样)。
将第二个帐户也添加为 GCP-IAM 中的所有者
(虽然可能不起作用)请参见
我不确定这个问题是否已经解决,但让我添加这个答案。
我也遇到了同样的问题,但我找到了解决办法。我所做的是:
首先,转到控制台。
https://console.cloud.google.com
然后,打开 IAM。 并将帐户添加为成员并添加此权限:"Cloud SQL Client".
我有一个使用 Google 云分贝的 GAS Add-On。我最初是这样设置的:
- 在我的 SQL 实例中将 Google Cloud IP 范围列入白名单
- 为 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 审计并要求我的用户接受另一个范围,除非这样做有好处。