> ## Documentation Index
> Fetch the complete documentation index at: https://docs.streamnative.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Open Catalog for Iceberg on GCP

This guide describes how to prepare a Snowflake Open Catalog (Polaris) for use with StreamNative Ursa as an Iceberg catalog on Google Cloud Platform (GCP).

> **Important:** Polaris does not support reading buckets from a different region. The StreamNative Ursa cluster, the GCS bucket, and the Polaris catalog must all reside in the **same region**.

## Prerequisites

* A Snowflake standard account
* A GCP project with permissions to create GCS buckets and IAM roles
* Access to the Snowflake Open Catalog feature

## 1. Create a Snowflake Open Catalog Account

The Snowflake Open Catalog console requires a dedicated **Open Catalog** account. From the standard Snowflake console, navigate to **Admin -> Accounts** and use the toggle to **Create Snowflake Open Catalog Account**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-01.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=713007bcd901de1b0a3e4a4a4700ac23" alt="Snowflake console" width="1920" height="931" data-path="images/ursa-lakehouse/open-catalog-gcp-01.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-02.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=faf0c8d5d2a6f1d6f1f7fef0577e0410" alt="Create Open Catalog account" width="1920" height="934" data-path="images/ursa-lakehouse/open-catalog-gcp-02.webp" />

Configure the account with:

* **Cloud:** GCP
* **Region:** the region in which your GCS bucket resides
* **Edition:** any

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-03.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=2427502432d973836b54d1f23996a7bd" alt="Account configuration" width="1920" height="969" data-path="images/ursa-lakehouse/open-catalog-gcp-03.webp" />

Provide an admin username and password.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-04.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=5834ca4b10eb951c076bf1ff98e7a8c5" alt="Account credentials" width="1920" height="935" data-path="images/ursa-lakehouse/open-catalog-gcp-04.webp" />

After creation, click the **Account URL** to sign in to the Open Catalog console.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-05.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=a71384135cc70aeb043a2c3fc085bdf5" alt="Account created" width="1920" height="1918" data-path="images/ursa-lakehouse/open-catalog-gcp-05.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-06.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=072d2adce14a543831903692dfa05622" alt="Open Catalog console" width="1920" height="933" data-path="images/ursa-lakehouse/open-catalog-gcp-06.webp" />

## 2. Create the Polaris Catalog

In the Snowflake Open Catalog console, create a new catalog.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-11.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=d08e45cb29e7f272bb13e627ece5597a" alt="Create catalog" width="1920" height="935" data-path="images/ursa-lakehouse/open-catalog-gcp-11.webp" />

Configure the catalog with:

* **External:** disabled
* **Storage provider:** GCS
* **Default base location:** the GCS path used by the Ursa cluster (`gs://<bucket>/<subpath>`)

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-12.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=de2b511af29f2d196823f98fcddcd19c" alt="Catalog configuration" width="1920" height="973" data-path="images/ursa-lakehouse/open-catalog-gcp-12.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-13.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=ddbdcbbc840460b9c4bccf75422ae587" alt="Catalog created" width="1920" height="506" data-path="images/ursa-lakehouse/open-catalog-gcp-13.webp" />

Open the catalog details and record the **GCP\_SERVICE\_ACCOUNT** value. Polaris uses this service account to access GCS, so it must be granted permission on the bucket.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-14.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=0319e99bbe0e46b72abb0f0523c7f2a7" alt="Catalog GCP service account" width="1920" height="969" data-path="images/ursa-lakehouse/open-catalog-gcp-14.webp" />

## 3. Grant Bucket Permissions to the Polaris Service Account

### 3.1 Create a Custom IAM Role

In the GCP console, navigate to **IAM & Admin -> Roles -> Create role** and add the following permissions:

* `storage.buckets.get`
* `storage.objects.create`
* `storage.objects.delete`
* `storage.objects.get`
* `storage.objects.list`

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-15.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=db863ad68b33b4aad469357e6ab942a7" alt="Create role" width="1920" height="968" data-path="images/ursa-lakehouse/open-catalog-gcp-15.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-16.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=c6df7b697ad22a6087ea9a7e5fda39b9" alt="Role setup" width="1920" height="969" data-path="images/ursa-lakehouse/open-catalog-gcp-16.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-17.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=b910bad3cd5aae4b12782636461bffe9" alt="Permissions" width="1674" height="1920" data-path="images/ursa-lakehouse/open-catalog-gcp-17.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-18.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=bc0158d0904cc308108e3948c8578a3a" alt="Permissions selected" width="1920" height="968" data-path="images/ursa-lakehouse/open-catalog-gcp-18.webp" />

### 3.2 Assign the Role to the Polaris Service Account

Open the bucket, navigate to **PERMISSIONS -> View BY PRINCIPALS -> GRANT ACCESS**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-19.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=2f5bf15b4a49f5e191b5712bdd52ff4a" alt="Grant bucket access" width="1920" height="965" data-path="images/ursa-lakehouse/open-catalog-gcp-19.webp" />

Add the **GCP\_SERVICE\_ACCOUNT** from step 3, choose the role created in step 4.1, and click **SAVE**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-20.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=1ebb3423150cd88596b81c44adb7b1ff" alt="Save access" width="1920" height="968" data-path="images/ursa-lakehouse/open-catalog-gcp-20.webp" />

## 4. Create a Connection (Service Principal)

In the Open Catalog console, create a new connection that StreamNative Ursa will use to authenticate.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-21.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=18e8e85da39f94b38b53b2585988795c" alt="Create connection" width="1920" height="931" data-path="images/ursa-lakehouse/open-catalog-gcp-21.webp" />

Configure with:

* **Name:** any name
* **Create new principal role:** enabled
* **Principal Role Name:** any name

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-22.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=9f636cf96a152710b840fefd1b4cbb81" alt="Connection configuration" width="1920" height="971" data-path="images/ursa-lakehouse/open-catalog-gcp-22.webp" />

After creation, record the **Client ID** and **Client Secret** -- the secret cannot be retrieved later.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-23.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=df22991e1f81f2c6012bcae833375e99" alt="Connection credentials" width="1920" height="936" data-path="images/ursa-lakehouse/open-catalog-gcp-23.webp" />

## 5. Create a Catalog Role and Grant Privileges

Navigate to **Catalogs -> \[your catalog] -> Roles -> + Catalog Role** and create a role with the following privileges:

* `NAMESPACE_CREATE`
* `NAMESPACE_LIST`
* `NAMESPACE_READ_PROPERTIES`
* `NAMESPACE_WRITE_PROPERTIES`
* `TABLE_LIST`
* `TABLE_CREATE`
* `TABLE_WRITE_DATA`
* `TABLE_READ_DATA`
* `TABLE_READ_PROPERTIES`
* `TABLE_WRITE_PROPERTIES`

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-24.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=b8216b72a2bcef14396c49713e4aa72a" alt="Create catalog role" width="1920" height="1801" data-path="images/ursa-lakehouse/open-catalog-gcp-24.webp" />

Click **Grant to Principals Role** and grant the catalog role to the principal role created in step 5.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-25.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=3aa1d9de9830f7fa62d273ebe59d3a16" alt="Grant to principal role" width="1920" height="439" data-path="images/ursa-lakehouse/open-catalog-gcp-25.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-26.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=c60470ce3de5bd267343054bef35ed11" alt="Grant configuration" width="1920" height="971" data-path="images/ursa-lakehouse/open-catalog-gcp-26.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/open-catalog-gcp-27.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=a1ae4f3c102092e52282e3a831df493d" alt="Role bindings" width="1920" height="212" data-path="images/ursa-lakehouse/open-catalog-gcp-27.webp" />

For background on the relationship between catalogs, catalog roles, principal roles, and principals, see the [Polaris Quick Start](https://polaris.io/#section/Quick-Start/Defining-a-Catalog).

## Catalog Information Summary

When the steps above are complete, collect the following values for the StreamNative Ursa compaction service:

| Value                | Description                                                                                                                                                    |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `iceberg.uri`        | Polaris REST endpoint (e.g., `https://<account>.<region>.gcp.snowflakecomputing.com/polaris/api/catalog`). The format follows the URL of your Polaris console. |
| `iceberg.warehouse`  | The Polaris catalog name created in step 3                                                                                                                     |
| `iceberg.credential` | `<client-id>:<client-secret>` from step 5                                                                                                                      |
| `iceberg.scope`      | `PRINCIPAL_ROLE:ALL`                                                                                                                                           |

For the next steps, see [Configure Lakehouse Catalogs](../../../configure-lakehouse-catalogs).
