教程 5:配置和测试服务端点权限

简介

在教程 1 中,您使用相同的角色来创建和测试服务。服务的创建角色是服务的所有者角色,因此您可以使用该角色与服务通信。

在本教程中,您将探索使用不同的角色与服务通信。

您使用您在服务规范中定义的 服务角色 为此角色授予 USAGE 权限。

在本教程中,您将按如下方式修改 教程 1

  1. 创建您将用来与服务通信的新角色。

  2. 修改服务规范,如下所示:

    • 定义两个端点,而不只是一个端点。请注意,添加第二个端点只是为了演示端点权限的工作原理。

    • 定义只能访问两个端点之一的服务角色。

  3. 为您创建的新角色授予服务角色,以允许访问服务端点之一。

  4. 使用新角色与服务端点通信。

准备

按照 通用设置 进行以下修改:

  1. 完成通用设置步骤。

  2. 使用 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;
    
    Copy
  3. 按照 教程 1 的第 1 步和第 2 步,构建镜像并将其上传到账户中的仓库。不要继续执行第 3 步,因为您将在本教程中创建服务。

创建服务

  1. 要确保您处于此步骤中 SQL 语句的正确上下文中,请执行以下步骤:

    USE ROLE test_role;
    USE DATABASE tutorial_db;
    USE SCHEMA data_schema;
    USE WAREHOUSE tutorial_warehouse;
    
    Copy
  2. 要创建服务,请使用 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
          $$;
    
    Copy

    根据内联规范,echo_service 公开两个公共端点,但服务角色 (echoendpoint_role) 仅在其中一个端点上授予 USAGE 权限。

  3. 验证服务是否正在运行。

    SHOW SERVICES;
    SELECT SYSTEM$GET_SERVICE_STATUS('echo_service');
    DESCRIBE SERVICE echo_service;
    
    Copy
  4. 使用 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;
    
    Copy

    此服务角色授予对 echoendpoint 端点的 service_function_user_role USAGE 权限。

    为演示服务角色名称不区分大小写,示例使用 echoendpoint_Role 角色名称。

使用服务

创建服务函数,与服务进行通信。您使用 service_function_user_role (不是服务的所有者角色)创建服务函数并使用服务。

  1. 创建服务函数。

    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';
    
    Copy
  2. 尝试创建另一个服务函数,该函数引用角色对其没有访问权限的 echoservice2 端点。因此,命令应 失败

    CREATE OR REPLACE FUNCTION my_echo_udf_try2 (InputText varchar)
      RETURNS varchar
      SERVICE=echo_service
      ENDPOINT=echoendpoint2
      AS '/echo';
    
    Copy
  3. 使用服务函数。

    SELECT my_echo_udf_try1('Hello');
    
    Copy

清理

要删除您创建的资源,请按照 教程 1 步骤中的步骤清理教程 1 中创建的其他资源。

下一步是什么?

现在,您已完成本教程,可以返回 使用服务 以探索其他主题。

语言: 中文