【发布时间】:2022-06-11 15:32:23
【问题描述】:
我有一个由用户 A 创建的 Snowpipe。然后我希望单独的用户 B 使用 Snowflake REST API 端点 /insertReport 检查其状态。
- 用户 A 是
ACCOUNTADMIN - 用户 A 创建了 Snowpipe。
- 用户 A 为用户 B 的默认角色运行以下命令:
GRANT ALL ON PIPE <my pipe> TO ROLE USER_B_ROLE;
GRANT ALL ON FUTURE PIPES IN DATABASE <my db> TO ROLE USER_B_ROLE;
GRANT MONITOR ON DATABASE <my db> TO ROLE USER_B_ROLE;
GRANT USAGE ON DATABASE <my db> TO ROLE USER_B_ROLE;
GRANT MONITOR ON SCHEMA <my schema> TO ROLE USER_B_ROLE;
GRANT USAGE ON SCHEMA <my schema> TO ROLE USER_B_ROLE;
- 我担任角色
USER_B_ROLE(我没有直接访问权限以用户 B 身份登录)并且可以运行以下命令并按预期查看输出:
USE ROLE USER_B_ROLE;
SELECT CURRENT_ROLE();
-- USER_B_ROLE
DESCRIBE PIPE <my pipe>;
-- created_on,name,database_name,schema_name,definition,owner,notification_channel,comment,integration,pattern,error_integration
-- 2022-01-..., ..., ...
SELECT SYSTEM$PIPE_STATUS('<my db>.<my schema>.<my pipe>');
-- {"executionState":"RUNNING","pendingFileCount":0,"notificationChannelName":"arn:aws:sqs:...","numOutstandingMessagesOnChannel":0,"lastReceivedMessageTimestamp":"..."}
当我尝试使用用户 B 时,使用 GET https://{account}.snowflakecomputing.com/v1/data/pipes/{snowpipe}/insertReport 我收到:{'data': None, 'code': '390403', 'message': 'Not authorized to manage the specified object. Pipe access permission denied', 'success': False, 'headers': None}
我已经检查了公钥 fp 和私钥是否有效,因为我可以获得正确的 JWT 令牌。
我认为我不能将管道和所有未来此类管道的所有权作为一揽子声明转让给用户 B,因为 Terraform 部署,即使是那些没有更改的部署,也会重新创建 PIPE 并删除用户 B 的所有权限 -这就是为什么我想使用FUTURE。
我也尝试过GRANT MONITOR EXECUTION,但这也不起作用。
我缺少什么权限?
相关文档:
- Snowflake REST API 页面未提及所需权限:https://docs.snowflake.com/en/user-guide/data-load-snowpipe-rest-apis.html#endpoint-insertreport
- Snowpipes 仅支持
MONITOR和OPERATE(我已经全部提供):https://docs.snowflake.com/en/user-guide/security-access-control-privileges.html#pipe-privileges - 这个答案说必须授予
OWNERSHIP,但这是 2 年前的事了 - 非所有者肯定有办法检查 Snowpipe 摄取报告,尤其是当我已经可以通过 SQL 直接检查它们时:@ 987654323@ - 这个问题提到了默认角色,但我的用户 B 使用的是我设置的正确默认角色。 Snowflake Pipe access permission denied
【问题讨论】:
-
我看到了所有的 priv,但看不到用户 B 对表的权限?你添加了吗?
-
您能否使用 USER_B_ROLE 从 Snowflake UI 运行 SELECT SYSTEM$PIPE_STATUS?如果可行,那么它也应该通过 REST API 以编程方式运行。
-
@Sergiu 是的,我可以看到使用 USER_B_ROLE 从 Snowflake UI 运行
SELECT SYSTEM$PIPE_STATUS()并查看结果,但是在尝试其余 api 时在我的帖子中得到 403 -
@Anand 啊哎呀,我忘了在帖子中明确说明,但我已将
MONITOR和OPERATE授予数据库+USER_B_ROLE的架构+ 以及FUTURE OPERATE+MONITOR对于数据库中的所有管道。我认为这也应该涵盖表的权限(?) - 我认为 Snowflake 中的权限和权限是相同的。 -
我也有
GRANT SELECT ON TABLE <ingest table> TO ROLE USER_B_ROLE和GRANT USAGE ON WAREHOUSE <some wh> TO ROLE USER_B_ROLE,可以运行select * from table(information_schema.copy_history(TABLE_NAME=>'db.schema.ingest_table', START_TIME=> DATEADD(hours, -1, CURRENT_TIMESTAMP())));查看结果
标签: snowflake-cloud-data-platform