Exemple - Accéder à un point de terminaison externe à l’aide des spécifications d’application

Cette rubrique décrit comment configurer une Snowflake Native App pour se connecter à un point de terminaison externe à Snowflake. L’exemple montre comment configurer le fichier manifeste et le script d’installation d’une application pour effectuer les opérations suivantes :

  • Utilisez l’octroi automatique de privilèges pour demander des privilèges au consommateur pour créer une intégration d’accès externe.

  • Ajoutez une intégration d’accès externe à une application.

  • Utilisez les spécifications d’application pour demander des autorisations au consommateur pour se connecter à un point de terminaison externe.

Spécifier la version du fichier manifeste

Pour activer l’octroi automatique de privilèges pour une application, définissez la version au début du fichier manifeste, comme indiqué dans l’exemple suivant :

manifest_version: 2
Copy

Demander le privilège CREATE EXTERNAL ACCESS INTEGRATION dans le fichier manifeste

Le privilège CREATE EXTERNAL ACCESS INTEGRATION permet à l’application de créer une intégration d’accès externe lors de l’installation ou de la mise à niveau. Pour demander ce privilège au consommateur, ajoutez l’entrée suivante au fichier manifeste :

privileges:
  - CREATE EXTERNAL ACCESS INTEGRATION:
      description: "Required to create eai integrations so we can simplify your life"
Copy

Le privilège CREATE EXTERNAL ACCESS INTEGRATION est automatiquement accordé à l’application avant l’installation ou la mise à niveau et présente les avantages suivants :

  • Les consommateurs n’ont pas à créer manuellement l’intégration d’accès externe requise par l’application et à approuver l’accès à l’aide de références.

  • Les fournisseurs n’ont pas à écrire de code qui vérifie l’existence du privilège CREATE EXTERNAL ACCESS INTEGRATION avant de procéder à la création de l’objet lors de l’installation ou de la mise à niveau.

Créer une règle réseau pour l’intégration d’accès externe

Une intégration d’accès externe nécessite une règle de réseau qui définit les points de terminaison externes. Par exemple, pour créer une règle de réseau, ajoutez la commande CREATE NETWORK RULE au script d’installation de l’application :

CREATE OR REPLACE NETWORK RULE setup.my_network_rule
   TYPE = HOST_PORT
   VALUE_LIST = ( 'example.com' )
   MODE = EGRESS;
Copy

Cette commande crée une règle de réseau qui définit une requête sortante (sortie) vers le port hôte example.com.

Créer une intégration d’accès externe

Après avoir créé une règle de réseau dans le script d’installation, utilisez la commande CREATE EXTERNAL ACCESS INTEGRATION pour créer une intégration d’accès externe, comme indiqué dans l’exemple suivant :

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_app_prefix_eai_rule
  ALLOWED_NETWORK_RULES = (setup.my_network_rule)
  ENABLED = TRUE;
Copy

Note

Cette commande crée une intégration d’accès externe dans le compte de consommateur. Toutefois, l’intégration d’accès externe n’est pas utilisable tant que le consommateur n’a pas approuvé les spécifications d’application qui autorisent l’accès externe pour les ports hôtes demandés. Pour plus d’informations, voir Approuver des connexions à des ressources externes à l’aide de spécifications d’application.

Créer une fonction définie par l’utilisateur pour accéder au point de terminaison externe

Après avoir créé l’intégration d’accès externe, le script d’installation peut créer des fonctions définies par l’utilisateur et des procédures stockées qui l’utilisent pour se connecter aux points de terminaison définis dans la règle de réseau.

L’exemple suivant montre une fonction définie par l’utilisateur qui utilise l’intégration d’accès externe my_app_prefix_eai_rule.

CREATE OR REPLACE FUNCTION setup.EXTERNAL_ACCESS_UDF(hostname STRING)
  RETURNS STRING
  LANGUAGE JAVA
  HANDLER='TestHostNameLookup.compute'
  EXTERNAL_ACCESS_INTEGRATIONS = (my_app_prefix_eai_rule)
  AS
  '
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      class TestHostNameLookup {{
          public static String compute(String hostname) throws Exception {{
              InetAddress addr = null;
              try {
                  addr = InetAddress.getByName(hostname);
              } catch(UnknownHostException ex) {
                  return "Hostname lookup failed";
              }
              return "Hostname lookup successful";
          }
      }
';
GRANT USAGE ON FUNCTION setup.EXTERNAL_ACCESS_UDF(STRING)
  TO APPLICATION ROLE app_public;
Copy

Cette fonction définit la valeur de EXTERNAL_ACCESS_INTEGRATIONS sur l’intégration d’accès externe créée précédemment.

Cette fonction utilise le paquet Java InetAddress pour chercher le nom d’hôte transmis à la procédure. Le nom d’hôte fourni doit correspondre à l’une des valeurs fournies dans la propriété VALUE_LIST des règles de réseau utilisées par l’intégration d’accès externe.

Créer la spécification d’application

Une application peut créer une spécification d’application lors de l’installation, de la mise à niveau ou de l’exécution à partir d’une procédure stockée. L’exemple suivant montre comment utiliser la commande ALTER APPLICATION SET SPECIFICATIONS pour créer une spécification d’application.

ALTER APPLICATION SET SPECIFICATION my_app_specification
        TYPE = EXTERNAL_ACCESS
        LABEL = 'An external api'
        DESCRIPTION = 'Used to connect to an external API'
        HOST_PORTS  = 'example.com';
Copy