Complete field reference for dbt-config.yml. Every key the module reads is documented here with its type, whether it is required, valid values, and an example.
Terraform requires version: 1, account, and projects. Shared resources live under globals; the root module hoists globals.connections, globals.privatelink_endpoints, globals.service_tokens, globals.groups, and globals.notifications into the internal shapes modules consume. Optional account-level keys (oauth_configurations, ip_restrictions, account_features, user_groups) stay at the document root. Validate with schemas/v1.json.
version: 1
account:
name: ...
host_url: https://cloud.getdbt.com
globals:
connections: [ ... ]
privatelink_endpoints: [ ... ]
service_tokens: [ ... ]
groups: [ ... ]
notifications: [ ... ]
oauth_configurations: [ ... ]
ip_restrictions: [ ... ]
account_features: { ... }
user_groups: [ ... ]
metadata: { ... }
projects:
- name: Analytics
key: analytics
protected: false
repository: { ... }
environments: [ ... ]
jobs: [ ... ]
environment_variables: [ ... ]
extended_attributes: [ ... ]
profiles: [ ... ]
lineage_integrations: [ ... ]
project_artefacts: { ... }
semantic_layer_config: { ... }Singleton object. All fields are optional and default to null (dbt Cloud account default applies).
| Field | Type | Default | Description |
|---|---|---|---|
advanced_ci |
bool | null | Enable Advanced CI comparison features |
partial_parsing |
bool | null | Enable incremental manifest parsing |
repo_caching |
bool | null | Enable repository-level caching |
account_features:
advanced_ci: true
partial_parsing: true
repo_caching: falseDefine warehouse connections under globals.connections in YAML. Terraform hoists them to an internal global_connections list. Environments reference a connection with connection (key, numeric id, or LOOKUP:…).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name in dbt Cloud |
key |
string | yes | — | Unique identifier used in environments[].connection references |
type |
string | yes | — | Adapter type — see valid values below |
private_link_endpoint_id |
string | no | null | PrivateLink endpoint ID |
protected |
bool | no | false | Prevents terraform destroy |
Valid type values: databricks · snowflake · bigquery · postgres · redshift
globals:
connections:
- name: Databricks Production
key: databricks_prod
type: databricks
host: adb-1234567890123456.7.azuredatabricks.net
http_path: /sql/1.0/warehouses/abc1234def567890
catalog: main # optional — Unity Catalog catalog name
private_link_endpoint_id: null # optional
protected: false
# OAuth credentials via connection_credentials["databricks_prod"]| Field | Type | Required | Default |
|---|---|---|---|
host |
string | yes | "" |
http_path |
string | yes | "" |
catalog |
string | no | null |
globals:
connections:
- name: Snowflake Production
key: snowflake_prod
type: snowflake
account: xy12345.us-east-1
database: ANALYTICS
warehouse: TRANSFORMING
role: TRANSFORMER # optional
allow_sso: false # optional
client_session_keep_alive: false # optional
# OAuth credentials via connection_credentials["snowflake_prod"]| Field | Type | Required | Default |
|---|---|---|---|
account |
string | yes | "" |
database |
string | yes | "" |
warehouse |
string | yes | "" |
role |
string | no | null |
allow_sso |
bool | no | false |
client_session_keep_alive |
bool | no | false |
globals:
connections:
- name: BigQuery Production
key: bigquery_prod
type: bigquery
gcp_project_id: my-gcp-project-id
client_email: dbt-sa@my-project.iam.gserviceaccount.com # optional
client_id: "123456789012345678901" # optional
auth_uri: https://accounts.google.com/o/oauth2/auth # optional
token_uri: https://oauth2.googleapis.com/token # optional
auth_provider_x509_cert_url: https://www.googleapis.com/oauth2/v1/certs # optional
client_x509_cert_url: https://www.googleapis.com/... # optional
timeout_seconds: 300 # optional
location: US # optional
# private_key / private_key_id via connection_credentials["bigquery_prod"]| Field | Type | Required | Default |
|---|---|---|---|
gcp_project_id |
string | yes | "" |
client_email |
string | no | null |
client_id |
string | no | null |
auth_uri |
string | no | null |
token_uri |
string | no | null |
auth_provider_x509_cert_url |
string | no | null |
client_x509_cert_url |
string | no | null |
timeout_seconds |
number | no | null |
location |
string | no | null |
globals:
connections:
- name: Postgres Production
key: postgres_prod
type: postgres
hostname: my-host.rds.amazonaws.com
dbname: analytics
port: 5432 # optional — default 5432| Field | Type | Required | Default |
|---|---|---|---|
hostname |
string | yes | "" |
dbname |
string | yes | "" |
port |
number | no | 5432 |
globals:
connections:
- name: Redshift Production
key: redshift_prod
type: redshift
hostname: my-cluster.abc123.us-east-1.redshift.amazonaws.com
dbname: analytics
port: 5439 # optional — default 5439| Field | Type | Required | Default |
|---|---|---|---|
hostname |
string | yes | "" |
dbname |
string | yes | "" |
port |
number | no | 5439 |
Account-level API service tokens. In YAML they belong under globals.service_tokens (the root module hoists them for modules).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
permissions |
list | no | [] | List of permission objects |
protected |
bool | no | false | Prevents terraform destroy |
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
permission_set |
string | yes | — | Permission level — see values below |
all_projects |
bool | no | true | Apply to all projects |
project_id |
number | no | null | Numeric project ID when all_projects: false |
Valid permission_set values: account_admin · git_admin · job_admin · job_runner · job_viewer · member · metadata_only · owner · readonly · seeker_user · webhook_admin
globals:
service_tokens:
- name: CI Service Token
key: ci_token
protected: false
permissions:
- permission_set: job_runner
all_projects: true
- permission_set: git_admin
all_projects: false
project_id: 12345Account-level user groups. In YAML they belong under globals.groups.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
assign_by_default |
bool | no | false | Auto-assign new users to this group |
sso_mapping_groups |
list(string) | no | null | SSO/IdP group names to sync |
permissions |
list | no | [] | Project-level permission grants |
protected |
bool | no | false | Prevents terraform destroy |
Same structure as service_tokens[].permissions[] above.
globals:
groups:
- name: Developers
key: developers
assign_by_default: false
sso_mapping_groups:
- "data-team-eng"
permissions:
- permission_set: job_runner
all_projects: trueAssigns existing dbt Cloud users to groups. group_keys references globals.groups[].key.
| Field | Type | Required | Default |
|---|---|---|---|
user_id |
number | yes | — |
group_keys |
list(string) | no | [] |
user_groups:
- user_id: 12345
group_keys:
- developers
- analystsJob notification rules. In YAML they belong under globals.notifications.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
notification_type |
number | no | 1 | See valid values below |
user_id |
number | no | null | dbt Cloud user ID (required for type 1) |
slack_channel_id |
string | no | null | Slack channel ID (required for type 2) |
slack_channel_name |
string | no | null | Slack channel display name (type 2) |
external_email |
string | no | null | Email address (required for type 3) |
on_failure |
list(number) | no | [] | Job IDs to notify on failure |
on_success |
list(number) | no | [] | Job IDs to notify on success |
on_cancel |
list(number) | no | [] | Job IDs to notify on cancel |
on_warning |
list(number) | no | [] | Job IDs to notify on warning |
Valid notification_type values:
| Value | Destination |
|---|---|
1 |
dbt Cloud user (email) |
2 |
Slack channel |
3 |
External email address |
globals:
notifications:
# dbt Cloud user notification
- name: prod-failures-user
key: prod_failures_user
notification_type: 1
user_id: 12345
on_failure: [1001, 1002]
on_success: []
# Slack channel notification
- name: prod-failures-slack
key: prod_failures_slack
notification_type: 2
slack_channel_id: C0123456789
slack_channel_name: "#dbt-alerts"
on_failure: [1001, 1002]
on_cancel: [1001]
# External email notification
- name: prod-failures-email
key: prod_failures_email
notification_type: 3
external_email: oncall@example.com
on_failure: [1001]Account-level OAuth configurations (e.g., Snowflake OAuth, BigQuery WIF).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
type |
string | yes | — | OAuth provider type |
authorize_url |
string | yes | — | OAuth authorization endpoint |
token_url |
string | yes | — | OAuth token endpoint |
redirect_uri |
string | yes | — | Redirect URI registered with the provider |
client_id |
string | yes | — | OAuth client ID |
!!! note "Client secret"
The client_secret is supplied via the oauth_client_secrets Terraform variable keyed by this entry's key — never hard-code it in YAML.
oauth_configurations:
- name: Snowflake OAuth
key: snowflake_oauth
type: snowflake
authorize_url: https://xy12345.snowflakecomputing.com/oauth/authorize
token_url: https://xy12345.snowflakecomputing.com/oauth/token-request
redirect_uri: https://cloud.getdbt.com/complete/oauth
client_id: my-client-id
# client_secret via: TF_VAR_oauth_client_secrets='{"snowflake_oauth":"..."}'Account-level IP allowlist / denylist rules.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
type |
string | no | allow |
allow or deny |
description |
string | no | null | Human-readable description |
rule_set_enabled |
bool | no | true | Whether this rule is active |
cidrs |
list | no | [] | List of CIDR objects |
| Field | Type | Required |
|---|---|---|
cidr |
string | yes |
ip_restrictions:
- name: Corporate VPN
key: corp_vpn
type: allow
description: "Allow traffic from corporate network"
rule_set_enabled: true
cidrs:
- cidr: 203.0.113.0/24
- cidr: 198.51.100.0/24
- name: Block public ranges
key: block_public
type: deny
rule_set_enabled: true
cidrs:
- cidr: 0.0.0.0/0| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | dbt Cloud project display name |
key |
string | no | name |
Unique identifier used in cross-references |
protected |
bool | no | false | Prevents terraform destroy |
projects:
- name: Analytics
key: analytics
protected: false| Field | Type | Required | Default | Description |
|---|---|---|---|---|
remote_url |
string | yes | — | "org/repo" slug or full HTTPS URL |
git_clone_strategy |
string | no | auto-detected | Override clone strategy — see values below |
is_active |
bool | no | true | Whether the repository integration is active |
github_installation_id |
number | no | null | GitHub App installation ID |
gitlab_project_id |
number | no | null | GitLab numeric project ID |
pull_request_url_template |
string | no | null | Custom PR URL template (GitLab) |
azure_active_directory_project_id |
string | no | null | Azure DevOps project UUID |
azure_active_directory_repository_id |
string | no | null | Azure DevOps repository UUID |
azure_bypass_webhook_registration_failure |
bool | no | false | Skip webhook registration errors |
private_link_endpoint_id |
string | no | null | PrivateLink endpoint |
protected |
bool | no | false | Prevents terraform destroy |
Valid git_clone_strategy values: github_app · deploy_key · deploy_token · azure_active_directory_app
The strategy is auto-detected from the presence of github_installation_id, gitlab_project_id, or Azure fields — you normally don't need to set it manually.
=== "GitHub App"
yaml repository: remote_url: "your-org/your-repo" github_installation_id: 12345678
=== "GitLab"
yaml repository: remote_url: "https://gitlab.com/your-org/your-repo.git" gitlab_project_id: 9876543 pull_request_url_template: "https://gitlab.com/your-org/your-repo/-/merge_requests/{{prNumber}}"
=== "Azure DevOps"
yaml repository: remote_url: "https://dev.azure.com/org/project/_git/repo" git_clone_strategy: azure_active_directory_app azure_active_directory_project_id: "00000000-0000-0000-0000-000000000001" azure_active_directory_repository_id: "00000000-0000-0000-0000-000000000002" azure_bypass_webhook_registration_failure: false
=== "Deploy Key (public repos)"
yaml repository: remote_url: "https://github.com/your-org/your-repo.git" git_clone_strategy: deploy_key
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier used in deferring_environment_key, etc. |
type |
string | yes | — | deployment or development |
deployment_type |
string | conditional | — | production or staging — required when type: deployment |
connection |
string | conditional | null | Global connection key, numeric id, or LOOKUP:… — omit when using primary_profile_key (either connection or primary_profile_key must be set) |
dbt_version |
string | no | null | Pin dbt Core version (e.g., "1.9.0") |
custom_branch |
string | no | null | Custom git branch (development envs) |
enable_model_query_history |
bool | no | null | Enable query history tracking |
extended_attributes_key |
string | no | null | References extended_attributes[].key |
protected |
bool | no | false | Prevents terraform destroy |
credential |
object | no | — | Warehouse credential block — see below |
environments:
- name: Production
key: prod
type: deployment
deployment_type: production
connection: databricks_prod
dbt_version: "1.9.0"
custom_branch: main
enable_model_query_history: false
extended_attributes_key: databricks_overrides
protected: true
credential:
credential_type: databricks
catalog: main
schema: analyticsThe credential_type field selects which credential resource is created. Sensitive values (passwords, tokens, keys) must be supplied via the environment_credentials Terraform variable keyed by "{project_key}_{env_key}".
=== "Databricks"
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| credential_type | string | yes | — | "databricks" |
| catalog | string | no | null | Unity Catalog catalog |
| schema | string | no | "" | Target schema |
| token_name | string | no | — | Legacy: key in token_map variable |
```yaml
credential:
credential_type: databricks
catalog: main
schema: analytics
# token via environment_credentials["analytics_prod"]["token"]
```
=== "Snowflake (password)"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| auth_type | string | yes | "password" |
| user | string | yes | — |
| schema | string | no | "" |
| database | string | no | null |
| role | string | no | null |
| warehouse | string | no | null |
| num_threads | number | no | null |
```yaml
credential:
credential_type: snowflake
auth_type: password
user: DBT_USER
schema: ANALYTICS
database: ANALYTICS
warehouse: TRANSFORMING
role: TRANSFORMER
num_threads: 8
# password via environment_credentials["analytics_prod"]["password"]
```
=== "Snowflake (keypair)"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| auth_type | string | yes | "keypair" |
| user | string | yes | — |
| schema | string | no | "" |
| database | string | no | null |
| role | string | no | null |
| warehouse | string | no | null |
| num_threads | number | no | null |
```yaml
credential:
credential_type: snowflake
auth_type: keypair
user: DBT_USER
schema: ANALYTICS
# private_key + private_key_passphrase via environment_credentials["analytics_prod"]
```
=== "BigQuery"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| dataset | string | no | "" |
| num_threads | number | no | null |
```yaml
credential:
credential_type: bigquery
dataset: analytics
num_threads: 8
```
=== "Postgres"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| username | string | yes | — |
| default_schema | string | no | "" |
| num_threads | number | no | null |
| target_name | string | no | null |
```yaml
credential:
credential_type: postgres
username: dbt_user
default_schema: analytics
num_threads: 4
target_name: prod
# password via environment_credentials["analytics_prod"]["password"]
```
=== "Redshift"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| username | string | yes | — |
| default_schema | string | no | "" |
| num_threads | number | no | 4 |
```yaml
credential:
credential_type: redshift
username: dbt_user
default_schema: analytics
num_threads: 4
# password via environment_credentials["analytics_prod"]["password"]
```
=== "Athena"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| schema | string | no | "" |
| num_threads | number | no | null |
```yaml
credential:
credential_type: athena
schema: analytics
num_threads: 4
# aws_access_key_id + aws_secret_access_key via environment_credentials["analytics_prod"]
```
=== "Fabric / Synapse"
SQL auth (credential_type: fabric or credential_type: synapse):
| Field | Type | Required | Default |
|---|---|---|---|
| `credential_type` | string | **yes** | — |
| `schema` | string | no | `""` |
| `user` | string | **yes** | — |
| `schema_authorization` | string | no | null |
| `authentication` | string | no | `"sql"` (Synapse only) |
```yaml
credential:
credential_type: fabric
schema: analytics
user: DBT_USER
schema_authorization: dbo
# password via environment_credentials["analytics_prod"]["password"]
```
**Service Principal auth:**
| Field | Type | Required | Default |
|---|---|---|---|
| `credential_type` | string | **yes** | — |
| `schema` | string | no | `""` |
| `tenant_id` | string | **yes** | — |
| `client_id` | string | **yes** | — |
| `schema_authorization` | string | no | null |
| `authentication` | string | no | `"ServicePrincipal"` (Synapse only) |
```yaml
credential:
credential_type: synapse
schema: analytics
tenant_id: "00000000-0000-0000-0000-000000000001"
client_id: "my-app-client-id"
authentication: ServicePrincipal
# client_secret via environment_credentials["analytics_prod"]["client_secret"]
```
=== "Starburst / Trino"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | "starburst" or "trino" |
| schema | string | no | "" |
| catalog | string | no | "" |
| user | string | yes | — |
| num_threads | number | no | null |
```yaml
credential:
credential_type: starburst
schema: analytics
catalog: iceberg
user: DBT_USER
num_threads: 4
# password via environment_credentials["analytics_prod"]["password"]
```
=== "Spark"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| schema | string | no | "" |
```yaml
credential:
credential_type: spark
schema: analytics
# token via environment_credentials["analytics_prod"]["token"]
```
=== "Teradata"
| Field | Type | Required | Default |
|---|---|---|---|
| credential_type | string | yes | — |
| user | string | yes | — |
| schema | string | no | "" |
| num_threads | number | no | null |
```yaml
credential:
credential_type: teradata
user: DBT_USER
schema: analytics
num_threads: 4
# password via environment_credentials["analytics_prod"]["password"]
```
Jobs are defined at project level and reference environments by key. They are not nested inside environments.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier — used in artefacts references |
environment_key |
string | yes | — | References environments[].key |
execute_steps |
list(string) | yes | — | Ordered list of dbt CLI commands |
triggers |
object | yes | — | At least one trigger must be set — see below |
description |
string | no | null | Job description shown in dbt Cloud |
dbt_version |
string | no | null | Pin dbt Core version (overrides environment) |
num_threads |
number | no | 4 | Thread count |
target_name |
string | no | null | dbt target name (e.g., "prod") |
timeout_seconds |
number | no | 0 |
Job timeout in seconds — 0 means no timeout (provider default) |
is_active |
bool | no | true | Whether the job is enabled |
job_type |
string | no | — | "scheduled" · "ci" · "merge" |
generate_docs |
bool | no | false | Regenerate docs on each run |
run_generate_sources |
bool | no | false | Run dbt source freshness |
run_lint |
bool | no | false | Run SQLFluff lint step |
errors_on_lint_failure |
bool | no | true | Treat lint failures as errors |
run_compare_changes |
bool | no | false | Advanced CI — requires deployment env with deferral |
triggers_on_draft_pr |
bool | no | false | Trigger on draft pull requests |
deferring_environment_key |
string | no | null | References environments[].key for state deferral |
self_deferring |
bool | no | null | Defer to the job's own previous run |
force_node_selection |
bool | no | auto | SAO — set automatically; null for CI/merge jobs |
protected |
bool | no | false | Prevents terraform destroy |
environment_variable_overrides |
map(string) | no | {} |
Job-level env var overrides — creates dbtcloud_environment_variable_job_override resources |
Map of variable name to string value. Plain strings are written as the override raw_value. If a value starts with secret_, the prefix is stripped and the rest is used as a key into the Terraform token_map variable (same pattern as legacy Databricks credential.token_name).
jobs:
- name: Production Daily
key: prod_daily
environment_key: prod
execute_steps:
- dbt build
triggers:
schedule: true
environment_variable_overrides:
DBT_SOME_FLAG: "1"
DBT_SECRET_TOKEN: secret_ci_dbt_token # resolved from token_map["ci_dbt_token"]| Field | Type | Default | Description |
|---|---|---|---|
schedule |
bool | false | Run on a schedule |
github_webhook |
bool | false | Trigger on GitHub PR events |
git_provider_webhook |
bool | false | Trigger on generic git provider webhooks |
on_merge |
bool | false | Trigger when PR is merged |
At least one of these must be true.
Only one schedule mode is applied — precedence order: schedule_cron > schedule_interval > schedule_hours.
| Field | Type | Default | Description |
|---|---|---|---|
schedule_type |
string | null | "every_day" · "days_of_week" · "days_of_month" |
schedule_days |
list(number) | null | Days to run — 0–6 (Sun–Sat) for week; 1–31 for month |
schedule_hours |
list(number) | null | UTC hours to run — e.g., [6, 18] |
schedule_cron |
string | null | Cron expression — overrides other schedule fields |
schedule_interval |
number | null | Run every N hours — overrides schedule_hours |
jobs:
# Scheduled job — weekdays at 6 AM UTC
- name: Production Daily
key: prod_daily
environment_key: prod
execute_steps:
- dbt build
triggers:
schedule: true
schedule_type: days_of_week
schedule_days: [1, 2, 3, 4, 5]
schedule_hours: [6]
num_threads: 8
target_name: prod
timeout_seconds: 3600
generate_docs: true
deferring_environment_key: prod
self_deferring: true
protected: true
environment_variable_overrides:
DBT_TARGET: prod
# CI job — triggered on PR
- name: Staging CI
key: staging_ci
environment_key: staging
execute_steps:
- dbt build --select state:modified+
triggers:
github_webhook: true
git_provider_webhook: true
job_type: ci
run_compare_changes: true
deferring_environment_key: prod
# Merge job — triggered on PR merge
- name: Staging Merge
key: staging_merge
environment_key: staging
execute_steps:
- dbt build --select state:modified+
triggers:
on_merge: true
job_type: merge
deferring_environment_key: prod
# Cron schedule
- name: Hourly Refresh
key: hourly_refresh
environment_key: prod
execute_steps:
- dbt run --select marts.finance
triggers:
schedule: true
schedule_cron: "0 * * * *"Project-level dbt environment variables with per-environment value overrides.
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | Variable name — must use DBT_ prefix convention |
environment_values |
list | yes | Per-environment value list |
| Field | Type | Required | Description |
|---|---|---|---|
env |
string | yes | "project" for project default, or the environment name (not key) |
value |
string | yes | Variable value |
environment_variables:
- name: DBT_WAREHOUSE
environment_values:
- env: project # project-level default
value: "prod_warehouse"
- env: Production # matches environment name
value: "prod_warehouse"
- env: Development
value: "dev_warehouse"
- name: DBT_TARGET
environment_values:
- env: project
value: "prod"
- env: Staging
value: "staging"Per-project connection-level overrides applied at the environment level. Linked from environments via extended_attributes_key. Terraform JSON-encodes the inner extended_attributes object for the dbt Cloud API (adapter-specific keys such as databricks, snowflake, etc.).
| Field | Type | Required | Description |
|---|---|---|---|
key |
string | yes (recommended) | Unique slug — referenced by environments[].extended_attributes_key. If omitted, Terraform falls back to name. |
name |
string | no | Human-readable label (can be used as the identifier when key is omitted) |
extended_attributes |
object | yes | Map of connection override fields (structure depends on warehouse type) |
protected |
bool | no | Prevents terraform destroy when true |
id |
number | no | Legacy dbt Cloud id for import / remap |
extended_attributes:
- key: databricks_overrides
extended_attributes:
databricks:
http_path: /sql/1.0/warehouses/override-warehouse-id
catalog: overridden_catalog
- key: snowflake_overrides
extended_attributes:
snowflake:
warehouse: HIGH_MEMORY_WHLinks a global connection + environment credential + extended attributes into a named profile for an environment.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
connection_key |
string | yes | — | References globals.connections[].key |
credentials_key |
string | yes | — | Credential key / composite reference (see profiles module) |
credentials_id |
number | no | null | Source credential id for import / remap |
extended_attributes_key |
string | no | null | References extended_attributes[].key |
profiles:
- name: prod-profile
key: prod_profile
connection_key: databricks_prod
credentials_key: analytics_prod
extended_attributes_key: databricks_overridesPer-project lineage integrations (e.g., Tableau, Looker).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | — | Display name |
key |
string | no | name |
Unique identifier |
host |
string | yes | — | Lineage tool host URL |
site_id |
string | yes | — | Site/workspace identifier |
token_name |
string | yes | — | Token name label |
!!! note "Token"
The actual token value is supplied via lineage_tokens Terraform variable keyed by "{project_key}_{integration_key}".
lineage_integrations:
- name: Tableau Production
key: tableau_prod
host: https://tableau.example.com
site_id: my-site
token_name: dbt-cloud-tableau-token
# token via: TF_VAR_lineage_tokens='{"analytics_tableau_prod":"token..."}'Links the project's documentation and source freshness jobs. Both fields reference jobs[].key.
| Field | Type | Required | Description |
|---|---|---|---|
docs_job_key |
string | no | Job key for the documentation artifact |
freshness_job_key |
string | no | Job key for the source freshness artifact |
project_artefacts:
docs_job_key: prod_daily
freshness_job_key: prod_dailyConfigures the dbt Semantic Layer for a project.
| Field | Type | Required | Description |
|---|---|---|---|
environment_id |
string | no | Numeric environment id (pass-through) |
environment_key / environment |
string | no | References environments[].key |
!!! warning "Create-only" The semantic layer configuration cannot be imported. It is created once and Terraform will not attempt to update it on subsequent runs if it already exists.
semantic_layer_config:
environment_key: prodSensitive values are never written directly in YAML. Instead, they are passed as Terraform variables and matched by key at apply time.
| Terraform variable | Key format | Matched to |
|---|---|---|
token_map |
"my_token_name" |
credential.token_name in YAML (legacy Databricks) |
environment_credentials |
"project_key_env_key" |
Environment credential block |
connection_credentials |
"connection_key" |
globals.connections[].key |
lineage_tokens |
"project_key_integration_key" |
lineage_integrations[].key composite |
oauth_client_secrets |
"oauth_config_key" |
oauth_configurations[].key |
Keys use underscores and must exactly match the key: values in your YAML. For example, a project with key: analytics and an environment with key: prod uses the environment_credentials key "analytics_prod".
export TF_VAR_environment_credentials='{
"analytics_prod": {
"credential_type": "databricks",
"token": "dapi...",
"catalog": "main",
"schema": "analytics"
},
"analytics_staging": {
"credential_type": "databricks",
"token": "dapi...",
"catalog": "main",
"schema": "analytics_staging"
}
}'
export TF_VAR_connection_credentials='{
"snowflake_prod": {
"oauth_client_id": "...",
"oauth_client_secret": "..."
}
}'
export TF_VAR_lineage_tokens='{
"analytics_tableau_prod": "tableau-pat-token..."
}'
export TF_VAR_oauth_client_secrets='{
"snowflake_oauth": "client-secret-value..."
}'Any resource that supports a protected field uses a duplicate Terraform resource block pattern:
protected: false(default) — resource created normally;terraform destroyworksprotected: true— resource created withlifecycle { prevent_destroy = true };terraform destroyis blocked with an error
This is the only reliable way to prevent accidental destruction in Terraform. Use it for production environments, production jobs, and any resource that would be costly to recreate.