CREATE EXTERNAL ACCESS INTEGRATION¶
CrĂ©e une intĂ©gration dâaccĂšs externe pour lâaccĂšs Ă des emplacements rĂ©seau externes Ă partir dâune UDF ou dâun gestionnaire de procĂ©dure.
- Voir aussi :
ALTER EXTERNAL ACCESS INTEGRATION , DROP INTEGRATION , SHOW INTEGRATIONS , DESCRIBE INTEGRATION
Syntaxe¶
CREATE [ OR REPLACE ] EXTERNAL ACCESS INTEGRATION <name>
ALLOWED_NETWORK_RULES = ( <rule_name_1> [, <rule_name_2>, ... ] )
[ ALLOWED_API_AUTHENTICATION_INTEGRATIONS = ( { <integration_name_1> [, <integration_name_2>, ... ] | none } ) ]
[ ALLOWED_AUTHENTICATION_SECRETS = ( { <secret_name_1> [, <secret_name_2>, ... ] | all | none } ) ]
ENABLED = { TRUE | FALSE }
[ COMMENT = '<string_literal>' ]
ParamÚtres requis¶
name
Identificateur de lâintĂ©gration de lâaccĂšs externe.
La valeur de lâidentificateur doit commencer par un caractĂšre alphabĂ©tique et ne peut pas contenir dâespaces ou de caractĂšres spĂ©ciaux Ă moins que toute la chaĂźne dâidentificateur soit dĂ©limitĂ©e par des guillemets doubles (p. ex.
"My object"
). Les identificateurs entre guillemets doubles sont sensibles Ă la casse.Pour plus de dĂ©tails, voir Exigences relatives Ă lâidentificateur.
ALLOWED_NETWORK_RULES = (rule_name [ , rule_name ... ])
SpĂ©cifie les rĂšgles de rĂ©seau autorisĂ©es. Seules les rĂšgles de sortie peuvent ĂȘtre spĂ©cifiĂ©es.
ENABLED = { TRUE | FALSE }
SpĂ©cifie si cette intĂ©gration est activĂ©e ou dĂ©sactivĂ©e. Si lâintĂ©gration est dĂ©sactivĂ©e, tout code de gestionnaire qui sâappuie sur elle sera incapable dâatteindre lâemplacement rĂ©seau externe.
La valeur est insensible Ă la casse.
La valeur par défaut est
TRUE
.
ParamÚtres facultatifs¶
ALLOWED_API_AUTHENTICATION_INTEGRATIONS = ( integration_name_1 [, integration_name_2, ... ] | none )
SpĂ©cifie les intĂ©grations de sĂ©curitĂ© dont le serveur dâautorisation OAuth a dĂ©livrĂ© le secret utilisĂ© par lâUDF ou la procĂ©dure. LâintĂ©gration de sĂ©curitĂ© doit ĂȘtre le type utilisĂ© pour lâintĂ©gration dâAPI externe.
La valeur de ce paramĂštre doit ĂȘtre lâune des suivantes :
Un ou plusieurs noms dâintĂ©gration de sĂ©curitĂ© Snowflake pour autoriser lâune des intĂ©grations de la liste.
none
pour nâautoriser aucune intĂ©gration.
Les intĂ©grations de sĂ©curitĂ© spĂ©cifiĂ©es par ce paramĂštre â ainsi que les secrets spĂ©cifiĂ©s par le paramĂštre ALLOWED_AUTHENTICATION_SECRETS â sont des moyens dâautoriser lâutilisation de secrets dans une UDF ou une procĂ©dure qui utilise cette intĂ©gration dâaccĂšs externe. Pour plus dâinformations, voir Notes sur lâutilisation.
Pour plus dâinformations de rĂ©fĂ©rence sur les intĂ©grations de sĂ©curitĂ©, reportez-vous Ă CREATE SECURITY INTEGRATION (authentification API externe).
ALLOWED_AUTHENTICATION_SECRETS = ( secret_name [, secret_name ... ] | all | none )
SpĂ©cifie les secrets que lâUDF ou le code de gestionnaire de procĂ©dure peut utiliser lors de lâaccĂšs aux emplacements rĂ©seau externes rĂ©fĂ©rencĂ©s dans les rĂšgles de rĂ©seau autorisĂ©es.
La valeur de ce paramĂštre doit ĂȘtre lâune des suivantes :
Un ou plusieurs noms de secret Snowflake pour autoriser nâimporte lequel des secrets de la liste.
all
pour autoriser tout secret.none
pour nâautoriser aucun secret.
Le paramĂštre ALLOWED_API_AUTHENTICATION_INTEGRATIONS peut Ă©galement spĂ©cifier des secrets autorisĂ©s. Pour plus dâinformations, voir Notes sur lâutilisation.
Pour des informations de référence sur les secrets, voir CREATE SECRET.
COMMENT = 'string_literal'
SpĂ©cifie un commentaire pour lâintĂ©gration de lâaccĂšs externe.
Par défaut : aucune valeur
Exigences en matiĂšre de contrĂŽle dâaccĂšs¶
Un rÎle utilisé pour exécuter cette opération doit au minimum disposer des privilÚges suivants :
PrivilĂšge |
Objet |
Remarques |
---|---|---|
CREATE INTEGRATION |
Compte |
Only the ACCOUNTADMIN role has this privilege by default. The privilege can be granted to additional roles as needed. |
USAGE |
Secret |
Obligatoire pour tous les secrets rĂ©fĂ©rencĂ©s par lâintĂ©gration. |
USAGE |
Schéma |
Obligatoire pour tous les schĂ©mas contenant des secrets rĂ©fĂ©rencĂ©s par lâintĂ©gration. |
Pour obtenir des instructions sur la crĂ©ation dâun rĂŽle personnalisĂ© avec un ensemble spĂ©cifique de privilĂšges, voir CrĂ©ation de rĂŽles personnalisĂ©s.
Pour des informations gĂ©nĂ©rales sur les rĂŽles et les privilĂšges accordĂ©s pour effectuer des actions SQL sur des objets sĂ©curisables, voir Aperçu du contrĂŽle dâaccĂšs.
Notes sur lâutilisation¶
Vous pouvez autoriser lâutilisation de secrets par une UDF ou une procĂ©dure en utilisant deux paramĂštres dâintĂ©gration dâaccĂšs externe, comme dĂ©crit ci-dessous.
Avec le paramÚtre ALLOWED_AUTHENTICATION_SECRETS. Vous pouvez spécifier des secrets comme valeurs de paramÚtre ou définir la valeur du paramÚtre sur
all
, ce qui permet au code de gestionnaire (handler) dâutiliser nâimporte quel secret.Avec le paramĂštre ALLOWED_API_AUTHENTICATION_INTEGRATIONS. Lâutilisation dâun secret est autorisĂ©e lorsque le secret lui-mĂȘme spĂ©cifie une intĂ©gration de sĂ©curitĂ© dont le nom est Ă©galement spĂ©cifiĂ© par ce paramĂštre. Le secret spĂ©cifie lâintĂ©gration de sĂ©curitĂ© avec son paramĂštre API_AUTHENTICATION. En dâautres termes, lorsque le secret et lâintĂ©gration dâaccĂšs externe spĂ©cifient tous les deux lâintĂ©gration de sĂ©curitĂ©, lâutilisation du secret est autorisĂ©e dans les fonctions et procĂ©dures qui spĂ©cifient lâintĂ©gration dâaccĂšs externe.
Notez que ces deux alternatives fonctionnent indĂ©pendamment lâune de lâautre. Un secret est autorisĂ© si lâun des paramĂštres (ou les deux) lâautorise, quelle que soit la valeur spĂ©cifiĂ©e pour lâautre paramĂštre. Par exemple, le fait de dĂ©finir lâun des paramĂštres sur
none
nâempĂȘche pas lâutilisation dâun secret spĂ©cifiĂ© par lâautre paramĂštre dans le code de gestionnaire (handler).Bien que vous puissiez spĂ©cifier des rĂšgles rĂ©seau Ă lâaide dâun nom dâhĂŽte, Snowflake applique les rĂšgles au niveau IP de granularitĂ©. Snowflake nâinspectera pas le trafic de votre application, il est donc de votre responsabilitĂ© de vous assurer que lâhĂŽte de lâemplacement externe dispose du service authentique et quâil nâest pas possible de se connecter Ă dâautres services sur le mĂȘme hĂŽte. Dans la mesure du possible, vous devez utiliser des protocoles sĂ©curisĂ©s tels que HTTPS et TLS lors de la communication avec des points de terminaison Internet.
Concernant les métadonnées :
Attention
Les clients doivent sâassurer quâaucune donnĂ©e personnelle (autre que pour un objet utilisateur), donnĂ©e sensible, donnĂ©e Ă exportation contrĂŽlĂ©e ou autre donnĂ©e rĂ©glementĂ©e nâest saisie comme mĂ©tadonnĂ©e lors de lâutilisation du service Snowflake. Pour plus dâinformations, voir Champs de mĂ©tadonnĂ©es dans Snowflake.
CREATE OR REPLACE <object> statements are atomic. That is, when an object is replaced, the old object is deleted and the new object is created in a single transaction.
Exemples¶
CrĂ©ez une intĂ©gration dâaccĂšs externe qui donne accĂšs Ă lâAPI de traduction Google.
Pour un exemple plus complet, reportez-vous Ă CrĂ©ation et utilisation dâune intĂ©gration dâaccĂšs externe.
Créez un secret représentant les identifiants de connexion.
Pour crĂ©er un secret, vous devez vous ĂȘtre vu attribuer un rĂŽle avec le privilĂšge CREATE SECRET sur le schĂ©ma actuel. Pour les autres types de secret pris en charge par cette commande, reportez-vous Ă CREATE SECRET. Dans cet exemple,
google_translate_oauth
fait rĂ©fĂ©rence Ă une intĂ©gration de sĂ©curitĂ©. Pour plus dâinformations, reportez-vous Ă CREATE SECURITY INTEGRATION (authentification API externe).CREATE OR REPLACE SECRET oauth_token TYPE = OAUTH2 API_AUTHENTICATION = google_translate_oauth OAUTH_REFRESH_TOKEN = 'my-refresh-token';
Accordez au rĂŽle
developer
les privilĂšges READ sur le secret afin que les dĂ©veloppeurs dâUDF puissent lâutiliser.CrĂ©ez le rĂŽle qui sera requis pour les dĂ©veloppeurs ayant besoin dâutiliser le secret.
USE ROLE USERADMIN; CREATE OR REPLACE ROLE developer;
Accordez le privilĂšge READ au rĂŽle
developer
.USE ROLE SECURITYADMIN; GRANT READ ON SECRET oauth_token TO ROLE developer;
CrĂ©ez une rĂšgle de rĂ©seau reprĂ©sentant lâemplacement rĂ©seau externe. Utilisez un rĂŽle dotĂ© des privilĂšges dĂ©crits dans CREATE NETWORK RULE.
USE ROLE SYSADMIN; CREATE OR REPLACE NETWORK RULE google_apis_network_rule MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('translation.googleapis.com');
CrĂ©ez une intĂ©gration dâaccĂšs externe Ă lâaide du secret et de la rĂšgle de rĂ©seau.
USE ROLE ACCOUNTADMIN; CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION google_apis_access_integration ALLOWED_NETWORK_RULES = (google_apis_network_rule) ALLOWED_AUTHENTICATION_SECRETS = (oauth_token) ENABLED = true;
Accordez au rĂŽle
developer
les privilĂšges USAGE sur le lâintĂ©gration afin que les dĂ©veloppeurs dâUDF puissent lâutiliser.GRANT USAGE ON INTEGRATION google_apis_access_integration TO ROLE developer;
Créez une UDF
google_translate_python
qui traduit le texte spĂ©cifiĂ© en une phrase dans la langue spĂ©cifiĂ©e. Pour plus dâinformations, reportez-vous Ă Utilisation de lâintĂ©gration de lâaccĂšs externe dans une fonction ou une procĂ©dure.USE ROLE developer; CREATE OR REPLACE FUNCTION google_translate_python(sentence STRING, language STRING) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = 3.10 HANDLER = 'get_translation' EXTERNAL_ACCESS_INTEGRATIONS = (google_apis_access_integration) PACKAGES = ('snowflake-snowpark-python','requests') SECRETS = ('cred' = oauth_token ) AS $$ import _snowflake import requests import json session = requests.Session() def get_translation(sentence, language): token = _snowflake.get_oauth_access_token('cred') url = "https://translation.googleapis.com/language/translate/v2" data = {'q': sentence,'target': language} response = session.post(url, json = data, headers = {"Authorization": "Bearer " + token}) return response.json()['data']['translations'][0]['translatedText'] $$;
Accordez le privilĂšge USAGE sur la fonction
google_translate_python
afin que les personnes titulaires du rĂŽle dâutilisateur puissent lâappeler.GRANT USAGE ON FUNCTION google_translate_python(string, string) TO ROLE user;
Exécutez la fonction
google_translate_python
pour traduire une phrase.USE ROLE user; SELECT google_translate_python('Happy Thursday!', 'zh-CN');
Cette opération génÚre la sortie suivante.
------------------------------------------------------- | GOOGLE_TRANSLATE_PYTHON('HAPPY THURSDAY!', 'ZH-CN') | ------------------------------------------------------- | ćż«äčææćïŒ | -------------------------------------------------------