# Use Terraform for DBaaS

You can use the [Terraform Exoscale Provider](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs)
to manage your DBaaS resources.

## Provider Configuration

In the provider configuration, we define some variables that will be used later in the examples:

```hcl-terraform
terraform {
  required_providers {
    exoscale = {
      source  = "exoscale/exoscale"
    }
  }
}

provider "exoscale" {
  key = "${var.exoscale_api_key}"
  secret = "${var.exoscale_secret_key}"
}

variable "exoscale_api_key" {
  default = "api_key_value_here"
}

variable "exoscale_secret_key" {
  default =  "api_secret_key_value_here"
}

variable "database_username" {
  default =  "database_username_here"
}

variable "database_password" {
  default =  "database_password_here"
}

# Customizable parameters
locals {
  my_zone = "ch-gva-2"
}
```

To manage the databases in multiple zones, you need to create
[multiple provider configurations](https://www.terraform.io/language/providers/configuration#alias-multiple-provider-configurations), each with a different `alias`.

For more information, you can check Terraform's [provider configuration](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs) documentation.

## Manage Your Databases

### Create a PostgreSQL Database
```hcl-terraform
resource "exoscale_dbaas" "postgres" {
  name = "databasename"
  plan = "hobbyist-2"
  type = "pg"
  zone = local.my_zone
  pg {
    admin_username = "${var.database_username}"
    admin_password = "${var.database_password}"
    ip_filter = ["0.0.0.0/0"]
    version = "16"
  }
}
```

You can find the nested options for [PostgreSQL here](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs/resources/dbaas#nestedblock--pg)

### Create a Kafka Service
```hcl-terraform
resource "exoscale_dbaas" "kafka" {
  name = "databasename"
  plan = "startup-2"
  type = "kafka"
  zone = local.my_zone
  kafka {
    enable_cert_auth = true
    enable_kafka_connect = false
    enable_kafka_rest = false
    enable_sasl_auth = false
    enable_schema_registry = false
    ip_filter = ["0.0.0.0/0"]
    version = "3.8"
  }
}
```

You can find the nested options specific for [Kafka here](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs/resources/dbaas#nestedblock--kafka).


### Create a MySQL Database
```hcl-terraform
resource "exoscale_dbaas" "mysql" {
  name = "databasename"
  plan = "startup-8"
  type = "mysql"
  zone = local.my_zone
  mysql {
    admin_username = "${var.database_username}"
    admin_password = "${var.database_password}"
    ip_filter = ["0.0.0.0/0"]
    version = "8"
  }
}
```

You can find the nested options specific for [MySQL here](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs/resources/dbaas#nested-schema-for-mysql) 

### Create a Valkey Instance
```hcl-terraform
resource "exoscale_dbaas" "valkey" {
  name = "databasename"
  plan = "startup-8"
  type = "valkey"
  zone = local.my_zone
  valkey {
    ip_filter = ["0.0.0.0/0"]
  }
}
```

You can find the nested options specific for [Valkey here](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs/resources/dbaas#nested-schema-for-valkey)


### Create a Grafana Instance
```hcl-terraform
resource "exoscale_dbaas" "grafana" {
  name = "grafana"
  plan = "hobbyist-2"
  type = "grafana"
  zone = local.my_zone
  grafana {
    ip_filter = ["0.0.0.0/0"]
  }
}
```

You can find the nested options specific for [Grafana here](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs/resources/dbaas#nested-schema-for-grafana)

### Create an OpenSearch Instance
```hcl-terraform
resource "exoscale_dbaas" "opensearch" {
  name = "databasename"
  plan = "hobbyist-2"
  type = "opensearch"
  zone = local.my_zone
  opensearch {
    ip_filter = ["0.0.0.0/0"]
  }
}
```

You can find the nested options specific for [OpenSearch here](https://registry.terraform.io/providers/exoscale/exoscale/latest/docs/resources/dbaas#nested-schema-for-opensearch)
