---
title: "Create Kafka cluster via Terraform"
sidebar_label: "Create Kafka cluster"
description: "How to create a Kafka cluster with a database"
sidebar_position: 6
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import ConfigureProviders from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/configure-providers.mdx'
import ConfigureProvidersConfig from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/configure-providers-config.mdx'
import CreateResourcesAlert from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/common/create-resources-alert.mdx'
import CreateNetworks from '@site/i18n/en/docusaurus-plugin-content-docs-terraform/current/_partials/cloud-networks/create-networks.mdx'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'

# Create Kafka cluster via Terraform

<CreateResourcesAlert />

<br />

1. Optional: [configure providers](#configure-providers).
2. [Create a private network and subnet](#create-networks).
3. [Create a cluster](#create-cluster).
4. [Create a user](#create-user).
5. [Create a topic](#create-topic).
6. [Grant the user access](#grant-access).

## Configuration files \{#config}

<details>
  <summary>Example file for configuring providers</summary>

  <ConfigureProvidersConfig />
</details>

<details>
  <summary>Example file for creating a fixed configuration Kafka cluster</summary>

  ```hcl
  resource "openstack_networking_network_v2" "network_1" {
    name           = "private-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.199.0/24"
  }

  data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
    filter {
      engine  = "kafka"
      version = "3.5"
    }
  }

  data "selectel_dbaas_flavor_v1" "flavor_1" {
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
    filter {
      datastore_type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
      fl_size           = "standard"
      vcpus             = 4
      ram               = 16384
      disk              = 128
    }
  }

  resource "selectel_dbaas_kafka_datastore_v1" "datastore_1" {
    name       = "datastore-1"
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
    type_id    = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
    subnet_id  = openstack_networking_subnet_v2.subnet_1.id
    node_count = 1
    flavor_id  = data.selectel_dbaas_flavor_v1.flavor_1.flavors[0].id
  }

  resource "selectel_dbaas_user_v1" "user_1" {
    project_id   = selectel_vpc_project_v2.project_1.id
    region       = "ru-9"
    datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
    name         = "user"
    password     = "secret"
  }

  resource "selectel_dbaas_kafka_topic_v1" "topic_1" {
    project_id   = selectel_vpc_project_v2.project_1.id
    region       = "ru-9"
    datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
    name         = "topic"
    partitions   = 1
  }

  resource "selectel_dbaas_kafka_acl_v1" "acl_1" {
    project_id   = selectel_vpc_project_v2.project_1.id
    region       = "ru-9"
    datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
    pattern      = "topic"
    pattern_type = "prefixed"
    allow_read   = true
    allow_write  = true
    user_id      = selectel_dbaas_user_v1.user_1.id
  }
  ```
</details>

<details>
  <summary>Example file for creating a custom configuration Kafka cluster</summary>

  ```hcl
  resource "openstack_networking_network_v2" "network_1" {
    name           = "private-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.199.0/24"
  }

  data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
    filter {
      engine  = "kafka"
      version = "3.5"
    }
  }

  resource "selectel_dbaas_kafka_datastore_v1" "datastore_1" {
    name       = "datastore-1"
    project_id = selectel_vpc_project_v2.project_1.id
    region     = "ru-9"
    type_id    = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
    subnet_id  = selectel_vpc_subnet_v2.subnet.subnet_id
    node_count = 1
    flavor {
      vcpus = 2
      ram   = 8192
      disk  = 64
    }
  }

  resource "selectel_dbaas_user_v1" "user_1" {
    project_id   = selectel_vpc_project_v2.project_1.id
    region       = "ru-9"
    datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
    name         = "user"
    password     = "secret"
  }

  resource "selectel_dbaas_kafka_topic_v1" "topic_1" {
    project_id   = selectel_vpc_project_v2.project_1.id
    region       = "ru-9"
    datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
    name         = "topic"
    partitions   = 1
  }

  resource "selectel_dbaas_kafka_acl_v1" "acl_1" {
    project_id   = selectel_vpc_project_v2.project_1.id
    region       = "ru-9"
    datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
    pattern      = "topic"
    pattern_type = "prefixed"
    allow_read   = true
    allow_write  = true
    user_id      = selectel_dbaas_user_v1.user_1.id
  }
  ```
</details>

## 1. Optional: configure providers \{#configure-providers}

If you have [configured the Selectel and OpenStack providers](/terraform/configure-terraform-environment/#configure-providers), skip this step.

<ConfigureProviders />

## 2. Create a private network and subnet \{#create-networks}

<CreateNetworks />

## 3. Create a cluster \{#create-cluster}

<Tabs queryString="create-cluster">
  <TabItem value="fixed" default>
    <TabItemLabel>
      Fixed configuration
    </TabItemLabel>

    ```hcl
    data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
      project_id = selectel_vpc_project_v2.project_1.id
      region     = "ru-9"
      filter {
        engine  = "kafka"
        version = "3.5"
      }
    }

    data "selectel_dbaas_flavor_v1" "flavor_1" {
      project_id = selectel_vpc_project_v2.project_1.id
      region     = "ru-9"
      filter {
        datastore_type_id = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
        fl_size           = "standard"
        vcpus             = 4
        ram               = 16384
        disk              = 128
      }
    }

    resource "selectel_dbaas_kafka_datastore_v1" "datastore_1" {
      name       = "datastore-1"
      project_id = selectel_vpc_project_v2.project_1.id
      region     = "ru-9"
      type_id    = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
      subnet_id  = openstack_networking_subnet_v2.subnet_1.id
      node_count = 1
      flavor_id  = data.selectel_dbaas_flavor_v1.flavor_1.flavors[0].id
    }
    ```

    Where:

    * `region` — pool, for example `ru-9`. For a list of available pools, see the instructions in [Product availability by location](/infrastructure/product-availability-by-location/#managed-databases);
    * `filter` — database type filter:
      * `engine` — database type;
      * `version` — cloud database version. The list of available versions can be found in the [Versions and configurations](/managed-databases/kafka/configurations/) article;
    * `nodes_count` — number of nodes. The maximum number of nodes is 1;
    * `filter` — fixed cluster configuration filter. The list of available configurations can be found in the [Versions and configurations](/managed-databases/kafka/configurations/) article;
      * `fl_size` — [fixed configuration line](/managed-databases/kafka/configurations/). Available values are `standard` (for Standard, CPU, and Memory lines) and `high_freq` (for HighFreq line);
      * `vcpus` — number of vCPUs;
      * `ram` — amount of RAM in MB;
      * `disk` — disk size in GB.

    See the detailed description of data sources and resources:

    * [selectel\_dbaas\_datastore\_type\_v1](/terraform/selectel-provider-reference/data-sources/dbaas_datastore_type_v1/);
    * [selectel\_dbaas\_flavor\_v1](/terraform/selectel-provider-reference/data-sources/dbaas_flavor_v1/);
    * [selectel\_dbaas\_kafka\_datastore\_v1](/terraform/selectel-provider-reference/resources/dbaas_kafka_datastore_v1/).
  </TabItem>

  <TabItem value="custom">
    <TabItemLabel>
      Custom configuration
    </TabItemLabel>

    ```hcl
    data "selectel_dbaas_datastore_type_v1" "datastore_type_1" {
      project_id = selectel_vpc_project_v2.project_1.id
      region     = "ru-9"
      filter {
        engine  = "kafka"
        version = "3.5"
      }
    }

    resource "selectel_dbaas_kafka_datastore_v1" "datastore_1" {
      name       = "datastore-1"
      project_id = selectel_vpc_project_v2.project_1.id
      region     = "ru-9"
      type_id    = data.selectel_dbaas_datastore_type_v1.datastore_type_1.datastore_types[0].id
      subnet_id  = openstack_networking_subnet_v2.subnet_1.id
      node_count = 1
      flavor {
        vcpus = 2
        ram   = 8192
        disk  = 64
      }
    }
    ```

    Where:

    * `region` — pool, for example `ru-9`. For a list of available pools, see the instructions in [Product availability by location](/infrastructure/product-availability-by-location/#managed-databases);
    * `filter` — database type filter:
      * `engine` — database type;
      * `version` — cloud database version. The list of available versions can be found in the [Versions and configurations](/managed-databases/kafka/configurations/) article;
    * `node_count` — number of nodes. The maximum number of nodes is 1;
    * `flavor` — custom cluster configuration. Available values for custom configurations can be found in the [Versions and configurations](/managed-databases/kafka/configurations/) article:
      * `vcpus` — number of vCPUs;
      * `ram` — amount of RAM in MB;
      * `disk` — disk size in GB.

    See the detailed description of the [selectel\_dbaas\_datastore\_type\_v1](/terraform/selectel-provider-reference/data-sources/dbaas_datastore_type_v1/) data source and the [selectel\_dbaas\_kafka\_datastore\_v1](/terraform/selectel-provider-reference/resources/dbaas_kafka_datastore_v1/).
  </TabItem>
</Tabs>

## 4. Create a user \{#create-user}

```hcl
resource "selectel_dbaas_user_v1" "user_1" {
  project_id   = selectel_vpc_project_v2.project_1.id
  region       = "ru-9"
  datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
  name         = "user"
  password     = "secret"
}
```

Where:

* `region` — pool where the cluster is located;
* `name` — username;
* `password` — user password.

See the detailed description of the [selectel\_dbaas\_user\_v1](/terraform/selectel-provider-reference/resources/dbaas_user_v1/).

## 5. Create a topic \{#create-topic}

```hcl
resource "selectel_dbaas_kafka_topic_v1" "topic_1" {
  project_id   = selectel_vpc_project_v2.project_1.id
  region       = "ru-9"
  datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
  name         = "topic"
  partitions   = 1
}
```

Where:

* `region` — pool where the cluster is located;
* `partitions` — number of partitions in the topic.

See the detailed description of the [selectel\_dbaas\_kafka\_topic\_v1](/terraform/selectel-provider-reference/resources/dbaas_kafka_topic_v1/).

## 6. Grant access to the user \{#grant-access}

```hcl
resource "selectel_dbaas_kafka_acl_v1" "acl_1" {
  project_id   = selectel_vpc_project_v2.project_1.id
  region       = "ru-9"
  datastore_id = selectel_dbaas_kafka_datastore_v1.datastore_1.id
  pattern      = "topic"
  pattern_type = "prefixed"
  allow_read   = true
  allow_write  = true
  user_id      = selectel_dbaas_user_v1.user_1.id
}
```

Where:

* `region` — pool where the cluster is located;
* `pattern` — name or prefix of the topic to which access is granted. Omit this argument if `pattern_type = all`;
* `pattern_type` — access type to topics. Available values are `prefixed`, `literal`, `all`. If `pattern_type = all`, skip the `pattern`;
* `allow_read` — gives the user the consumer role. The user receives and processes messages from the topic they have access to;
* `allow_write` — gives the user the producer role. The user sends messages to the topic they have access to.

See the detailed resource description for [selectel\_dbaas\_kafka\_acl\_v1](/terraform/selectel-provider-reference/resources/dbaas_kafka_acl_v1/).

<Formbricks />
