Tutoriel 5 : Configurer et tester les privilèges des points de terminaison de service

Introduction

Dans le tutoriel 1, vous utilisez le même rôle pour créer et tester un service. Le rôle qui crée le service est le rôle propriétaire du service, vous pouvez donc communiquer avec le service en utilisant ce rôle.

Dans ce tutoriel, vous explorerez l’utilisation d’un rôle différent pour communiquer avec le service.

Vous accordez à ce rôle le privilège USAGE à l’aide d’un rôle de service que vous définissez dans la spécification du service.

Dans ce tutoriel, vous modifiez le tutoriel 1 comme suit :

  1. Créez un nouveau rôle que vous utiliserez pour communiquer avec le service.

  2. Modifiez la spécification du service comme suit :

    • Définissez deux points de terminaison, au lieu d’un seul. Notez que le deuxième point de terminaison n’est ajouté que pour démontrer le fonctionnement des autorisations des points de terminaison.

    • Définissez un rôle de service autorisé à accéder à un seul des deux points de terminaison.

  3. Attribuez le rôle de service au nouveau rôle que vous avez créé pour permettre l’accès à l’un des points de terminaison de service.

  4. Utilisez le nouveau rôle pour communiquer avec le point de terminaison de service.

Préparer

Suivez Configuration commune avec les modifications suivantes :

  1. Complétez les étapes de la configuration commune.

  2. En utilisant le rôle ACCOUNTADMIN, exécutez le script suivant pour créer un autre rôle (service_function_user_role), en remplaçant user_name par le nom de votre utilisateur Snowflake. Après avoir créé le service echo, vous utilisez ce rôle pour communiquer avec le service.

    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. Suivez le tutoriel 1, étapes 1 et 2, pour créer et télécharger une image dans un référentiel de votre compte. Ne passez pas à l’étape 3 car vous allez créer le service dans le cadre de ce tutoriel.

Créez un service

  1. Pour vous assurer que vous êtes dans le bon contexte pour les instructions SQL dans cette étape, exécutez ce qui suit :

    USE ROLE test_role;
    USE DATABASE tutorial_db;
    USE SCHEMA data_schema;
    USE WAREHOUSE tutorial_warehouse;
    
    Copy
  2. Pour créer le service, exécutez la commande suivante en utilisant test_role (le rôle de propriétaire du service).

    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

    Conformément à la spécification en ligne, echo_service expose deux points de terminaison publics, mais le rôle de service (echoendpoint_role) n’accorde le privilège à USAGE que sur l’un des points de terminaison.

  3. Vérifiez que le service fonctionne.

    SHOW SERVICES;
    SELECT SYSTEM$GET_SERVICE_STATUS('echo_service');
    DESCRIBE SERVICE echo_service;
    
    Copy
  4. En utilisant test_role (le rôle de propriétaire du service), accordez le rôle de service défini dans la spécification au nouveau rôle (service_function_user_role) que vous avez créé dans le cadre de la configuration commune. Accordez aussi les privilèges USAGE sur la base de données et le schéma.

    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

    Ce rôle de service accorde le privilège service_function_user_role USAGE sur le point de terminaison echoendpoint.

    Pour démontrer que le nom du rôle de service n’est pas sensible à la casse, l’exemple utilise le nom de rôle echoendpoint_Role.

Utilisez le service

Créez une fonction de service pour communiquer avec le service. Vous créez une fonction de service à l’aide de service_function_user_role (et non du rôle de propriétaire du service) et vous utilisez le service.

  1. Créez une fonction de service.

    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. Essayez de créer une autre fonction de service faisant référence au point de terminaison echoservice2 pour lequel le rôle ne dispose d’aucun privilège d’accès. Par conséquent, la commande devrait échouer.

    CREATE OR REPLACE FUNCTION my_echo_udf_try2 (InputText varchar)
      RETURNS varchar
      SERVICE=echo_service
      ENDPOINT=echoendpoint2
      AS '/echo';
    
    Copy
  3. Utilisez la fonction de service.

    SELECT my_echo_udf_try1('Hello');
    
    Copy

Nettoyage

Pour supprimer les ressources que vous avez créées, suivez les étapes décrites dans Tutoriel 1 pour nettoyer les autres ressources créées dans le tutoriel 1.

Quelle est la prochaine étape ?

Maintenant que vous avez terminé ce tutoriel, vous pouvez retourner à Travailler avec les services pour explorer d’autres sujets.