Créer et gérer des services de longue durée dans une application

Cette rubrique décrit comment configurer et utiliser les services de longue durée dans un Snowflake Native App with Snowpark Container Services. Pour obtenir des informations sur l’utilisation d’un service de tâche dans une application, consultez Créer et gérer des services de tâche dans une application.

Privilèges requis pour créer un service dans le compte du consommateur

Pour qu’une application puisse créer un service dans le compte du consommateur, ce dernier doit d’abord lui accorder les privilèges suivants :

  • CREATE COMPUTE POOL

    Ce privilège est requis pour tous les services. Un ou plusieurs pools de calcul sont nécessaires pour créer un service dans le compte du consommateur.

  • BIND SERVICE ENDPOINT

    Ce privilège est requis pour tout service qui expose des points de terminaison. Si un service doit établir des connexions avec des URLs en dehors de Snowflake, ce privilège est nécessaire pour que l’application crée l’intégration d’accès externe requise.

Points à prendre en compte lors de la création de services au sein d’une application

Les considérations suivantes s’appliquent lors de la création d’un service au sein d’un Snowflake Native App with Snowpark Container Services :

  • Références aux entrepôts. Voir Bonnes pratiques pour l’utilisation de services dans une application pour des informations sur l’utilisation dans un Snowflake Native App with Snowpark Container Services.

  • Les noms entre guillemets pour un service au sein d’une application ne sont pas pris en charge.

  • Les services ne peuvent pas être créés dans un schéma versionné.

  • Les services ne peuvent pas être créés en dehors de l’application en utilisant une image de conteneur créée dans l’application.

Utiliser la commande CREATE SERVICE dans une application

Utilisez CREATE SERVICE pour créer un service de longue durée. Dans le contexte d’une application, les fournisseurs devraient toujours envisager d’appeler cette commande à partir d’une procédure stockée au lieu de l’appeler directement dans le script d’installation.

Pour créer un service, utilisez la commande CREATE SERVICE dans une procédure stockée. L’exemple suivant montre la syntaxe d’utilisation de cette commande dans une application.

CREATE SERVICE [ IF NOT EXISTS ] <name>
  IN COMPUTE POOL <compute_pool_name>
  {
    fromSpecification
    | fromSpecificationTemplate
  }

fromSpecification ::=
  SPECIFICATION_FILE = '/containers/service1_spec.yaml'

fromSpecificationTemplate ::=
  FROM SPECIFICATION_TEMPLATE_FILE = '/containers/service1_spec.yaml'
  USING ( <key> => <value> [ , <key> => <value> [ , ... ] ]  )
Copy

La clause FROM SPECIFICATION_FILE renvoie au fichier de spécification de service spécifique à une version de l’application. Ce chemin dépend du répertoire racine de l’application.

Ajouter la commande CREATE SERVICE à une procédure stockée

Un Snowflake Native Apps with Snowpark Container Services permet de créer un service de différentes manières dans le cadre d’une procédure stockée.

Un fournisseur peut utiliser n’importe quelle combinaison de ces méthodes pour créer des services dans le compte du consommateur.

Créer un service en utilisant la propriété grant_callback

grant_callback est une propriété du fichier manifeste qui permet aux fournisseurs de spécifier une fonction de rappel. La fonction de rappel est une procédure stockée qui peut créer des pools de calcul, des services et effectuer d’autres tâches de configuration requises par l’application.

Note

L’utilisation de la propriété grant_callback pour spécifier la fonction de rappel n’est prise en charge que par Snowflake Native Apps with Snowpark Container Services.

L’avantage de spécifier une fonction de rappel avec grant_callback est que la procédure stockée n’est pas appelée tant que le consommateur n’a pas accordé les privilèges requis à l’application. Cela permet de s’assurer que l’application dispose des privilèges nécessaires pour créer des services et d’autres objets dans le compte du consommateur.

Pour utiliser grant_callback, ajoutez-le à la section configuration du fichier manifest.yml :

configuration:
  log_level: INFO
  trace_level: ALWAYS
  grant_callback: core.grant_callback
Copy

Ensuite, dans le script d’installation, définissez une fonction de rappel comme indiqué dans l’exemple suivant :

 CREATE SCHEMA core;
 CREATE APPLICATION ROLE app_public;

 CREATE OR REPLACE PROCEDURE core.grant_callback(privileges array)
 RETURNS STRING
 AS $$
 BEGIN
   IF (ARRAY_CONTAINS('CREATE COMPUTE POOL'::VARIANT, privileges)) THEN
      CREATE COMPUTE POOL IF NOT EXISTS app_compute_pool
          MIN_NODES = 1
          MAX_NODES = 3
          INSTANCE_FAMILY = GPU_NV_M;
   END IF;
   IF (ARRAY_CONTAINS('BIND SERVICE ENDPOINT'::VARIANT, privileges)) THEN
      CREATE SERVICE IF NOT EXISTS core.app_service
       IN COMPUTE POOL my_compute_pool
       FROM SPECIFICATION_FILE = '/containers/service1_spec.yaml';
   END IF;
   RETURN 'DONE';
 END;
 $$;

GRANT USAGE ON PROCEDURE core.grant_callback(array) TO APPLICATION ROLE app_public;
Copy

Cet exemple crée une procédure grant_callback qui effectue les opérations suivantes :

  • Teste si le consommateur a accordé le privilège CREATE COMPUTE POOL à l’application. Si le consommateur a accordé ce privilège, la procédure grant_callback crée le pool de calcul.

  • Teste si le consommateur a accordé le privilège BIND SERVICE ENDPOINT à l’application. Si le consommateur a accordé ce privilège, la procédure grant_callback crée le service.

Cet exemple montre un modèle de création de services et d’un pool de calcul dans une application avec des conteneurs. Dans cet exemple, l’application teste d’abord si le consommateur a accordé les privilèges requis, puis crée le service ou le pool de calcul.

Créer un service sur la base d’une définition de référence

Une application peut créer des services à l’aide d’une définition de référence en utilisant la propriété register_callback dans le fichier manifest.yml. Cette propriété spécifie une procédure stockée utilisée pour lier un objet du compte du consommateur à la définition de la référence.

Pour plus d’informations sur l’utilisation des références dans une application, voir Demander des références et des privilèges au niveau de l’objet des consommateurs

Une application peut utiliser register_callback de la référence pour créer un service une fois que toutes les références requises sont liées. Si un service est créé avant que toutes les références à une intégration d’accès externe ou à un secret soient autorisées, la création du service échoue.

Créer un service à l’aide d’une procédure stockée

Une application peut créer un service directement dans une procédure stockée. Comme pour les autres procédures stockées, les fournisseurs peuvent les définir dans le script de configuration de l’application. Cette procédure stockée utilise la commande CREATE SERVICE pour créer le service, puis accorde les privilèges nécessaires sur la procédure stockée à un rôle d’application.

Le consommateur appelle cette procédure stockée pour créer le service dans son compte après avoir donné à l’application les privilèges et les références nécessaires.

Déterminer le statut d’un service

Pour déterminer le statut d’un service, une appli peut appeler la fonction système SYSTEM$GET_SERVICE_STATUS — Obsolète à partir du script de configuration.

Cette fonction système renvoie un objet JSON pour chaque conteneur de chaque instance de service.

Bonnes pratiques pour l’utilisation de services dans une application

Vous trouverez ci-dessous les meilleures pratiques et considérations à prendre en compte lors de l’utilisation de services au sein d’un Snowflake Native App with Snowpark Container Services :

  • Créez une application Streamlit ou des procédures stockées qui permettent aux consommateurs d’interagir avec un service.

    Dans certaines situations, un consommateur peut avoir besoin de créer, démarrer, arrêter, redémarrer et gérer les services fournis par l’appli.

  • Utilisez une seule procédure stockée pour vérifier que le consommateur a accordé tous les privilèges requis.

    Un service peut nécessiter que le consommateur accorde plusieurs privilèges à l’appli. Par exemple, un service peut nécessiter les privilèges CREATE COMPUTE POOL, CREATE WAREHOUSE, BIND SERVICE ENDPOINT et d’autres. Une appli peut également nécessiter une référence à des objets existants dans le compte du consommateur.

    Dans ce contexte, Snowflake recommande d’utiliser une seule procédure stockée pour vérifier que toutes les conditions préalables ont été remplies. Une fois les conditions préalables remplies, cette procédure stockée crée le service.

  • Si un service nécessite un entrepôt pour exécuter des requêtes, l’application doit créer l’entrepôt directement dans le compte du consommateur. Pour ce faire, le consommateur doit accorder le privilège global CREATE WAREHOUSE à l’application. Voir Demander des privilèges globaux des consommateurs pour plus d’informations.

  • Lors de la création d’un service à l’aide d’un modèle de spécification, stockez les arguments fournis par le consommateur dans votre instance d’application. Cela permet de les transmettre comme arguments lors de la mise à niveau d’un service.