Aller au contenu principal

Exécutez des queries fédérées sur Snowflake (Okta)

Cette page décrit 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 Databricks. Pour en savoir plus sur Lakehouse Federation, consultez Connecter aux bases de données et catalogues externes

Pour vous connecter à votre base de données Snowflake à l'aide de Lakehouse Federation, vous devez créer les éléments suivants dans votre métastore Databricks Unity Catalog (les workspaces créés après le 8 novembre 2023 disposent déjà d'un métastore Unity Catalog provisionné automatiquement) :

  • Une connexion à votre base de données Snowflake.
  • Un catalogue étranger qui reflète votre base de données Snowflake dans Unity Catalog afin que vous puissiez utiliser la syntaxe de query et les outils de gouvernance des données de Unity Catalog pour gérer l’accès des utilisateurs Databricks à la base de données.

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

Pour les autres méthodes d’authentification, veuillez consulter les pages suivantes :

Vous pouvez exécuter des requêtes fédérées sur Snowflake en utilisant la fédération de requêtes ou la fédération de catalogues.

Dans la fédération de query, JDBC transmet la query du Unity Catalog à la base de données externe. Ceci est idéal pour le reporting à la demande ou les travaux de preuve de concept sur vos pipelines ETL.

Dans la fédération de catalogue, le query Unity Catalog s'exécute directement sur le stockage de fichiers. Cette approche est utile pour la migration incrémentielle sans adaptation de code ou comme modèle hybride à plus long terme pour les organisations qui doivent maintenir certaines données dans Snowflake parallèlement à leurs données enregistrées dans Unity Catalog. Consultez Activer la fédération de catalogue Snowflake.

Avant de commencer

Exigences du Workspace :

  • Workspace activé pour Unity Catalog. Les Workspace créés après le 8 novembre 2023 sont automatiquement activés pour Unity Catalog, y compris le provisionnement automatique du métastore. Vous n'avez pas besoin de créer manuellement un métastore, à moins que votre workspace ne soit antérieur à l'activation automatique et n'ait pas été activé pour Unity Catalog. Voir Se familiariser avec Unity Catalog.

Compute requis :

  • Connectivité réseau de votre ressource de compute vers les systèmes de bases de données cibles. Consultez les recommandations de mise en réseau pour Lakehouse Federation.
  • Le compute Databricks doit utiliser Databricks Runtime 13.3 LTS ou une version ultérieure et le mode d’accès **Standard** ou **Dédié**.
  • Les SQL warehouses 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 administrateur de métastore ou un utilisateur disposant du privilège CREATE CONNECTION sur le métastore Unity Catalog attaché à l'espace de travail. Dans les espaces de travail qui ont été activés automatiquement pour Unity Catalog, les administrateurs d'espace de travail disposent du privilège CREATE CONNECTION par default.
  • Pour créer un catalogue externe, 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. Dans les workspaces activés automatiquement pour Unity Catalog, les administrateurs du workspace disposent du privilège CREATE CATALOG par default.

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 l'OAuth externe dans Snowflake ?

External OAuth 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 qu'un utilisateur ou une application se connecte directement à Snowflake, ils s'authentifient auprès du fournisseur OAuth (par ex. 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, accordant l'accès.

Déterminer un flux OAuth

Pour choisir le flux OAuth correct pour votre connecteur Snowflake, vous devez comprendre les deux types principaux : U2M (User-to-Machine) et M2M (Machine-to-Machine).

U2M est un flux d'autorisation où l'application (Databricks) reçoit l'autorisation d'agir au nom 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 externe, et l'application reçoit un **jeton d'accès limité aux autorisations de l'utilisateur**.

Le 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 enregistrée auprès du fournisseur OAuth avec un ensemble d'autorisations, indépendant de tout utilisateur spécifique.

Dans un Workspace 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 politiques de votre entreprise. Les étapes de cette section et des sections suivantes servent de guide pour vous aider à mettre en place une configuration OAuth fonctionnelle et représentent un exemple simple et opérationnel, et non une ressource Okta exhaustive. Reportez-vous à la documentation Okta pour 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 Databricks.

  1. Dans la console d'administration Okta, naviguez jusqu'à Applications , puis cliquez sur Créer une intégration d'application .

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

  3. Sélectionner le type d'application :

    • (U2M uniquement) Choisissez Application native .
    • (M2M uniquement) Sélectionnez **Application Web**.
  4. Cliquez sur Suivant .

  5. Saisir un nom pour l'application.

  6. Sélectionnez le type d'octroi :

    • (U2M uniquement) Choisissez Code d'autorisation et Jeton refresh .
    • (M2M uniquement) Choisissez Identifiants client .
  7. (U2M uniquement) Ajoutez https://<WORKSPACE>/login/oauth/snowflake.html comme URI de redirection pour la connexion .

  8. Choisissez une valeur souhaitée pour un accès contrôlé. À des fins de test, Autoriser l’accès à tous les membres de votre organisation est suffisant.

  9. Gardez l'accès immédiat avec le Mode de Courtier de Fédération activé.

  10. Cliquez sur Enregistrer .

    Vous êtes redirigé vers la page de l'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électionnez **Client secret**, puis cliquez sur **Enregistrer**.

  13. Copiez le secret et conservez cette valeur pour plus tard.

Si vous choisissez de désactiver l’accès immédiat avec le Mode Federation Broker, vous devez affecter un utilisateur dans la tab d’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é et cliquez sur API .

  2. Cliquez sur **Ajouter un serveur d'autorisation**.

  3. Saisissez un nom.

  4. Pour l'audience, utilisez votre URL et hôte JDBC Snowflake, en conservant le schéma d'URL (le préfixe https).

  5. Cliquez sur Enregistrer . Vous serez redirigé vers le serveur d'autorisation nouvellement créé.

  6. Dans l'onglet tab , cliquez sur Ajouter une portée . Définissez le nom sur votre portée Snowflake souhaitée (par exemple, session:role:PUBLIC). Cliquez sur Créer .

  7. Cliquez sur Politiques d'accès , puis cliquez sur Ajouter une nouvelle politique d'accès .

  8. Saisissez un nom et une description pour cette politique.

  9. Assignez la politique au client que vous avez créé, puis cliquez sur Créer .

  10. Dans la politique d'accès, cliquez sur Ajouter une règle .

  11. Saisissez un nom de règle.

  12. Veuillez sélectionner les types d'autorisation autorisés :

    • (U2M seulement) Choisissez le **Code d'autorisation**.
    • (M2M uniquement) Choisissez Identifiants client .
  13. Pour les périmètres, vous pouvez sélectionner Tous les périmètres ou choisir le périmètre souhaité créé précédemment.

  14. (U2M only) Si vous souhaitez recevoir des jetons refresh, incluez offline_access dans la liste des étendues.

  15. Configurez les paramètres supplémentaires au besoin.

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

Récupérer les informations Okta

Veuillez prendre note des informations suivantes :

  • ID client et secret client : Récupérez-les à partir de l'application client que vous avez créée.
  • Métadonnées OIDC (OpenID Connect) :
    1. Sur la page du serveur d'autorisation, cliquez sur le **Link Metadata URI** dans le **tab Settings**.
    2. (U2M only) 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 **Metadata URI** Link. Les connexions M2M Snowflake dans Databricks lisent directement ces métadonnées et récupèrent automatiquement toutes les informations nécessaires.
    4. Copiez la valeur de l' émetteur — elle sera nécessaire lors de 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 les jetons et fournir l'accès aux données approprié en fonction du rôle associé au jeton d'accès OAuth.

  1. Connectez-vous à votre compte Snowflake en tant qu'utilisateur disposant du rôle ACCOUNTADMIN.

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

    SQL
    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 exige que l'e-mail de votre utilisateur Snowflake corresponde à l'e-mail de l'utilisateur Okta.

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

    Vous pouvez utiliser différentes revendications, selon vos exigences.

Créer une connexion

Une connexion spécifie un chemin d'accès et des identifiants pour accéder à un système de base de données externe. Pour créer une connexion, vous pouvez utiliser Catalog Explorer ou la commande SQL CREATE CONNECTION dans un Notebook Databricks ou l'éditeur de query Databricks SQL.

remarque

Vous pouvez également utiliser l'API REST Databricks ou la CLI Databricks pour créer une connexion. Voir POST /api/2.1/unity-catalog/connections et les commandes Unity Catalog.

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

  1. Dans votre workspace Databricks, cliquez sur Icône de données. Catalogue .

  2. En haut du volet **Catalogue**, cliquez sur Icône Ajouter ou plus l'icône **Ajouter** et sélectionnez **Créer une connexion** dans le menu.

  3. Sur la page **Principes de base de la connexion** de l’assistant **Configurer la connexion**, saisissez un **Nom de connexion** convivial.

  4. Sélectionnez un type de connexion Snowflake.

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

  6. Ajouter un commentaire (facultatif).

  7. Cliquez sur Suivant .

  8. Saisissez les détails d'authentification et de connexion suivants pour votre warehouse Snowflake :

    • Hôte : Par exemple, snowflake-demo.east-us-2.azure.snowflakecomputing.com
    • Port : par exemple, 443
    • Utilisateur : Par exemple, snowflake-user
    • Endpoint d'autorisation : https://<OKTA_ENV_ID>.okta.com/oauth2/<AUTH_SERVER_ID>/v1/authorize
    • **Secret du client** : Le secret du client que vous avez enregistré lors de la création de l'intégration de sécurité.
    • Identifiant client : L'identifiant client que vous avez enregistré lors de la création de l'intégration de sécurité.
    • Champ d'application d'OAuth : session:role:PUBLIC offline_access
    • Fournisseur OAuth : Okta
    • Se connecter avec Okta : Cliquez et connectez-vous à Snowflake en utilisant vos identifiants Okta.
  9. Cliquez sur Suivant .

  10. Saisissez les **informations de connexion** suivantes pour votre connexion :

    • Snowflake warehouse : le nom du warehouse que vous souhaitez utiliser.
    • (Facultatif) Utiliser un proxy : pour vous connecter à Snowflake à l'aide d'un serveur proxy.
    • (Facultatif) Hôte proxy : Hôte du proxy utilisé pour se connecter à Snowflake. Vous devez également sélectionner Utiliser un proxy et spécifier le Port du proxy .
    • (Facultatif) Port du proxy : Port du proxy utilisé pour se connecter à Snowflake. Vous devez également sélectionner **Utiliser un proxy** et spécifier **Hôte proxy**.
    • (Facultatif) Rôle Snowflake : Le rôle de sécurité par default à utiliser pour la session après la connexion.
  11. Cliquez sur Créer une connexion .

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

  13. (Facultatif) Cliquez sur **Tester la connexion** pour confirmer que cela fonctionne.

  14. Cliquez sur **Créer un catalogue**.

  15. Sur la page Accès , sélectionnez les workspaces dans lesquels les utilisateurs peuvent accéder au catalogue que vous avez créé. Vous pouvez sélectionner **Tous les espaces de travail ont accès** ou cliquer sur **Attribuer aux espaces de travail**, sélectionner les espaces de travail, puis cliquer sur **Attribuer**.

  16. Modifier le **Propriétaire** qui peut gérer l'accès à tous les objets du catalogue. start à taper un principal dans la zone de texte, puis cliquez sur le principal dans les résultats renvoyés.

  17. Accordez les **Privilèges** sur le catalogue. Cliquez sur Accorder :

    1. Spécifiez les Principaux qui peuvent accéder aux objets du catalogue. start à taper un principal dans la zone de texte, puis cliquez sur le principal dans les résultats renvoyés.

    2. Sélectionnez les **Préréglages de privilèges** à accorder à chaque principal. Tous les utilisateurs du compte se voient accorder BROWSE par default.

      • Sélectionnez Data Reader dans le menu déroulant pour accorder read privilèges sur les objets du catalogue.
      • Sélectionnez **Data Editor** dans le menu déroulant pour accorder read les modify privilèges et sur les objets du catalogue.
      • Sélectionnez manuellement les privilèges à accorder.
    3. Cliquez sur Accorder .

  18. Cliquez sur Suivant .

  19. Sur la page Métadonnées , spécifiez les paires clé-valeur de balises. Pour plus d'informations, consultez Appliquer des balises aux objets sécurisables d'Unity Catalog.

  20. Ajouter un commentaire (facultatif).

  21. Cliquez sur Enregistrer .

Options de connexion avancées

Les connexions Snowflake prennent en charge l'option avancée suivante pour les environnements à sortie restreinte ou de connectivité privée :

  • disableOCSPChecksDéfinissez sur true pour désactiver les vérifications de révocation de certificat OCSP (Online Certificate Status Protocol) dans le driver JDBC Snowflake. La désactivation des vérifications OCSP ignore la vérification de la révocation des certificats.
important

Autoriser le trafic sortant vers le répondeur OCSP de Snowflake dans la mesure du possible. Laissez disableOCSPChecks non défini ou définissez-le sur false. Définissez-le sur true uniquement si votre configuration de sortie restreinte ou de connectivité privée ne permet pas ce trafic.

Cette option n'est pas affichée dans l'Explorateur de catalogues. Vous pouvez le définir lorsque vous créez la connexion avec SQL :

SQL
CREATE CONNECTION <connection-name> TYPE snowflake
OPTIONS (
<connection-options>,
disableOCSPChecks 'true'
);

Pour une connexion existante, utilisez ALTER CONNECTION.

Identifiants de base de données sensibles à la casse

Le champ database du catalogue étranger correspond à un identifiant de base de données Snowflake. Si l'identifiant de la base de données Snowflake n'est pas sensible à la casse, la casse que vous utilisez dans le catalogue externe <database-name> est préservée. Cependant, si l'identifiant de la base de données Snowflake est sensible à la casse, vous devez encadrer le catalogue étranger <database-name> entre guillemets pour préserver 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 un autre guillemet double.

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

Pour plus d'informations, consultez Exigences en matière d'identifiants dans la documentation Snowflake.

Pushdowns pris en charge

Les pushdowns suivants sont pris en charge :

  • Filtres
  • Projections
  • Limite
  • Décalage
  • Jointures
  • Agrégats (Average, Corr, CovPopulation, CovSample, Count, Max, Min, StddevPop, StddevSamp, Sum, VariancePop, VarianceSamp)
  • Fonctions (fonctions de chaîne, fonctions mathématiques, fonctions de date, d'heure et de Timestamp, et autres fonctions diverses, telles que Alias, Cast, SortOrder)
  • Fonctions de fenêtre (DenseRank, Rank, RowNumber)
  • Tri
  • Top-N (combinant le tri et la limite en une seule opération), pris en charge dans Databricks Runtime 17.3 et versions supérieures.

Mappages des types de données

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

Type Snowflake

Type Spark

decimal, number, numeric

DecimalType

bigint, byteint, int, integer, smallint, tinyint

IntegerType

float, float4, float8

FloatType

double, double precision, real

DoubleType

char, character, string, text, time, varchar

StringType

binary

BinaryType

boolean

BooleanType

date

DateType

datetime, timestamp, timestamp_ltz, timestamp_ntz, timestamp_tz

TimestampType

Type Snowflake

Type Spark

decimal, number, numeric

DecimalType

bigint, byteint, int, integer, smallint, tinyint

IntegerType

float, float4, float8

FloatType

double, double precision, real

DoubleType

char, character, string, text, time, varchar

StringType

binary

BinaryType

boolean

BooleanType

date

DateType

datetime, timestamp, timestamp_ltz, timestamp_ntz, timestamp_tz

TimestampType

Limitations

  • L'endpoint OAuth Snowflake doit être accessible depuis les adresses IP du plan de contrôle Databricks. Consultez IP sortantes du plan de contrôle Databricks. Snowflake prend en charge la configuration de politiques réseau au niveau de l'intégration de sécurité, ce qui permet une politique réseau distincte qui active la connectivité directe du plan de contrôle Databricks à l'Endpoint OAuth pour l'autorisation.