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>' ]
Copy

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.

  1. 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';
    
    Copy
  2. 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;
    
    Copy

    Accordez le privilĂšge READ au rĂŽle developer.

    USE ROLE SECURITYADMIN;
    GRANT READ ON SECRET oauth_token TO ROLE developer;
    
    Copy
  3. 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');
    
    Copy
  4. 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;
    
    Copy
  5. 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;
    
    Copy
  6. 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']
    $$;
    
    Copy
  7. 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;
    
    Copy
  8. Exécutez la fonction google_translate_python pour traduire une phrase.

    USE ROLE user;
    SELECT google_translate_python('Happy Thursday!', 'zh-CN');
    
    Copy

    Cette opération génÚre la sortie suivante.

    -------------------------------------------------------
    | GOOGLE_TRANSLATE_PYTHON('HAPPY THURSDAY!', 'ZH-CN') |
    -------------------------------------------------------
    | ćż«ä萿˜ŸæœŸć››ïŒ                                          |
    -------------------------------------------------------