Se connecter à Snowflake Open Catalog avec l’OAuth externe

Cette rubrique décrit comment se connecter à Snowflake Open Catalog avec l’OAuth externe à l’aide d’une application cliente.

L’exemple de code de cette rubrique montre comment se connecter à l’aide d’Apache Spark™, et l’exemple de code se trouve dans PySpark.

Note

Si vous utilisez Snowflake pour interroger des tables gérées par Open Catalog, vous pouvez créer une intégration de catalogue pour Snowflake qui utilise l’OAuth externe. Pour plus d’informations, consultez [CREATE CATALOG INTEGRATION (Snowflake Open Catalog)] (https://docs.snowflake.com/en/sql-reference/sql/create-catalog-integration-open-catalog) dans la documentation Snowflake.

Conditions préalables

Avant de pouvoir vous connecter à Open Catalog avec l’OAuth externe, vous devez configurer l’OAuth externe dans Open Catalog. Pour obtenir des instructions, consultez [Configurer l’OAuth externe dans Snowflake Open Catalog] (external-oauth-configure.md).

Se connecter à Open Catalog à l’aide d’un jeton d’actualisation automatique (méthode préférée)

Utilisez cette méthode pour vous connecter à l’aide d’un jeton d’actualisation automatique afin de ne pas avoir à actualiser manuellement le jeton.

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,<maven_coordinate>') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
    .config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
    .config('spark.sql.catalog.opencatalog.oauth2-server-uri','<oauth2_server_uri>') \
    .config('spark.sql.catalog.opencatalog.credential','<oauth_client_id>:<oauth_client_secret>') \
    .config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:<custom_role>') \
    .config('spark.sql.catalog.opencatalog.audience','https://<open_catalog_account_identifier>.snowflakecomputing.com') \
    .getOrCreate()
Copy

Paramètres

Paramètre

Description

<catalog_name>

Spécifie le nom du catalogue auquel se connecter.

Important :
<catalog_name> est sensible à la casse.

<maven_coordinate>

Spécifie les coordonnées Maven pour votre fournisseur de stockage Cloud externe :

  • S3: software.amazon.awssdk:bundle:2.20.160
  • Cloud Storage (de Google) : org.apache.iceberg:iceberg-gcp-bundle:1.5.2
  • Azure : org.apache.iceberg:iceberg-azure-bundle:1.5.2
Si vous ne voyez pas ce paramètre, la valeur correcte est déjà spécifiée dans l’échantillon de code.

<open_catalog_account_identifier>

Spécifie l’identificateur de compte pour votre compte Open Catalog.

En fonction de la région et de la plateforme Cloud du compte, cet identificateur peut être le localisateur de compte à lui seul (par exemple, xy12345) ou inclure des segments supplémentaires. Pour plus d’informations,, voir Utilisation d’un localisateur de compte comme identificateur.

<oauth2_server_uri>

URI de votre serveur OAuth2.

<oauth_client_id>

Votre ID de client OAuth2.

<oauth_client_secret>

Votre secret client OAuth2.

<custom_role>

Nom du rôle personnalisé dans Open Catalog dont vous souhaitez accorder les privilèges au principal de service.

Se connecter à Open Catalog à l’aide d’un jeton d’accès

Si nécessaire, vous pouvez vous connecter à Open Catalog à l’aide d’un jeton d’accès. Cependant, ce jeton d’accès expirera et vous devrez l’actualiser manuellement. Vous pouvez également [vous connecter à l’aide d’un jeton d’actualisation automatique] (#connect-with-open-catalog-by-using-automatic-refresh-token-preferred-method).

L’exemple de code suivant montre comment se connecter à Open Catalog à l’aide de Spark.

Paramètres

Paramètre

Description

<catalog_name>

Spécifie le nom du catalogue auquel se connecter.

Important :
<catalog_name> est sensible à la casse.

<maven_coordinate>

Spécifie les coordonnées Maven pour votre fournisseur de stockage Cloud externe :

  • S3: software.amazon.awssdk:bundle:2.20.160
  • Cloud Storage (de Google) : org.apache.iceberg:iceberg-gcp-bundle:1.5.2
  • Azure : org.apache.iceberg:iceberg-azure-bundle:1.5.2
Si vous ne voyez pas ce paramètre, la valeur correcte est déjà spécifiée dans l’échantillon de code.

<access_token>

Spécifie le jeton d’accès pour l’application cliente à utiliser.

Saisissez le [jeton d’accès que vous avez généré lorsque vous avez configuré l’OAuth externe dans Open Catalog] (external-oauth-configure.md#optional-step-9-generate-the-access-token).

<open_catalog_account_identifier>

Spécifie l’identificateur de compte pour votre compte Open Catalog.

En fonction de la région et de la plateforme Cloud du compte, cet identificateur peut être le localisateur de compte à lui seul (par exemple, xy12345) ou inclure des segments supplémentaires. Pour plus d’informations,, voir Utilisation d’un localisateur de compte comme identificateur.

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,<maven_coordinate>') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.token','<access_token>') \
    .config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
    .getOrCreate()
Copy

Se connecter à l’aide d’une connexion interrégionale (Amazon S3 uniquement)

L’exemple de code suivant montre comment se connecter à Open Catalog lorsque les conditions suivantes sont remplies :

  • Votre compte Open Catalog est hébergé sur Amazon S3.

  • Votre fournisseur de stockage externe est Amazon S3.

  • Votre compte Open Catalog est hébergé dans une région S3 différente de la région S3 où se trouve le compartiment de stockage contenant vos tables Apache Iceberg™.

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.token','<access_token>') \
    .config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
    .config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
    .getOrCreate()
Copy

Paramètres

Paramètre

Description

<catalog_name>

Spécifie le nom du catalogue auquel se connecter.

Important :
<catalog_name> est sensible à la casse.

<access_token>

Spécifie le jeton d’accès pour l’application cliente à utiliser.

Saisissez le [jeton d’accès que vous avez généré lorsque vous avez configuré l’OAuth externe dans Open Catalog] (external-oauth-configure.md#optional-step-9-generate-the-access-token).

<open_catalog_account_identifier>

Spécifie l’identificateur de compte pour votre compte Open Catalog. En fonction de la région et de la plateforme Cloud du compte, cet identificateur peut être le localisateur de compte à lui seul (par exemple, xy12345) ou inclure des segments supplémentaires. Pour plus d’informations,, voir Utilisation d’un localisateur de compte comme identificateur.

<target_s3_region>

Spécifie le code de région où se trouve le compartiment S3 contenant vos tables Apache Iceberg. Pour les codes de région, voir Points de terminaison de service AWS et consultez la colonne Région dans la table.

Exemples

Cette section contient des exemples de connexion à Open Catalog à l’aide de Spark :

  • [Exemple 1 : Se connecter (S3)] (#example-1-connect-s3)

  • [Exemple 2 : Se connecter (Cloud Storage de Google)] (#example-2-connect-cloud-storage-from-google)

  • [Exemple 3 : Se connecter (Azure)] (#example-3-connect-azure)

Exemple 1 : Se connecter (S3)

Consultez :

  • [Se connecter à l’aide de l’actualisation automatique (S3)] (#connect-by-using-automatic-refresh-s3)

  • [Se connecter à l’aide d’un jeton d’accès (S3)] (#connect-by-using-access-token-s3)

Se connecter à l’aide de l’actualisation automatique (S3)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
    .config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
    .config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:222222222222222222222222222222222222222222222222222222222222222222') \
    .config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
    .config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
    .getOrCreate()
Copy

Se connecter à l’aide d’un jeton d’accès (S3)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .getOrCreate()
Copy

Exemple 2 : Se connecter (Cloud Storage de Google)

Consultez :

  • [Se connecter à l’aide de l’actualisation automatique (Cloud Storage de Google)] (#connect-by-using-automatic-refresh-cloud-storage-from-google)

  • [Se connecter à l’aide d’un jeton d’accès (Cloud Storage de Google)] (#connect-by-using-access-token-cloud-storage-from-google)

Se connecter à l’aide de l’actualisation automatique (Cloud Storage de Google)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
    .config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
    .config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:222222222222222222222222222222222222222222222222222222222222222222') \
    .config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
    .config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
    .getOrCreate()
Copy

Se connecter à l’aide d’un jeton d’accès (Cloud Storage de Google)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .getOrCreate()
Copy

Exemple 3 : Se connecter (Azure)

Consultez :

  • [Se connecter à l’aide de l’actualisation automatique (Azure)] (#connect-by-using-automatic-refresh-azure)

  • [Se connecter à l’aide d’un jeton d’accès (Azure)] (#connect-by-using-access-token-azure)

Se connecter à l’aide de l’actualisation automatique (Azure)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
    .config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
    .config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:222222222222222222222222222222222222222222222222222222222222222222') \
    .config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
    .config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
    .getOrCreate()
Copy

Se connecter à l’aide d’un jeton d’accès (Azure)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .getOrCreate()
Copy

Vérification de la connexion à Open Catalog

Pour vérifier que Spark est connecté à Open Catalog, répertoriez les espaces de noms du catalogue. Pour plus d’informations, voir Référencement d’espaces de noms.