Partager via


Exécuter des requêtes fédérées sur Snowflake (Okta)

Cette page explique comment configurer Lakehouse Federation pour exécuter des requêtes fédérées sur des données Snowflake qui ne sont pas gérées par Azure Databricks. Pour en savoir plus sur lakehouse Federation, consultez Qu’est-ce que la Fédération Lakehouse ?

Pour vous connecter à votre base de données Snowflake avec Lakehouse Federation, vous devez créer les éléments suivants dans votre metastore Azure Databricks Unity Catalog :

  • Une connexion à votre base de données Snowflake.
  • Un catalogue étranger qui met en miroir votre base de données Snowflake dans Unity Catalog pour vous puissiez utiliser la syntaxe de requête et les outils de gouvernance des données Unity Catalog, afin de gérer l’accès utilisateur Azure Databricks à la base de données.

Découvrez comment exécuter des requêtes fédérées sur des données Snowflake à l’aide d’Okta comme fournisseur OAuth externe. Cette page couvre les flux utilisateur à machine (U2M) et machine à machine (M2M).

Pour obtenir d’autres méthodes d’authentification, consultez les pages suivantes :

Vous pouvez exécuter des requêtes fédérées sur Snowflake à l’aide de la fédération de requêtes ou de la fédération de catalogue.

Dans la fédération de requête, JDBC envoie (push) la requête catalogue Unity vers le bas vers la base de données externe. Cela est idéal pour les rapports à la demande ou les travaux de preuve de concept sur vos pipelines ETL.

Dans la fédération de catalogue, la requête Catalogue Unity s’exécute directement sur le stockage de fichiers. Cette approche est utile pour la migration incrémentielle sans adaptation du code ou en tant que modèle hybride à long terme pour les organisations qui doivent conserver certaines données dans Snowflake en même temps que leurs données inscrites dans le catalogue Unity. Voir Activer la fédération du catalogue Snowflake.

Avant de commencer

Conditions requises pour l’espace de travail :

  • Espace de travail activé pour Unity Catalog.

Voici les exigences de calcul à respecter :

  • Connectivité réseau de votre ressource de calcul aux systèmes de base de données cibles. Consultez l’article Recommandations de mise en réseau pour Lakehouse Federation.
  • Le calcul Azure Databricks doit utiliser Databricks Runtime 13.3 LTS ou ultérieur et le mode d’accès Standard ou Dédié .
  • Les entrepôts SQL doivent être pro ou serverless et doivent utiliser la version 2023.40 ou ultérieure.

Autorisations requises :

  • Pour créer une connexion, vous devez être un administrateur de metastore ou un utilisateur disposant du privilège CREATE CONNECTION sur le metastore Unity Catalog attaché à l’espace de travail.
  • Pour créer un catalogue étranger, vous devez disposer de l’autorisation CREATE CATALOG sur le metastore et être le propriétaire de la connexion ou disposer du privilège CREATE FOREIGN CATALOG sur la connexion.

Des exigences d’autorisation supplémentaires sont spécifiées dans chaque section basée sur les tâches qui suit.

Qu’est-ce que OAuth externe dans Snowflake ?

OAuth externe est une méthode d’authentification qui vous permet d’utiliser des serveurs externes qui utilisent OAuth 2.0 pour accéder à Snowflake. Au lieu d’un utilisateur ou d’une application qui se connecte directement à Snowflake, il s’authentifie auprès du fournisseur OAuth (par exemple, Okta, Microsoft Entra ID ou PingFederate).

Le fournisseur OAuth émet ensuite un jeton d’accès, que Databricks présente à Snowflake. Snowflake vérifie ensuite la signature et les revendications du jeton avec l’intégration de sécurité configurée, en accordant l'accès.

Déterminer un flux OAuth

Pour choisir le flux OAuth approprié pour votre connecteur Snowflake, vous devez comprendre les deux types principaux : U2M (utilisateur à machine) et M2M (machine à ordinateur).

U2M est un flux d’autorisation dans lequel l’application (Azure Databricks) reçoit l’autorisation d’agir pour le compte de l’utilisateur. Ce flux est interactif, ce qui signifie que l’utilisateur est invité à se connecter lors de la création d’une connexion étrangère et que l’application reçoit un jeton d’accès limité aux autorisations de l’utilisateur.

M2M est un flux non interactif utilisé lorsqu’une application doit accéder directement aux ressources sans intervention de l’utilisateur. Dans ce flux, l’application doit être inscrite dans le fournisseur OAuth avec un ensemble d’autorisations, indépendamment de tout utilisateur spécifique.

Dans un espace de travail Azure Databricks, OAuth fait référence à l’authentification U2M et OAuth Machine à machine fait référence à l’authentification M2M.

Configurer Okta

La configuration exacte d’Okta dépend des besoins et des stratégies de votre entreprise. Les étapes décrites dans ces sections et les sections suivantes servent de guide pour vous permettre d’effectuer une configuration OAuth fonctionnelle et de représenter un exemple simple et fonctionnel, et non une ressource Okta exhaustive. Reportez-vous à la documentation Okta pour obtenir une couverture approfondie de leur plateforme et de leurs fonctionnalités.

Créer un client OAuth

Le client compatible OAuth dans Okta représente une application qui doit interagir avec le serveur d’autorisation d’Okta pour obtenir des jetons. Dans notre cas, le client représente Azure Databricks.

  1. Dans la console d’administration Okta, accédez à Applications, puis cliquez sur Créer l’intégration d’applications.

  2. Choisissez la méthode de connexion OIDC (OpenID Connect ).

  3. Sélectionnez le type d’application :

    • (U2M uniquement) Choisissez Application native.
    • (M2M uniquement) Choisissez Application web.
  4. Cliquez sur Suivant.

  5. Entrez un nom pour l’application.

  6. Sélectionnez le type d’octroi :

    • (U2M uniquement) Choisissez code d’autorisation et jeton d’actualisation.
    • (M2M uniquement) Choisissez Informations d’identification du client.
  7. (U2M uniquement) Ajoutez https://<WORKSPACE>/login/oauth/snowflake.html en tant qu’URI de redirection de connexion.

  8. Choisissez une valeur souhaitée pour l’accès contrôlé. À des fins de test, autoriser tout le monde de votre organisation à accéder est suffisant.

  9. Conservez l’accès immédiat avec le mode Broker de fédération activé.

  10. Cliquez sur Enregistrer.

    Vous êtes redirigé vers la page d’application nouvellement créée.

  11. Dans la section Informations d’identification du client , notez la valeur de l’ID client .

  12. Cliquez sur Modifier et sélectionner Clé secrète client, puis cliquez sur Enregistrer.

  13. Copiez le secret et stockez cette valeur ultérieurement.

Si vous choisissez de désactiver l’accès immédiat avec le mode Broker de fédération, vous devez affecter un utilisateur dans l’onglet Affectation. Pour plus d’informations, consultez la documentation Okta.

Créer un serveur d’autorisation

  1. Dans la console d’administration Okta, développez la section Sécurité , puis cliquez sur API.

  2. Cliquez sur Ajouter un serveur d’autorisation.

  3. Entrez un nom.

  4. Utilisez votre URL JDBC Snowflake et votre serveur hôte pour le public, en gardant le schéma d'URL (le préfixe https).

  5. Cliquez sur Enregistrer. Vous êtes redirigé vers le serveur d’autorisation nouvellement créé.

  6. Sous l’onglet Étendues , cliquez sur Ajouter une étendue. Définissez le nom de l’étendue Snowflake souhaitée (par exemple, session:role:PUBLIC). Cliquez sur Créer.

  7. Cliquez sur Stratégies d’accès, puis sur Ajouter une nouvelle stratégie d’accès.

  8. Entrez un nom et une description pour la stratégie.

  9. Affectez la stratégie au client que vous avez créé, puis cliquez sur Créer.

  10. Dans la stratégie d’accès, cliquez sur Ajouter une règle.

  11. Entrez un nom de règle.

  12. Sélectionnez les types d’octroi autorisés :

    • (U2M uniquement) Choisissez Code d’autorisation.
    • (M2M uniquement) Choisissez Informations d’identification du client.
  13. Pour les étendues, vous pouvez sélectionner n’importe quelle étendue ou choisir l’étendue souhaitée créée précédemment.

  14. (U2M uniquement) Si vous souhaitez recevoir des jetons d’actualisation, incluez offline_access dans la liste des étendues.

  15. Configurez tous les paramètres supplémentaires en fonction des besoins.

  16. Enfin, cliquez sur Créer une règle.

Récupérer les informations Okta

Prenez note des informations suivantes :

  • ID client et clé secrète client : récupérez-les à partir de l’application cliente que vous avez créée.

  • Métadonnées OIDC (OpenID Connect) :

    1. Dans la page serveur d’autorisation, cliquez sur le lien URI des métadonnées sous l’onglet Paramètres .
    2. (U2M uniquement) Copiez la valeur authorization_endpoint au format suivant : https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/v1/authorize
    3. (M2M uniquement) Copiez le lien URI de métadonnées . Les connexions Snowflake M2M dans Databricks lisent ces métadonnées directement et récupèrent automatiquement toutes les informations nécessaires.
    4. Copiez la valeur de l’émetteur . Cela sera nécessaire pendant la configuration de Snowflake.

Créer une intégration de sécurité

Cette étape configure une intégration de sécurité dans Snowflake afin que Snowflake puisse communiquer en toute sécurité avec Okta, valider des jetons et fournir l’accès aux données approprié en fonction du rôle associé au jeton d’accès OAuth.

Flux U2M

  1. Connectez-vous à votre compte Snowflake en tant qu’utilisateur avec le rôle ACCOUNTADMIN.

  2. Exécutez la commande CREATE SECURITY INTEGRATION. Par exemple:

    CREATE SECURITY INTEGRATION <OKTA_U2M_SECURITY_INTEGRATION_NAME>
    TYPE = EXTERNAL_OAUTH
    ENABLED = TRUE
    EXTERNAL_OAUTH_TYPE = OKTA
    EXTERNAL_OAUTH_ISSUER = '<OKTA_OAUTH_ISSUER_URL>'
    EXTERNAL_OAUTH_JWS_KEYS_URL = '<OKTA_OAUTH_ISSUER_URL>/v1/keys'
    EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>')
    EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
    EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'EMAIL_ADDRESS';
    

    L’exemple utilise la revendication et l’attribut de mappage d’e-mail. Cela nécessite que votre e-mail de l’utilisateur Snowflake corresponde à l’e-mail de l’utilisateur Okta.

    ALTER USER <SNOWFLAKE_USER> SET EMAIL = '<YOUR_EMAIL>';
    

    Vous pouvez utiliser différentes revendications, en fonction de vos besoins.

Flux M2M

  1. Connectez-vous à votre compte Snowflake en tant qu’utilisateur avec le rôle ACCOUNTADMIN.

  2. Exécutez la commande CREATE SECURITY INTEGRATION. Par exemple:

    CREATE OR REPLACE SECURITY INTEGRATION <OKTA_M2M_SECURITY_INTEGRATION_NAME>
    TYPE = EXTERNAL_OAUTH
    ENABLED = TRUE
    EXTERNAL_OAUTH_TYPE = OKTA
    EXTERNAL_OAUTH_ISSUER = '<OKTA_OAUTH_ISSUER_URL>'
    EXTERNAL_OAUTH_JWS_KEYS_URL = '<OKTA_OAUTH_ISSUER_URL>/v1/keys'
    EXTERNAL_OAUTH_AUDIENCE_LIST = ('<SNOWFLAKE_APPLICATION_ID_URI>')
    EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
    EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'login_name';
    

    Vous devez créer un utilisateur non humain dans Snowflake pour représenter le client qui se connecte à la base de données. Définissez le nom de connexion sur l’ID client du client OAuth.

    CREATE OR REPLACE USER <OKTA_M2M_CLIENT_USER>
    LOGIN_NAME = '<CLIENT_ID>'
    DEFAULT_ROLE = 'PUBLIC';
    

Créer une connexion

Une connexion spécifie un chemin d’accès et des informations d’identification pour accéder à un système de base de données externe. Pour créer une connexion, vous pouvez utiliser l’Explorateur de catalogues ou la commande SQL CREATE CONNECTION dans un notebook Azure Databricks ou l’éditeur de requête SQL Databricks.

Note

Vous pouvez également utiliser l’API REST Databricks ou l’interface CLI Databricks pour créer une connexion. Consultez POST /api/2.1/unity-catalog/connections et Commandes Unity Catalog.

Autorisations requises : administrateur de metastore ou utilisateur disposant du privilège CREATE CONNECTION.

Flux U2M

  1. Dans votre espace de travail Azure Databricks, cliquez sur l’icône Données.Catalogue.

  2. En haut du volet Catalogue, cliquez sur l’icône Ajouter ou icône PlusAjouter, puis sélectionnez Ajouter une connexion dans le menu.

    Sinon, dans la page Accès rapide, cliquez sur le bouton Données externes >, accédez à l’onglet Connexions, puis cliquez sur Créer une connexion.

  3. Dans la page de Informations de base de connexion de l’assistant Configurer la connexion, entrez un Nom de connexion convivial.

  4. Sélectionnez le type de connexion de Snowflake.

  5. Pour le type d’authentification, sélectionnez-le OAuth dans le menu déroulant.

  6. (Facultatif) Ajoutez un commentaire.

  7. Cliquez sur Suivant.

  8. Entrez les informations d’authentification et de connexion suivantes pour votre entrepôt Snowflake :

    • hôte : par exemple, snowflake-demo.east-us-2.azure.snowflakecomputing.com
    • Port: par exemple, 443
    • Utilisateur : par exemple, snowflake-user
    • Point de terminaison d’autorisation : https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/v1/authorize
    • Clé secrète client : clé secrète client que vous avez enregistrée lors de la création de l’intégration de la sécurité.
    • ID client : ID client que vous avez enregistré lors de la création de l’intégration de la sécurité.
    • Étendue OAuth : session:role:PUBLIC offline_access
    • Fournisseur OAuth : Okta
    • Connectez-vous avec Okta : cliquez et connectez-vous à Snowflake à l’aide de vos informations d’identification Okta.
  9. Cliquez sur Suivant.

  10. Entrez les détails de connexion suivants pour votre connexion :

    • Entrepôt Snowflake : nom de l’entrepôt que vous souhaitez utiliser.
    • (Facultatif) Utiliser le proxy : indique s’il faut se connecter à Snowflake à l’aide d’un serveur proxy.
    • (Facultatif) Hôte du proxy : l'hôte du proxy utilisé pour se connecter à Snowflake. Vous devez également sélectionner Utiliser le proxy et spécifier le port proxy.
    • (Facultatif) Port proxy : port du proxy utilisé pour se connecter à Snowflake. Vous devez également sélectionner Utiliser le proxy et spécifier l’hôte proxy.
    • (Facultatif) Rôle Snowflake : rôle de sécurité par défaut à utiliser pour la session après la connexion.
  11. Cliquez sur Create connection (Créer la connexion).

  12. Sur la pageConcepts de base du catalogue, saisissez un nom pour le catalogue étranger.

  13. (Facultatif) Cliquez sur Tester la connexion pour vérifier qu’elle fonctionne.

  14. Cliquez sur Créer un catalogue.

  15. Dans la page Access, sélectionnez les espaces de travail dans lesquels les utilisateurs peuvent accéder au catalogue que vous avez créé. Vous pouvez sélectionner Tous les espaces de travail ayant accès ou cliquer sur Affecter aux espaces de travail, sélectionner les espaces de travail, puis cliquer sur Affecter.

  16. Modifiez le propriétaire qui peut gérer l’accès à tous les objets du catalogue. Commencez à taper un responsable dans la zone de texte, puis cliquez sur le responsable dans les résultats affichés.

  17. Accordez des privilèges sur le catalogue. Cliquez sur Octroyer :

    1. Spécifiez les principaux qui peuvent accéder aux objets dans le catalogue. Commencez à taper un responsable dans la zone de texte, puis cliquez sur le responsable dans les résultats affichés.
    2. Sélectionnez les Préréglages de privilège à accorder pour chaque bénéficiaire. Tous les utilisateurs d'un compte reçoivent BROWSE par défaut.
      • Sélectionnez Lecteur de données dans le menu déroulant pour accorder des read privilèges sur les objets du catalogue.
      • Sélectionnez Éditeur de données dans le menu déroulant pour accorder read et modify privilèges sur les objets du catalogue.
      • Sélectionnez manuellement les privilèges à accorder.
    3. Cliquez sur Accorder.
  18. Cliquez sur Suivant.

  19. Dans la page Métadonnées, spécifiez des paires clé-valeur pour les balises. Pour plus d’informations, consultez Appliquer des étiquettes aux objets sécurisables du catalogue Unity.

  20. (Facultatif) Ajoutez un commentaire.

  21. Cliquez sur Enregistrer.

Flux M2M : Explorateur de catalogues

  1. Dans votre espace de travail Azure Databricks, cliquez sur l’icône Données.Catalogue.

  2. En haut du volet Catalogue, cliquez sur l’icône Ajouter ou icône PlusAjouter, puis sélectionnez Ajouter une connexion dans le menu.

    Sinon, dans la page Accès rapide, cliquez sur le bouton Données externes >, accédez à l’onglet Connexions, puis cliquez sur Créer une connexion.

  3. Dans la page de Informations de base de connexion de l’assistant Configurer la connexion, entrez un Nom de connexion convivial.

  4. Sélectionnez le type de connexion de Snowflake.

  5. Pour le type d’authentification, sélectionnez-le OAuth Machine to Machine dans le menu déroulant.

  6. (Facultatif) Ajoutez un commentaire.

  7. Cliquez sur Suivant.

  8. Entrez les détails d’authentification suivants pour votre connexion :

    • hôte : par exemple, snowflake-demo.east-us-2.azure.snowflakecomputing.com
    • Port: par exemple, 443
    • Point de terminaison de métadonnées Openid : https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/.well-known/oauth-authorization-server
    • Clé secrète client : clé secrète client que vous avez enregistrée lors de la création de l’intégration de la sécurité.
    • ID client : ID client que vous avez enregistré lors de la création de l’intégration de la sécurité.
    • Étendue OAuth : session:role:PUBLIC
  9. Cliquez sur Suivant.

  10. Entrez les détails de connexion suivants pour votre connexion :

    • Entrepôt Snowflake : nom de l’entrepôt que vous souhaitez utiliser.
    • (Facultatif) Hôte du proxy : l'hôte du proxy utilisé pour se connecter à Snowflake. Vous devez également sélectionner Utiliser le proxy et spécifier le port proxy.
    • (Facultatif) Utiliser le proxy : indique s’il faut se connecter à Snowflake à l’aide d’un serveur proxy.
    • (Facultatif) Port proxy : port du proxy utilisé pour se connecter à Snowflake. Vous devez également sélectionner Utiliser le proxy et spécifier l’hôte proxy.
    • (Facultatif) Rôle Snowflake : rôle de sécurité par défaut à utiliser pour la session après la connexion.
  11. Cliquez sur Create connection (Créer la connexion).

  12. Sur la pageConcepts de base du catalogue, saisissez un nom pour le catalogue étranger.

  13. (Facultatif) Cliquez sur Tester la connexion pour vérifier qu’elle fonctionne.

  14. Cliquez sur Créer un catalogue.

  15. Dans la page Access, sélectionnez les espaces de travail dans lesquels les utilisateurs peuvent accéder au catalogue que vous avez créé. Vous pouvez sélectionner Tous les espaces de travail ayant accès ou cliquer sur Affecter aux espaces de travail, sélectionner les espaces de travail, puis cliquer sur Affecter.

  16. Modifiez le propriétaire qui peut gérer l’accès à tous les objets du catalogue. Commencez à taper un responsable dans la zone de texte, puis cliquez sur le responsable dans les résultats affichés.

  17. Accordez des privilèges sur le catalogue. Cliquez sur Octroyer :

    1. Spécifiez les principaux qui peuvent accéder aux objets dans le catalogue. Commencez à taper un responsable dans la zone de texte, puis cliquez sur le responsable dans les résultats affichés.
    2. Sélectionnez les Préréglages de privilège à accorder pour chaque bénéficiaire. Tous les utilisateurs d'un compte reçoivent BROWSE par défaut.
      • Sélectionnez Lecteur de données dans le menu déroulant pour accorder des read privilèges sur les objets du catalogue.
      • Sélectionnez Éditeur de données dans le menu déroulant pour accorder read et modify privilèges sur les objets du catalogue.
      • Sélectionnez manuellement les privilèges à accorder.
    3. Cliquez sur Accorder.
  18. Cliquez sur Suivant.

  19. Dans la page Métadonnées, spécifiez des paires clé-valeur pour les balises. Pour plus d’informations, consultez Appliquer des étiquettes aux objets sécurisables du catalogue Unity.

  20. (Facultatif) Ajoutez un commentaire.

  21. Cliquez sur Enregistrer.

Flux M2M : SQL

Exécutez la commande suivante dans un notebook ou dans l’éditeur de requête SQL Databricks.

CREATE CONNECTION <connection-name>
TYPE SNOWFLAKE
OPTIONS (
  host '<hostname>',
  port '443',
  sfWarehouse '<warehouse-name>',
  client_id '<client-id>',
  client_secret '<client-secret>',
  openid_metadata_endpoint '<oidc-metadata-endpoint>',
  oauth_scope 'session:role:PUBLIC'
);

Vous pouvez ensuite créer un catalogue étranger à l’aide de la nouvelle connexion en exécutant la commande suivante :

CREATE FOREIGN CATALOG <catalog-name>
USING CONNECTION <connection-name>
OPTIONS (database = '<database>');

Identificateurs sensibles à la casse de la base de données

Le champ database du catalogue étranger est mappé à un identificateur de la base de données Snowflake. Si l’identificateur de la base de données Snowflake n’est pas sensible à la casse, celle utilisée dans le catalogue étranger <database-name> est conservée. Toutefois, si l’identificateur de la base de données Snowflake est sensible à la casse, vous devez encapsuler le catalogue étranger <database-name> entre guillemets doubles pour conserver la casse.

Par exemple:

  • database est converti en DATABASE

  • "database" est converti en database

  • "database""" est converti en database"

    Pour échapper à un guillemet double, utilisez-en un autre.

  • "database"" entraîne une erreur, car le guillemet double n’est pas correctement échappé.

Pour plus d’informations, consultez Spécifications de l’identificateur dans la documentation Snowflake.

Pushdowns pris en charge

Les pushdowns suivants sont pris en charge :

  • Filtres
  • Prévisions
  • Limit
  • Joins
  • Agrégats (Average, Corr, CovPopulation, CovSample, Count, Max, Min, StddevPop, StddevSamp, Sum, VariancePop, VarianceSamp)
  • Fonctions (fonctions de chaîne, fonctions mathématiques, données, fonctions Time et Timestamp, et autres fonctions diverses, telles qu'Alias, Cast, SortOrder)
  • Fonctions Windows (DenseRank, Rank, RowNumber)
  • Tri

Mappages de types de données

Lorsque vous lisez de Snowflake vers Spark, les types de données sont mappés comme suit :

Type Snowflake Type Spark
décimal, nombre, numérique DecimalType
bigint, byteint, int, integer, smallint, tinyint IntegerType
float, float4, float8 FloatType
double, double précision, réelle DoubleType
char, caractère, chaîne, texte, heure, varchar StringType
binaire TypeBinaire
boolean Type Booléen
date DateType
datetime, timestamp, timestamp_ltz, timestamp_ntz, timestamp_tz TimestampType

Limites

  • Le point de terminaison OAuth Snowflake doit être accessible à partir des adresses IP du plan de contrôle Azure Databricks. Consultez les adresses IP sortantes à partir du plan de contrôle Azure Databricks. Snowflake prend en charge la configuration des stratégies réseau au niveau de l’intégration de la sécurité, ce qui permet une stratégie réseau distincte qui permet une connectivité directe du plan de contrôle Azure Databricks au point de terminaison OAuth pour l’autorisation.