Tutorial 5: Configurar e testar privilégios de ponto de extremidade do servidor

Introdução

No Tutorial 1, você usa a mesma função para criar e testar um serviço. A função que cria o serviço é a função de proprietário do serviço, então você pode se comunicar com o serviço usando essa função.

Neste tutorial, você explorará o uso de uma função diferente para se comunicar com o serviço.

Você concede a esta função o privilégio USAGE usando uma função de serviço que você define na especificação do serviço.

Neste tutorial, você modifica o Tutorial 1 do seguinte modo:

  1. Crie uma nova função que você usará para se comunicar com o serviço.

  2. Modifique a especificação do serviço da seguinte forma:

    • Defina dois pontos de extremidade, em vez de apenas um. Observe que o segundo ponto de extremidade é adicionado apenas para demonstrar como as permissões de ponto de extremidade funcionam.

    • Defina uma função de serviço que tenha permissão para acessar apenas um dos dois pontos de extremidade.

  3. Conceda a função de serviço à nova função que você criou para permitir acesso a um dos pontos de extremidade do servidor.

  4. Use a nova função para se comunicar com o ponto de extremidade do servidor.

Preparação

Siga a Configuração comum com as seguintes modificações:

  1. Conclua as etapas comuns de configuração.

  2. Usando a função ACCOUNTADMIN, execute o script a seguir para criar outra função (service_function_user_role), substituindo user_name pelo nome do usuário Snowflake. Depois de criar o serviço Echo, você usa essa função para se comunicar com o serviço.

    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. Siga o Tutorial 1, etapas 1 e 2, para criar e enviar uma imagem para um repositório em sua conta. Não prossiga com a etapa 3 porque você criará o serviço como parte deste tutorial.

Criação de um serviço

  1. Para garantir que você esteja no contexto correto para as instruções SQL nesta etapa, execute o seguinte:

    USE ROLE test_role;
    USE DATABASE tutorial_db;
    USE SCHEMA data_schema;
    USE WAREHOUSE tutorial_warehouse;
    
    Copy
  2. Para criar o serviço, execute o seguinte comando usando test_role (a função de proprietário do serviço).

    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

    De acordo com a especificação inline, o echo_service expõe dois pontos de extremidade públicos, mas a função de serviço (echoendpoint_role) concede o privilégio USAGE somente em um dos pontos de extremidade.

  3. Verifique se o serviço está em execução.

    SHOW SERVICES;
    SELECT SYSTEM$GET_SERVICE_STATUS('echo_service');
    DESCRIBE SERVICE echo_service;
    
    Copy
  4. Usando test_role (a função do proprietário do serviço), conceda a função de serviço definida na especificação para a nova função (service_function_user_role) que você criou como parte da configuração comum. O privilégio USAGE no banco de dados e no esquema.

    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

    Esta função de serviço concede a service_function_user_role o privilégio USAGE no ponto de extremidade echoendpoint.

    Para demonstrar que o nome da função de serviço não diferencia maiúsculas de minúsculas, o exemplo usa o nome da função echoendpoint_Role.

Uso do serviço

Crie uma função de serviço para se comunicar com o serviço. Você cria uma função de serviço usando o service_function_user_role (não a função de proprietário do serviço) e usa o serviço.

  1. Crie uma função de serviço.

    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. Tente criar outra função de serviço que se refira ao ponto de extremidade echoservice2 para o qual a função não tem privilégio de acesso. Portanto, o comando deve falhar.

    CREATE OR REPLACE FUNCTION my_echo_udf_try2 (InputText varchar)
      RETURNS varchar
      SERVICE=echo_service
      ENDPOINT=echoendpoint2
      AS '/echo';
    
    Copy
  3. Use a função de serviço.

    SELECT my_echo_udf_try1('Hello');
    
    Copy

Limpeza

Para remover os recursos que você criou, siga as etapas em Tutorial 1 para limpar outros recursos criados no Tutorial 1.

Qual é o próximo passo?

Agora que você concluiu este tutorial, você pode retornar para Como trabalhar com serviços para explorar outros tópicos.