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
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"
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;
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;
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;
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';