> ## 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.

# Unity Catalog for Delta Lake on AWS

This guide describes how to prepare a Databricks Unity Catalog for use with StreamNative Ursa as a Delta Lake catalog on AWS.

## Prerequisites

* An AWS account with permissions to create S3 buckets and IAM roles
* A Databricks account with permissions to create workspaces

## 1. Create a Databricks Workspace

> Skip this step if you already have the Databricks Workspace

In the Databricks account console, create a new workspace. The workspace creation flow uses an AWS CloudFormation stack, so you must be logged into AWS in the same browser session.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-01.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=aa291aa2f9e201fcb8896afc186fe8a0" alt="Workspace list" width="1920" height="932" data-path="images/ursa-lakehouse/uc-delta-aws-01.webp" />

Click **Create workspace**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-02.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=5e25645a7a8b7e3da4ec6e991fc8e386" alt="Create workspace" width="1920" height="932" data-path="images/ursa-lakehouse/uc-delta-aws-02.webp" />

Choose **Quickstart**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-03.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=c05d061ef4ba300d3d7e967b6f1ce6c8" alt="Quickstart option" width="1920" height="934" data-path="images/ursa-lakehouse/uc-delta-aws-03.webp" />

Enter a workspace name and select the AWS region in which your S3 bucket resides (for example, `us-east-2`). Click **Start Quickstart**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-04.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=51a78dc999789bbefd6f5fb744c8c22e" alt="Workspace settings" width="1920" height="931" data-path="images/ursa-lakehouse/uc-delta-aws-04.webp" />

In the AWS console, acknowledge the IAM resource creation and click **Create Stack**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-05.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=3e052f8250a91d084f8f47d815c00736" alt="Create CloudFormation stack" width="1920" height="933" data-path="images/ursa-lakehouse/uc-delta-aws-05.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-06.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=f8e3903808771d3249abf3e5ecaea5f0" alt="Stack creating" width="1920" height="931" data-path="images/ursa-lakehouse/uc-delta-aws-06.webp" />

When the stack reaches `CREATE_COMPLETE`, return to the Databricks console and open the workspace.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-07.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=df4ab65acebad03f624f59fcad869206" alt="Stack complete" width="1920" height="934" data-path="images/ursa-lakehouse/uc-delta-aws-07.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-08.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=1aa68deb3f79d3c74f1c7c0779736fa0" alt="Workspace ready" width="1920" height="934" data-path="images/ursa-lakehouse/uc-delta-aws-08.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-09.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=6ed187f572c3ec01a0a0b5fa8168a8d6" alt="Unity Catalog console" width="1920" height="1014" data-path="images/ursa-lakehouse/uc-delta-aws-09.webp" />

## 2. (Recommend) Generate an OAuth2 Service Principal

If you prefer OAuth2 over a personal access token, create a service principal:

Navigate to **Developer -> Identity and access -> Service principals -> Manage**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-14.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=94ae8e31f0d0dc83d4418152ba198bfa" alt="Service principals menu" width="1920" height="967" data-path="images/ursa-lakehouse/uc-delta-aws-14.webp" />

Click **Add service principal -> Add new**, give it a name, and click **Add**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-15.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=9cdf0760020d904b780635f32a4e0cdc" alt="Add service principal" width="1920" height="968" data-path="images/ursa-lakehouse/uc-delta-aws-15.webp" />

Open the service principal, click **Secrets -> Generate secret**, choose an expiration period, and **Generate**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-16.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=6e5a3b0bc0851eac2361101d1037b078" alt="Generate secret" width="1920" height="968" data-path="images/ursa-lakehouse/uc-delta-aws-16.webp" />

Record the **Client ID** and **Client Secret** -- the secret cannot be retrieved later.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-17.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=420fe3b93f5015ffc499aea373cf5335" alt="Generated credentials" width="1920" height="967" data-path="images/ursa-lakehouse/uc-delta-aws-17.webp" />

## 3. (Alternative) Generate a User Token

A Databricks user token can be used by StreamNative Ursa to authenticate against Unity Catalog.

Open **User Settings**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-10.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=9ad2bc56000a9f4a2fc9bfb5cd965d34" alt="User settings" width="1920" height="936" data-path="images/ursa-lakehouse/uc-delta-aws-10.webp" />

Navigate to **Developer -> Access tokens -> Manage** and generate a new token. Record the token value -- it cannot be retrieved later.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-11.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=9c2e45faf0f7c13f257702ee75de2bf5" alt="Developer settings" width="1920" height="935" data-path="images/ursa-lakehouse/uc-delta-aws-11.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-12.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=b4f2a52a07e30b1cec9cb9dfe7621ca3" alt="Access tokens management" width="1920" height="933" data-path="images/ursa-lakehouse/uc-delta-aws-12.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-13.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=62a927f98f30174743c02ccb8fffff6a" alt="Create token" width="1920" height="933" data-path="images/ursa-lakehouse/uc-delta-aws-13.webp" />

## 4. Configure Unity Catalog Access

Navigate to **Catalog -> Settings -> Metastore**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-18.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=5a75169e533065fb3775f3d1a772f07d" alt="Catalog settings" width="1920" height="934" data-path="images/ursa-lakehouse/uc-delta-aws-18.webp" />

Enable **External data access** on the metastore.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-19.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=3c0cad2ccd9abe8b6970f7affb14ac4e" alt="Enable external data access" width="1920" height="931" data-path="images/ursa-lakehouse/uc-delta-aws-19.webp" />

Grant privileges on the catalog with the following settings:

* **Principal:** All accounts (or the specific user/service principal)
* **Privilege presets:** Data Editor (selects related privileges automatically)
* **EXTERNAL USE SCHEMA:** Enabled

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-20.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=fdd229fb70878fb605c1d50f78586f6f" alt="Grant privileges" width="1920" height="930" data-path="images/ursa-lakehouse/uc-delta-aws-20.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-21.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=170245b2b712b5d4077739f4d8cbf763" alt="Privilege settings" width="1920" height="933" data-path="images/ursa-lakehouse/uc-delta-aws-21.webp" />

If you use OAuth2 authentication, set the **Principal** to the service principal name created in step 3.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-22.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=79e999286107645a8e2d44e72111627c" alt="OAuth2 privileges" width="1920" height="971" data-path="images/ursa-lakehouse/uc-delta-aws-22.webp" />

## 5. Create an S3 Bucket

In your AWS account, create an S3 bucket for the Unity Catalog managed location (for example, `delta-unity-catalog-bucket`).

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-23.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=680c4405ae62b33fcd280c418bf3e451" alt="S3 bucket" width="1920" height="970" data-path="images/ursa-lakehouse/uc-delta-aws-23.webp" />

## 6. Create an IAM Policy

Navigate to **AWS IAM -> Policies -> Create policy**, choose JSON, and paste the following (replace `<your-bucket>`):

```json theme={null}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
      ],
      "Resource": "arn:aws:s3:::<your-bucket>/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::<your-bucket>",
      "Condition": {
        "StringLike": {
          "s3:prefix": ["*"]
        }
      }
    }
  ]
}
```

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-24.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=06daf791ee0ba17bdb05bdab9e60f127" alt="Create policy" width="1920" height="935" data-path="images/ursa-lakehouse/uc-delta-aws-24.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-25.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=03807b2dcaa078c9649d92382357b265" alt="Policy JSON" width="1920" height="968" data-path="images/ursa-lakehouse/uc-delta-aws-25.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-26.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=b1dd00f00ada92c89c8bbd180044be11" alt="Save policy" width="1920" height="964" data-path="images/ursa-lakehouse/uc-delta-aws-26.webp" />

## 7. Create an IAM Role

Navigate to **AWS IAM -> Roles -> Create role** and configure:

* **Trusted entity type:** AWS account
* **An AWS account:** This account
* **Enable External ID** with placeholder value `0000` (will be updated in step 9)

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-27.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=3bca210c3d859f3d5680efb9b1b5787e" alt="Create role" width="1920" height="937" data-path="images/ursa-lakehouse/uc-delta-aws-27.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-28.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=4acf85fdd3dfffde2477f3791a4f989f" alt="Trust settings" width="1920" height="966" data-path="images/ursa-lakehouse/uc-delta-aws-28.webp" />

Attach the policy from step 6.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-29.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=10bd30770b2fa991981903c7780116da" alt="Attach policy" width="1920" height="970" data-path="images/ursa-lakehouse/uc-delta-aws-29.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-30.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=f3de9192cd287eec1b6025c6b9c00e7b" alt="Save role" width="1920" height="973" data-path="images/ursa-lakehouse/uc-delta-aws-30.webp" />

Record the role ARN (for example, `arn:aws:iam::<account-id>:role/<role-name>`).

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-31.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=5c3722b5bd26db807f9de622ca623a70" alt="Role ARN" width="1920" height="970" data-path="images/ursa-lakehouse/uc-delta-aws-31.webp" />

## 8. Create a Storage Credential in Unity Catalog

Navigate to **Catalog -> Settings -> Credentials**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-32.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=d5dc6e6f94188eedf0a826cc233b0de2" alt="Credentials menu" width="1920" height="966" data-path="images/ursa-lakehouse/uc-delta-aws-32.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-33.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=8f088874cab16234feda6f75c01c0884" alt="Create credential" width="1920" height="963" data-path="images/ursa-lakehouse/uc-delta-aws-33.webp" />

Configure with:

* **Credential:** Storage Credential
* **Type:** AWS IAM Role
* **Name:** any name
* **Role ARN:** the ARN recorded in step 7

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-34.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=a549e084449d00a7c75dad3006d9d5d0" alt="Credential form" width="1920" height="967" data-path="images/ursa-lakehouse/uc-delta-aws-34.webp" />

Databricks generates a trust relationship policy. Copy it.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-35.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=a6547e92c49c4c767a1a1a54055bc78b" alt="Trust policy generated" width="1920" height="967" data-path="images/ursa-lakehouse/uc-delta-aws-35.webp" />

## 9. Update the IAM Role Trust Policy

Return to the AWS IAM console, open the role created in step 7, and replace the trust policy with the one generated by Databricks.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-36.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=86fed13e0a50591a6c956dc8238673ec" alt="Update trust policy" width="1920" height="969" data-path="images/ursa-lakehouse/uc-delta-aws-36.webp" />

Click **Validate** in the Unity Catalog console to verify the credential.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-37.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=c0c82b6fecb4fb0c5c841c38dcab795e" alt="Validate credential" width="1920" height="965" data-path="images/ursa-lakehouse/uc-delta-aws-37.webp" />

## 10. Create an External Location

Navigate to **Catalog -> Settings -> External Locations**.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-38.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=5979c7934a5aeb88e4721c0483aabb38" alt="External locations" width="1920" height="935" data-path="images/ursa-lakehouse/uc-delta-aws-38.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-39.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=70ecce871daa121f755b935274243362" alt="Create external location" width="1920" height="935" data-path="images/ursa-lakehouse/uc-delta-aws-39.webp" />

Choose **Manual** (the AWS Quickstart creates a new bucket).

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-40.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=4aed60785ac81478c9e2f9187ef19f13" alt="Manual external location" width="1920" height="935" data-path="images/ursa-lakehouse/uc-delta-aws-40.webp" />

Configure:

* **External location name:** any name
* **URL:** `s3://<your-bucket>`
* **Storage credential:** the credential from step 8

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-41.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=f803e57df3fd2de4f51f5932ceff3b76" alt="External location form" width="1920" height="965" data-path="images/ursa-lakehouse/uc-delta-aws-41.webp" />

After creation, click **Test connection** to verify access.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-42.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=e0f60f688d25ae322a98cccfbbe56d97" alt="Test external location" width="1920" height="965" data-path="images/ursa-lakehouse/uc-delta-aws-42.webp" />

If you use OAuth2, grant **ALL PRIVILEGES** on the external location to the service principal:

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-43.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=cfabfe0c941cbf60c2cec6f88b3e183c" alt="External location details" width="1920" height="962" data-path="images/ursa-lakehouse/uc-delta-aws-43.webp" />

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-44.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=773eece99a36d23c262c64dbe7032417" alt="Grant OAuth2 permissions" width="1920" height="968" data-path="images/ursa-lakehouse/uc-delta-aws-44.webp" />

## 11. Create the Catalog

In Databricks, create a new catalog and bind it to the external location created in step 10.

<img src="https://mintcdn.com/streamnative/RcAw7mp1LdooFmHe/images/ursa-lakehouse/uc-delta-aws-45.webp?fit=max&auto=format&n=RcAw7mp1LdooFmHe&q=85&s=46f09df7d6b825bdb6cb17ed4f1637f8" alt="Create catalog" width="1920" height="1022" data-path="images/ursa-lakehouse/uc-delta-aws-45.webp" />

## Catalog Information Summary

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

| Value                                               | Description                                                              |
| --------------------------------------------------- | ------------------------------------------------------------------------ |
| `unityCatalogUri`                                   | Databricks workspace URL (e.g., `https://dbc-xxxx.cloud.databricks.com`) |
| `unityCatalogName`                                  | The Unity Catalog name created in step 11                                |
| `unityCatalogToken`                                 | Personal access token from step 2, **or**                                |
| `unityCatalogClientId` / `unityCatalogClientSecret` | OAuth2 credentials from step 3                                           |

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