能否使用现有Service Principal的OAuth令牌在Azure Databricks中连接Snowflake
服务主体连接Snowflake报错
Invalid OAuth access token解决方案 方案可行性确认
使用现有Azure Service Principal(服务主体)对接Snowflake的方案完全可行,不需要额外新建服务主体,只需在Snowflake侧完成对应权限配置即可解决报错问题。
具体操作步骤
前置要求
操作前需持有Snowflake账户的ACCOUNTADMIN角色权限,同时提前获取以下信息:
- Azure租户ID
- 现有服务主体的客户端ID(Client ID)
- Snowflake的账户标识、要分配的仓库、数据库、Schema资源信息
操作流程
- 创建Azure AD OAuth安全集成(如果已有对应集成可跳过该步骤),执行SQL语句:
CREATE OR REPLACE SECURITY INTEGRATION AZURE_AD_OAUTH_INTEGRATION TYPE = EXTERNAL_OAUTH ENABLED = TRUE EXTERNAL_OAUTH_TYPE = AZURE EXTERNAL_OAUTH_ISSUER = 'https://sts.windows.net/<替换为你的Azure租户ID>/' EXTERNAL_OAUTH_AUDIENCE_LIST = ('https://<替换为你的Snowflake账户标识>.snowflakecomputing.com') EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'oid' EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'LOGIN_NAME';
- 在Snowflake中创建对应用户,绑定现有Azure服务主体:
CREATE OR REPLACE USER <替换为自定义的Snowflake用户名> LOGIN_NAME = '<替换为现有Azure服务主体的客户端ID>' DEFAULT_ROLE = <替换为要分配给该用户的角色,例如PUBLIC>;
- 为该用户分配所需的资源访问权限:
-- 绑定角色到用户 GRANT ROLE <替换为分配的角色名> TO USER <替换为刚才创建的Snowflake用户名>; -- 授予仓库访问权限 GRANT USAGE ON WAREHOUSE <替换为你的Snowflake仓库名> TO ROLE <替换为分配的角色名>; -- 授予数据库、Schema访问权限 GRANT USAGE ON DATABASE <替换为你的数据库名> TO ROLE <替换为分配的角色名>; GRANT USAGE ON SCHEMA <替换为你的Schema名> TO ROLE <替换为分配的角色名>; -- 按需授予表/视图查询等操作权限 GRANT SELECT ON ALL TABLES IN SCHEMA <替换为你的Schema名> TO ROLE <替换为分配的角色名>;
连接验证
回到Databricks侧,确认生成访问令牌时的Scope配置为https://<替换为你的Snowflake账户标识>.snowflakecomputing.com/.default,再运行以下测试代码验证连接:
snowflake_conn_params = { "sfUrl": "<替换为你的Snowflake账户标识>.snowflakecomputing.com", "sfUser": "<替换为刚才创建的Snowflake用户名>", "sfAuthenticator": "oauth", "sfToken": "<替换为生成的Azure访问令牌>", "sfDatabase": "<替换为你的数据库名>", "sfSchema": "<替换为你的Schema名>", "sfWarehouse": "<替换为你的仓库名>" } # 执行测试查询 test_df = spark.read.format("snowflake").options(**snowflake_conn_params).option("query", "SELECT CURRENT_VERSION()").load() test_df.show()
如果正常返回Snowflake版本信息,说明连接配置成功。
注意:如果执行过程中仍有报错,可先检查Azure侧服务主体的令牌生成权限是否正常,确认令牌未过期、Scope配置准确。
内容的提问来源于stack exchange,提问作者Iqram Choudhury
相关产品推荐
相关产品推荐

