教程 5:配置和测试服务端点权限¶
简介¶
在教程 1 中,您使用相同的角色来创建和测试服务。服务的创建角色是服务的所有者角色,因此您可以使用该角色与服务通信。
在本教程中,您将探索使用不同的角色与服务通信。
您使用您在服务规范中定义的 服务角色 为此角色授予 USAGE 权限。
在本教程中,您将按如下方式修改 教程 1:
创建您将用来与服务通信的新角色。
修改服务规范,如下所示:
定义两个端点,而不只是一个端点。请注意,添加第二个端点只是为了演示端点权限的工作原理。
定义只能访问两个端点之一的服务角色。
为您创建的新角色授予服务角色,以允许访问服务端点之一。
使用新角色与服务端点通信。
准备¶
按照 通用设置 进行以下修改:
完成通用设置步骤。
使用 ACCOUNTADMIN 角色执行以下脚本,以创建另一个角色 (
service_function_user_role
),将user_name
替换为 Snowflake 用户的名称。创建 Echo 服务后,您将使用此角色与服务通信。USE ROLE ACCOUNTADMIN; CREATE ROLE service_function_user_role; GRANT ROLE service_function_user_role TO USER <user-name>; GRANT USAGE ON WAREHOUSE tutorial_warehouse TO ROLE service_function_user_role;
按照 教程 1 的第 1 步和第 2 步,构建镜像并将其上传到账户中的仓库。不要继续执行第 3 步,因为您将在本教程中创建服务。
创建服务¶
要确保您处于此步骤中 SQL 语句的正确上下文中,请执行以下步骤:
USE ROLE test_role; USE DATABASE tutorial_db; USE SCHEMA data_schema; USE WAREHOUSE tutorial_warehouse;
要创建服务,请使用
test_role
(服务的所有者角色)执行以下命令。CREATE SERVICE echo_service IN COMPUTE POOL tutorial_compute_pool FROM SPECIFICATION $$ spec: containers: - name: echo image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest env: SERVER_PORT: 8000 CHARACTER_NAME: Bob readinessProbe: port: 8000 path: /healthcheck endpoints: - name: echoendpoint port: 8000 public: true - name: echoendpoint2 port: 8002 public: true serviceRoles: - name: echoendpoint_role endpoints: - echoendpoint $$;
根据内联规范,
echo_service
公开两个公共端点,但服务角色 (echoendpoint_role
) 仅在其中一个端点上授予 USAGE 权限。验证服务是否正在运行。
SHOW SERVICES; SELECT SYSTEM$GET_SERVICE_STATUS('echo_service'); DESCRIBE SERVICE echo_service;
使用
test_role
(服务的所有者角色),向您在通用设置中创建的新角色 (service_function_user_role
) 授予规范中定义的服务角色。同时授予对数据库和架构的 USAGE 权限。USE ROLE test_role; USE DATABASE tutorial_db; USE SCHEMA data_schema; GRANT USAGE ON DATABASE tutorial_db TO ROLE service_function_user_role; GRANT USAGE ON SCHEMA data_schema TO ROLE service_function_user_role; GRANT SERVICE ROLE echo_service!echoendpoint_Role TO ROLE service_function_user_role;
此服务角色授予对
echoendpoint
端点的service_function_user_role
USAGE 权限。为演示服务角色名称不区分大小写,示例使用
echoendpoint_Role
角色名称。
使用服务¶
创建服务函数,与服务进行通信。您使用 service_function_user_role
(不是服务的所有者角色)创建服务函数并使用服务。
创建服务函数。
USE ROLE service_function_user_role; CREATE OR REPLACE FUNCTION my_echo_udf_try1 (InputText VARCHAR) RETURNS varchar SERVICE=echo_service ENDPOINT=echoendpoint AS '/echo';
尝试创建另一个服务函数,该函数引用角色对其没有访问权限的
echoservice2
端点。因此,命令应 失败。CREATE OR REPLACE FUNCTION my_echo_udf_try2 (InputText varchar) RETURNS varchar SERVICE=echo_service ENDPOINT=echoendpoint2 AS '/echo';
使用服务函数。
SELECT my_echo_udf_try1('Hello');
清理¶
要删除您创建的资源,请按照 教程 1 步骤中的步骤清理教程 1 中创建的其他资源。
下一步是什么?¶
现在,您已完成本教程,可以返回 使用服务 以探索其他主题。