외부 OAuth를 사용하여 Snowflake Open Catalog에 연결

이 항목에서는 클라이언트 애플리케이션을 사용하여 외부 OAuth로 Snowflake Open Catalog에 연결하는 방법을 설명합니다.

이 항목의 예제 코드는 Apache Spark™를 사용하여 연결하는 방법을 보여주며, 예제 코드는 PySpark로 되어 있습니다.

참고

Snowflake를 사용하여 Open Catalog 관리형 테이블을 쿼리하는 경우 외부 OAuth를 사용하는 Snowflake용 카탈로그 통합을 생성할 수 있습니다. 자세한 내용은 Snowflake 설명서의 CREATE CATALOG INTEGRATION(Snowflake Open Catalog)을 참조하세요.

전제 조건

외부 OAuth를 사용하여 Open Catalog에 연결하기 전에 Open Catalog에서 외부 OAuth를 구성해야 합니다. 지침은 Snowflake Open Catalog에서 외부 OAuth 구성을 참조하세요.

자동 새로 고침 토큰을 사용하여 Open Catalog와 연결(선호되는 방법)

이 방법을 사용하면 자동 새로 고침 토큰을 사용하여 연결하므로 토큰을 수동으로 새로 고칠 필요가 없습니다.

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

매개 변수

매개 변수

설명

<catalog_name>

연결할 카탈로그의 이름을 지정합니다.

중요:
<catalog_name>은 대/소문자를 구분합니다.

<maven_coordinate>

외부 클라우드 저장소 공급자에 대한 Maven 좌표를 지정합니다.

  • S3: software.amazon.awssdk:bundle:2.20.160
  • 클라우드 저장소(Google에서 제공): org.apache.iceberg:iceberg-gcp-bundle:1.5.2
  • Azure: org.apache.iceberg:iceberg-azure-bundle:1.5.2
이 매개 변수가 보이지 않는 경우, 코드 샘플에 올바른 값이 이미 지정되어 있는 것입니다.

<open_catalog_account_identifier>

Open Catalog 계정에 대한 계정 식별자를 지정합니다.

계정의 리전과 클라우드 플랫폼에 따라, 이 식별자는 그 자체로 계정 로케이터가 되거나(예: xy12345) 추가 세그먼트를 포함할 수 있습니다. 자세한 내용은 계정 로케이터를 식별자로 사용하기 섹션을 참조하십시오.

<oauth2_server_uri>

OAuth2 서버 URI.

<oauth_client_id>

OAuth2 클라이언트 ID입니다.

<oauth_client_secret>

OAuth2 클라이언트 시크릿입니다.

<custom_role>

서비스 주체에게 부여하려는 권한이 있는 Open Catalog의 사용자 지정 역할의 이름입니다.

액세스 토큰을 사용하여 Open Catalog에 연결

필요한 경우 액세스 토큰을 사용하여 Open Catalog에 연결할 수 있습니다. 그러나 액세스 토큰은 만료되므로 수동으로 새로 고쳐야 합니다. 또는 자동 새로 고침 토큰을 사용하여 연결할 수 있습니다.

다음 예제 코드는 Spark를 사용하여 Open Catalog에 연결하기 위한 코드입니다.

매개 변수

매개 변수

설명

<catalog_name>

연결할 카탈로그의 이름을 지정합니다.

중요:
<catalog_name>은 대/소문자를 구분합니다.

<maven_coordinate>

외부 클라우드 저장소 공급자에 대한 Maven 좌표를 지정합니다.

  • S3: software.amazon.awssdk:bundle:2.20.160
  • 클라우드 저장소(Google에서 제공): org.apache.iceberg:iceberg-gcp-bundle:1.5.2
  • Azure: org.apache.iceberg:iceberg-azure-bundle:1.5.2
이 매개 변수가 보이지 않는 경우, 코드 샘플에 올바른 값이 이미 지정되어 있는 것입니다.

<access_token>

클라이언트 애플리케이션이 사용할 액세스 토큰을 지정합니다.

Open Catalog에서 외부 OAuth를 구성할 때 생성한 액세스 토큰을 입력합니다.

<open_catalog_account_identifier>

Open Catalog 계정에 대한 계정 식별자를 지정합니다.

계정의 리전과 클라우드 플랫폼에 따라, 이 식별자는 그 자체로 계정 로케이터가 되거나(예: xy12345) 추가 세그먼트를 포함할 수 있습니다. 자세한 내용은 계정 로케이터를 식별자로 사용하기 섹션을 참조하십시오.

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

리전 간 연결로 연결(Amazon S3만 해당)

다음 예제 코드는 다음에 해당하는 경우 Open Catalog에 연결하기 위한 코드입니다.

  • Open Catalog 계정이 Amazon S3에 호스팅되어 있습니다.

  • 외부 저장소 공급자는 Amazon S3입니다.

  • Open Catalog 계정이 Apache Iceberg™ 테이블이 포함된 저장소 버킷이 있는 S3 리전과 다른 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://<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

매개 변수

매개 변수

설명

<catalog_name>

연결할 카탈로그의 이름을 지정합니다.

중요:
<catalog_name>은 대/소문자를 구분합니다.

<access_token>

클라이언트 애플리케이션이 사용할 액세스 토큰을 지정합니다.

Open Catalog에서 외부 OAuth를 구성할 때 생성한 액세스 토큰을 입력합니다.

<open_catalog_account_identifier>

Open Catalog 계정에 대한 계정 식별자를 지정합니다. 계정의 리전과 클라우드 플랫폼에 따라, 이 식별자는 그 자체로 계정 로케이터가 되거나(예: xy12345) 추가 세그먼트를 포함할 수 있습니다. 자세한 내용은 계정 로케이터를 식별자로 사용하기 섹션을 참조하십시오.

<target_s3_region>

Apache Iceberg 테이블이 포함된 S3 버킷이 있는 리전 코드를 지정합니다. 리전 코드는 AWS 서비스 엔드포인트를 확인하고 테이블의 Region 열을 참조하십시오.

이 섹션에는 Spark를 사용하여 Open Catalog에 연결하는 예가 포함되어 있습니다.

예 1: Connect (S3)

다음을 참조:

자동 새로 고침을 사용하여 연결(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

액세스 토큰을 사용하여 연결(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

예 2: 연결(Google의 클라우드 저장소)

다음을 참조:

자동 새로 고침을 사용하여 연결(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

액세스 토큰을 사용하여 연결(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

예 3: 연결(Azure)

다음을 참조:

자동 새로 고침을 사용하여 연결(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

액세스 토큰을 사용하여 연결(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

Open Catalog에 대한 연결 확인하기

Spark가 Open Catalog에 연결되었는지 확인하려면 카탈로그의 네임스페이스를 나열합니다. 자세한 내용은 네임스페이스 목록 섹션을 참조하십시오.