Communication inter-applications

Cette rubrique décrit comment une Snowflake Native App peut communiquer avec une autre Snowflake Native App en utilisant la communication inter-applications (IAC).

Communication inter-applications : Vue d’ensemble

La communication inter-applications (IAC) permet à une Snowflake Native App de fournir des fonctionnalités supplémentaires à d’autres Snowflake Native Apps dans le même compte de consommateur en fournissant un accès à des fonctions et à des procédures que d’autres applications peuvent appeler.

Par exemple, une Snowflake Native App qui résout les IDs client peut aider d’autres Snowflake Native Apps à améliorer les données client en joignant des ensembles de données provenant de différents fournisseurs.

La IAC fournit l’infrastructure pour que deux applications indépendantes, ou plus, communiquent entre elles, tout en respectant leurs besoins en matière de gestion et de sécurité. Les développeurs d’applications activent la IAC pour leur application en procédant comme suit :

  • Création d’interfaces

  • Utilisation des rôles d’application pour contrôler l’accès aux interfaces.

  • Choix d’une interaction synchrone ou asynchrone. L’interaction synchrone utilise des procédures stockées ou des fonctions que d’autres applications peuvent appeler directement, tandis que l’interaction asynchrone donne accès aux résultats des requêtes qui sont stockés dans des tables ou des vues, que d’autres applications peuvent interroger pour vérifier les résultats.

Terminologie

La IAC utilise les termes suivants :

Client

L’application qui initie la demande de connexion et appelle les fonctions et procédures de l’application serveur.

Serveur

L’application qui donne accès à ses fonctions et procédures à l’aide de rôles d’application.

Consommateur

L’utilisateur qui installe les applications client et serveur.

Configuration d’application

Un objet SQL que l’application cliente utilise pour demander le nom de l’application serveur. IAC utilise une configuration d’application de type APPLICATION_NAME pour stocker le nom de l’application serveur.

Spécification d’application

Un objet SQL que l’application cliente crée pour demander une connexion à l’application serveur. La IAC utilise une spécification d’application de type CONNECTION. Pour obtenir des informations sur les spécifications d’application, consultez Vue d’ensemble des spécifications d’application.

Workflow pour la communication inter-applications

L’établissement et l’utilisation d’une connexion impliquent un processus de négociation entre l’application cliente et l’application serveur.

  1. Obtenir les noms des rôles de l’application auprès du fournisseur de l’application serveur : Le fournisseur d’application cliente se coordonne avec le fournisseur d’application serveur en dehors de Snowflake pour déterminer les rôles d’application serveur à demander dans la spécification de connexion.

  2. Identifier l’application cible : L’application cliente crée un objet de définition de configuration pour demander le nom de l’application serveur. Le consommateur détecte les demandes entrantes et fournit le nom de l’application serveur à l’application cliente via l’objet de configuration.

  3. Demander et approuver une connexion : L’application cliente crée une spécification d’application pour demander une connexion à l’application serveur, et le consommateur approuve la demande de connexion.

  4. Communiquer avec l’application serveur : L’application cliente appelle les procédures ou les fonctions de l’application serveur.

Identifier l’application cible

Avant qu’une application cliente puisse communiquer avec une application serveur, elle doit d’abord identifier le nom exact de l’application. Étant donné que le consommateur peut choisir un nom personnalisé pour une application lors de l’installation, l’application cliente doit d’abord identifier le nom exact de l’application serveur.

Le script de configuration de l’application cliente crée un objet CONFIGURATION DEFINITION pour demander ces informations.

L’exemple suivant montre comment le script d’installation de l’application cliente crée un objet CONFIGURATION DEFINITION pour demander le nom de l’application serveur :

ALTER APPLICATION
  SET CONFIGURATION DEFINITION my_server_app_name_configuration
    TYPE = APPLICATION_NAME
    LABEL = 'Server App'
    DESCRIPTION = 'Request for an app that will provide access to server procedures and functions. The server app version must be greater than or equal to 3.2.'
    APPLICATION_ROLES = (my_server_app_role);
Copy

L’exemple suivant montre comment le consommateur vérifie les demandes de définition de configuration entrantes :

SHOW CONFIGURATIONS IN APPLICATION my_server_app_name;
Copy

Cette commande renvoie des résultats similaires à ce qui suit :

name                             | created_on              | updated_on              | type               | ...
my_server_app_name_configuration | 2026-02-09 10:00:00.000 | 2026-02-09 10:00:00.000 | APPLICATION_NAME   | ...

Le consommateur utilise ensuite la commande suivante pour fournir le nom de l’application serveur :

ALTER APPLICATION my_client_app_name
  SET CONFIGURATION my_server_app_name_configuration
  VALUE = MY_SERVER_APP_NAME;
Copy

Demander et approuver une connexion

Une fois que l’application cliente a le nom de l’application serveur, elle crée une APPLICATION SPECIFICATION pour demander une connexion à l’application serveur. Notez que les noms des rôles d’application sont obtenus via une communication hors ligne en dehors de Snowflake.

L’exemple suivant montre comment créer une APPLICATION SPECIFICATION pour une connexion à l’application serveur nommée my_server_app_name :

ALTER APPLICATION SET SPECIFICATION my_server_app_name_connection_specification
  TYPE = CONNECTION
  LABEL = 'Server App'
  DESCRIPTION = 'Request for an app that will provide access to server procedures and functions. The server app version must be greater than or equal to 3.2.'
  SERVER_APPLICATION = MY_SERVER_APP_NAME -- server name obtained from Step 1
  SERVER_APPLICATION_ROLES = (my_server_app_role);
Copy

En créant la spécification d’application, l’application cliente demande à se voir accorder les rôles de l’application serveur spécifiés dans la spécification d’application.

Note

Les valeurs données pour LABEL et DESCRIPTION dans la spécification d’application doivent correspondre aux valeurs données pour LABEL et DESCRIPTION dans l’objet CONFIGURATION DEFINITION créé à l’étape 1. Si les valeurs ne correspondent pas, la connexion ne s’affichera pas correctement dans Snowsight.

Pour créer un workflow de connexion efficace, nous recommandons à l’application cliente de créer la spécification d’application dans le rappel synchrone before_configuration_change. Ce rappel est exécuté lorsque la commande ALTER APPLICATION SET CONFIGURATION VALUE est exécutée. Pour plus d’informations sur les rappels, consultez Rappels. Pour un exemple de script d’installation qui crée la spécification de l’application dans le rappel synchrone before_configuration_change, voir Exemples.

Une fois que l’application cliente a créé la spécification de l’application, le consommateur peut examiner et approuver ou refuser la demande de connexion.

Approbation de la demande de connexion à l’aide de SQL

L’exemple suivant montre comment le consommateur approuve la demande de connexion à l’aide de SQL :

ALTER APPLICATION my_server_app_name
  APPROVE SPECIFICATION my_server_app_name_connection_specification
  SEQUENCE_NUMBER = 1;
Copy

Approbation de la demande de connexion à l’aide de Snowsight

Pour visualiser et approuver les demandes de connexion dans Snowsight, procédez comme suit :

  1. Connectez-vous à Snowsight.

  2. Sélectionnez l’application. Une section intitulée Application connections apparaît sous Configurations. Chaque connexion en attente affiche le nom ou l’étiquette de la connexion, une brève description de la connexion, et un bouton Review.

  3. Cliquez sur le bouton Review. Les détails de la demande de connexion apparaissent.

  4. Sélectionnez l’application cible depuis Select from your apps.

  5. Cliquez sur Next. Les informations suivantes apparaissent :

    • Un schéma montrant que l’application cliente se connectera à l’application serveur, et quels rôles les applications utiliseront.

    • Les détails de la connexion.

    • Un sous-ensemble des autorisations du serveur qui seront accordées à l’application cliente. Pour plus d’informations sur les considérations de sécurité concernant l’IAC, voir Remarques relatives à la sécurité.

    • Un commutateur à bascule Approve Connection. Le commutateur est réglé sur On.

  6. Pour approuver la connexion, laissez le commutateur à bascule sur On, puis cliquez sur Save. La liste des connexions mises à jour apparaît, indiquant l’état de la connexion.

  7. Pour refuser la connexion, sélectionnez le commutateur sur Off.

  8. Pour quitter la page de vérification sans approuver ou refuser la connexion, cliquez sur le bouton Cancel.

Post-approbation

Lorsque le consommateur approuve la demande de connexion, le Snowflake Native App Framework accorde les rôles de l’application serveur demandés à l’application cliente. L’approbation accorde également USAGE sur l’application cliente à l’application serveur. Cela permet à l’application serveur de savoir quelles applications clientes sont connectées à elle.

Lorsque le consommateur approuve la demande de connexion, les rappels suivants sont déclenchés dans les applications cliente et serveur, respectivement :

Ces rappels permettent aux applications serveur et cliente d’effectuer des actions supplémentaires lorsque la connexion est établie.

Pour plus d’informations sur l’approbation des spécifications d’application, reportez-vous aux rubriques suivantes :

Communiquer avec l’application serveur

Une fois que la connexion est établie et que l’application cliente se voit accorder les rôles d’application serveur demandés, l’application cliente peut communiquer avec l’application serveur.

Note

Avant d’appeler les méthodes de l’application serveur, l’application cliente doit récupérer le nom de l’application serveur au moment de l’exécution à partir de la spécification d’application approuvée, afin de s’assurer qu’elle utilise le nom correct au cas où l’application serveur serait renommée. L’exemple suivant montre comment récupérer le nom de l’application serveur au moment de l’exécution :

SHOW APPROVED SPECIFICATIONS ->>
  SELECT PARSE_JSON("definition"):"SERVER_APPLICATION"::STRING
  FROM $1
  WHERE "name" = 'MY_SERVER_APP_NAME_CONNECTION_SPECIFICATION';
Copy

L’application cliente peut communiquer avec l’application serveur de manière synchrone ou asynchrone.

  • La communication synchrone implique d’invoquer directement les procédures ou les fonctions de l’application serveur.

  • La communication asynchrone implique d’utiliser une file d’attente stockée dans un objet de données, tel qu’une table. Par exemple, l’application serveur peut fournir une procédure pour insérer des enregistrements dans une table sous forme de demandes, que l’application serveur traite ensuite périodiquement. L’application cliente peut alors utiliser une autre procédure fournie par le serveur pour vérifier les résultats de la table.

L’exemple suivant d’une opération synchrone montre une application cliente appelant la procédure d’une application serveur à l’aide de Python :

session.call("server_app_name.customer_schema.get_customer_data", customer_id);
Copy

L’exemple suivant d’une opération asynchrone montre une application cliente appelant la procédure d’une application serveur à l’aide de Python : L’application cliente appelle la procédure de l’application serveur, qui crée une demande dans une table, que l’application serveur traite ensuite. L’application cliente peut interroger la table pour vérifier les enregistrements mis à jour des résultats.

session.call("server_app_name.customer_schema.request_customer_data_async", customer_id);
Copy

L’application cliente peut alors interroger la table pour vérifier les enregistrements mis à jour des résultats :

session.call("server_app_name.customer_schema.check_customer_data_requests_async", customer_id);
Copy

Gestion des connexions

Pour voir les connexions existantes dans Snowsight, procédez comme suit :

  1. Connectez-vous à Snowsight.

  2. Dans le menu de navigation, sélectionnez Catalog » Apps.

  3. Sélectionnez l’application. Toutes les connexions de l’application sont indiquées dans une section intitulée Configurations. Sous cette section se trouve une sous-section intitulée Application connections.

  4. Pour modifier une connexion, cliquez sur l’icône en forme de crayon de la connexion. Vous pouvez modifier les éléments suivants :

    • Quelle application est connectée à l’application

    • L’état d’approbation de la connexion

  5. Pour voir l’application connectée, cliquez sur le bouton View app.

  6. Pour modifier les paramètres de sécurité de la connexion, cliquez sur l’icône en forme d’engrenage.

Remarques relatives à la sécurité

Lors de l’approbation d’une demande de spécification, les consommateurs doivent être conscients que l’octroi d’un accès à une application serveur à une application cliente peut augmenter les privilèges dont dispose l’application cliente. Par exemple, si une application serveur dispose d’un accès externe, l’application cliente peut obtenir un accès indirect à Internet ou à d’autres ressources externes via l’application serveur. Si l’application serveur est une application cliente d’une autre application serveur, l’application cliente peut être en mesure d’accéder aux ressources de l’autre application serveur via la première application serveur.

Les consommateurs doivent inspecter les capacités et les privilèges de l’application serveur avant d’approuver une connexion. Utilisez un rôle d’administrateur (par exemple, ACCOUNTADMIN) pour inspecter les capacités du serveur. L’inspection du serveur à l’aide d’un rôle disposant de privilèges réduits ne permettra pas de mettre en évidence l’ensemble des capacités et des privilèges du serveur. Les utilisateurs doivent savoir que le code de l’application serveur ne leur est pas accessible et que les autorisations et capacités de cette application peuvent être modifiées après que l’utilisateur a approuvé la connexion.

Les commandes SQL permettant d’inspecter les capacités et les privilèges de l’application serveur comprennent, sans s’y limiter, les suivantes :

  • SHOW GRANTS TO APPLICATION : Cette commande répertorie les autorisations sur l’application cliente qui ont été accordées à l’application serveur.

  • SHOW PRIVILEGES IN APPLICATION : Cette commande répertorie les privilèges potentiels au niveau du compte qui pourraient être accordés à l’application cliente.

  • SHOW REFERENCES IN APPLICATION : Cette commande répertorie les références que l’application cliente pourrait potentiellement utiliser sans utiliser d’attributions.

  • SHOW SPECIFICATIONS IN APPLICATION : Cette commande répertorie les spécifications d’application que le consommateur a approuvées, y compris les intégrations d’accès externes (EAIs), les intégrations de sécurité, les partages, les annonces et les connexions.

Référence SQL

Les commandes SQL suivantes sont utilisées pour gérer la communication inter-applications.

Rappels

Le Snowflake Native App Framework fournit des rappels de cycle de vie pour aider à gérer le workflow de communication inter-applications. Ces rappels permettent à une application de répondre aux modifications des configurations, des connexions et des spécifications. Pour utiliser les rappels, enregistrez-les dans la section lifecycle_callbacks du fichier manifeste de l’application.

Pour des informations générales sur les rappels, voir Rappels.

Rappels de configuration

Ces rappels sont déclenchés lorsqu’une valeur de configuration est définie ou supprimée. Un cas d’utilisation courant consiste à utiliser le rappel before_configuration_change pour créer automatiquement une spécification de connexion lorsque le consommateur fournit le nom de l’application serveur.

validate_configuration_change

Un rappel synchrone appelé dans le cadre de la commande ALTER APPLICATION SET CONFIGURATION VALUE. Permet à l’application d’effectuer une validation personnalisée sur la valeur fournie. Si le rappel renvoie une erreur, la commande échoue et la nouvelle valeur n’est pas définie.

before_configuration_change

Un rappel synchrone appelé dans le cadre des commandes ALTER APPLICATION SET CONFIGURATION VALUE et ALTER APPLICATION UNSET CONFIGURATION. Permet à l’application d’effectuer des opérations en fonction de la valeur de la configuration avant qu’elle ne soit enregistrée.

after_configuration_change

Un rappel asynchrone appelé après l’exécution des commandes ALTER APPLICATION SET CONFIGURATION VALUE ou ALTER APPLICATION UNSET CONFIGURATION. Permet à l’application de répondre au changement, par exemple à des fins de notification ou de suivi.

Rappels de connexion

Ces rappels sont déclenchés lorsque le statut d’une connexion change, par exemple lorsqu’une connexion est établie, refusée ou interrompue, ou lorsque l’application connectée est supprimée.

after_server_connection_change

Un rappel asynchrone déclenché dans l’application cliente par toute opération ayant une incidence sur l’état de la connexion, notamment l’acceptation, le refus ou l’abandon d’une spécification, ou la suppression de l’application serveur.

after_client_connection_change

Un rappel asynchrone déclenché dans l’application serveur par toute opération ayant une incidence sur l’état de la connexion, notamment l’acceptation, le refus ou l’abandon d’une spécification, ou la suppression de l’application cliente.

after_server_version_change

Un rappel asynchrone appelé dans l’application cliente après les modifications de la version ou du numéro de correctif de l’application serveur. Permet à l’application cliente de réagir à une mise à niveau ou à une rétrogradation.

Exemples

Les exemples suivants montrent comment configurer une application pour utiliser la communication inter-applications.

Exemple : Script d’installation et fichiers manifestes

L’exemple suivant montre le script d’installation d’une application cliente (setup.sql) :

CREATE OR ALTER VERSIONED SCHEMA app_schema;

-- create a callback that creates the connection request before the config value of the server name is saved
CREATE OR REPLACE PROCEDURE app_schema.before_config_change_callback(config_name STRING, config_value STRING)
RETURNS STRING
LANGUAGE SQL
AS
$$
DECLARE
    spec_name VARCHAR;
    existing_target VARCHAR;
BEGIN
    IF (config_value IS NOT NULL AND config_name = 'MY_SERVER_APP_NAME_CONFIGURATION') THEN
        SHOW SPECIFICATIONS;
        SELECT PARSE_JSON("definition"):SERVER_APPLICATION::STRING
            INTO existing_target
            FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));

        IF(existing_target IS NOT NULL AND UPPER(existing_target) != UPPER(config_value)) THEN
            EXECUTE IMMEDIATE 'ALTER APPLICATION DROP SPECIFICATION CONNECTION_' || UPPER(existing_target);
        END IF;

        spec_name := 'CONNECTION_' || UPPER(config_value);
        EXECUTE IMMEDIATE
        'ALTER APPLICATION SET SPECIFICATION ' || spec_name || '
            TYPE = CONNECTION
            LABEL = ''Server App''
            DESCRIPTION = ''Request for an app that will provide access to server procedures and functions. The server app version must be greater than or equal to 3.2.''
            SERVER_APPLICATION = ' || config_value || '
            SERVER_APPLICATION_ROLES = (my_server_app_role)';
    END IF;
RETURN 'success';
END;
$$;

CREATE APPLICATION ROLE IF NOT EXISTS client_app_user;
GRANT USAGE ON SCHEMA app_schema TO APPLICATION ROLE client_app_user;
ALTER APPLICATION SET CONFIGURATION DEFINITION my_server_app_name_configuration
    TYPE = APPLICATION_NAME
    LABEL = 'Server App'
    DESCRIPTION = 'Request for an application that will provide access to server procedures and functions. The server app version must be greater than or equal to 3.2'
    APPLICATION_ROLES = (client_app_user);
Copy

L’exemple suivant montre le fichier manifeste d’une application cliente (manifest.yml) :

manifest_version: 2

artifacts:
  setup_script: setup.sql

lifecycle_callbacks:
    before_configuration_change: app_schema.before_config_change_callback
Copy

Notez ce qui suit à propos de l’exemple de code précédent :

  • Dans le rappel before_configuration_change, l’application vérifie une spécification de connexion existante correspondant à la valeur précédente de la configuration, et la supprime si elle existe. Le rappel crée ensuite une nouvelle spécification de connexion pour le nom d’application serveur nouvellement fourni. La création d’une nouvelle connexion lorsque le nom du serveur est défini empêche la création de spécifications de connexion en double.

Exemple : Communication asynchrone entre les applications

L’exemple suivant montre comment créer des procédures dans le script d’installation d’une application serveur (setup.sql) pour la communication asynchrone. L’application serveur crée une table de file d’attente de traitement et fournit deux procédures aux applications clientes par le biais d’un rôle d’application : submit_request pour ajouter une requête à la file d’attente et fetch_response pour récupérer le résultat d’une requête complétée. L’application serveur utilise régulièrement la procédure process_requests pour traiter toutes les requêtes en attente.

CREATE TABLE IF NOT EXISTS app_schema.processing_queue (
  request_id NUMBER AUTOINCREMENT,
  operation STRING,
  input STRING,
  status STRING DEFAULT 'PENDING',
  response STRING DEFAULT ''
);

CREATE OR REPLACE PROCEDURE app_schema.submit_request(operation STRING, input STRING)
RETURNS STRING
LANGUAGE SQL
EXECUTE AS OWNER
AS
$$
BEGIN
    INSERT INTO app_schema.processing_queue (operation, input) VALUES (:operation, :input);
    RETURN 'Request submitted successfully';
END;
$$;

CREATE OR REPLACE PROCEDURE app_schema.process_requests()
RETURNS STRING
LANGUAGE SQL
EXECUTE AS OWNER
AS
$$
DECLARE
    -- Cursor to find all PENDING requests
    c1 CURSOR FOR SELECT * FROM app_schema.processing_queue WHERE status = 'PENDING';
    result STRING;
BEGIN
    FOR request IN c1 DO

        IF (request.operation = 'OPERATION_X') THEN
            -- assuming there is a UDF func_x(input) to perform operation_x
            result := (SELECT func_x(:request.input));
        END IF;

        -- update the processing queue with the result
        LET stmt STRING :=
            'UPDATE app_schema.processing_queue SET status = 'DONE', response = ' ||
            result ||
            ' WHERE request_id = ' ||
            request.request_id;
        EXECUTE IMMEDIATE (:stmt);

    END FOR;

    RETURN 'Processed pending requests.';
END;
$$;

CREATE OR REPLACE PROCEDURE app_schema.fetch_response(operation STRING, input STRING)
RETURNS STRING
LANGUAGE SQL
EXECUTE AS OWNER
AS
$$
BEGIN
    LET res STRING := (SELECT response FROM app_schema.processing_queue WHERE operation = :operation AND input = :input);
    RETURN res;
END;
$$;

CREATE APPLICATION ROLE IF NOT EXISTS my_server_app_role;
GRANT USAGE ON SCHEMA app_schema TO APPLICATION ROLE my_server_app_role;
GRANT USAGE ON PROCEDURE app_schema.submit_request(string, string) TO APPLICATION ROLE my_server_app_role;
GRANT USAGE ON PROCEDURE app_schema.process_requests() TO APPLICATION ROLE my_server_app_role;
GRANT USAGE ON PROCEDURE app_schema.fetch_response(string, string) TO APPLICATION ROLE my_server_app_role;
Copy