如何公开Apache Spark外部数据连接供外部用户调用BigQuery远程存储过程?
我通过公开预览版的Apache Spark外部数据连接器,创建了一个由BigQuery远程存储过程调用的简单Python脚本:
print("Hello World!")
我使用以下SQL语句在名为public的BigQuery公共数据集中创建了远程存储过程:
CREATE OR REPLACE PROCEDURE `tumult-labs.public.helloworld`() WITH CONNECTION `tumult-labs.us.bigspark` OPTIONS (engine='SPARK', main_file_uri='gs://analytics-procedures/helloworld.py') LANGUAGE python
调用语句:
CALL `tumult-labs.public.helloworld`()
该过程在组织内部可正常调用,日志能输出预期的Hello World!。但外部用户无法调用此远程存储过程:我已为外部私域Gmail账户开通连接器的公开预览权限,该用户可自行创建并运行上述脚本,但调用tumult-labs.public.helloworld时出现权限报错:
Access Denied: Connection projects/tumult-labs/locations/us/connections/bigspark: User does not have bigquery.connections.use permission for connection projects/tumult-labs/locations/us/connections/bigspark. at [1:1]
目前tumult-labs.public数据集已设置为allUsers权限,但无法将外部数据连接tumult-labs.us.bigspark设为公开。请问:
- 是否可以配置为让用户使用自身的Apache Spark外部数据连接调用该存储过程?
- 或者如何将现有连接设为公开?
1. 让用户使用自身连接调用存储过程
BigQuery远程存储过程在创建时会绑定指定连接,无法直接让调用者替换为自身连接,但可以通过两种方式实现类似需求:
- 提供存储过程创建模板:给外部用户提供你的存储过程创建语句模板,让他们替换其中的
WITH CONNECTION参数为自己的Spark连接,自行创建可调用的存储过程。 - 动态SQL拼接调用逻辑:创建一个接受连接名称作为参数的存储过程,通过动态SQL生成调用逻辑,但这种方式需要额外权限配置,且存在安全风险,需谨慎使用。
2. 现有连接公开的限制与替代方案
BigQuery外部数据连接不支持直接设置为公开(allUsers权限),因为连接关联了资源权限和身份验证信息,公开会带来安全风险。你可以通过以下方式授权外部用户访问:
- 单独授予用户权限:在IAM中找到该连接资源(路径为
projects/tumult-labs/locations/us/connections/bigspark),给目标外部用户添加BigQuery Connection User角色(包含bigquery.connections.use权限)。 - 通过Google Groups批量授权:创建一个Google群组,将所有需要访问的外部用户加入群组,再给该群组授予
BigQuery Connection User角色,减少逐个授权的工作量。
内容的提问来源于stack exchange,提问作者Peak

