---
title: "Create a private zone and resource records via Terraform"
sidebar_label: "Create a private zone and resource records"
description: "How to create a private network and a subnet, a private DNS zone and resource records for it, and connect a network to the zone"
sidebar_position: 1
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
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 {TabItemLabel} from '@selectel/docux/components'

# Create a private zone and resource records via Terraform

<CreateResourcesAlert />

<br />

1. Optional: [configure providers](#configure-providers).
2. [Create a private network and a subnet](#create-networks).
3. [Create a zone with records](#create-zone-with-records).
4. Optional: to have A and AAAA records for ports in the zone created and updated automatically, [add a network to the zone](#add-network-to-zone).
5. Optional: if you have connected a network to the zone, [create a port with a domain name](#specify-port-domain-name) — an A record for the port IP address will be created or updated automatically.

## Configuration files \{#config}

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

  <ConfigureProvidersConfig />
</details>

<details>
  <summary>Example file for creating a private zone and records with adding a network to the zone</summary>

  ```hcl
  resource "openstack_networking_network_v2" "network_1" {
    name                  = "network"
    port_security_enabled = "true"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    name       = "subnet"
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.0.0/24"
  }

  resource "selectel_private_dns_zone_v1" "zone_1" {
    region     = openstack_networking_network_v2.network_1.region
    project_id = openstack_networking_network_v2.network_1.tenant_id
    domain     = "example.com."
    ttl        = 10

    records {
      domain = "database.example.com."
      type   = "A"
      ttl    = 10
      values = [
        "192.168.0.2",
      ]
    }

    records {
      domain = "mail.example.com."
      type   = "MX"
      ttl    = 10
      values = [
        "192.168.0.3",
      ]
    }
  }

  resource "openstack_networking_network_v2" "network_1" {
    dns_domain = "example.com."
  }

  resource "openstack_networking_port_v2" "port_1" {
    name       = "port"
    network_id = openstack_networking_network_v2.network_1.id
    dns_name   = "database.example.com."

    fixed_ip {
      subnet_id = openstack_networking_subnet_v2.subnet_1.id
    }
  }
  ```
</details>

<details>
  <summary>Example file for creating a private zone and records without adding a network to the zone</summary>

  ```hcl
  resource "openstack_networking_network_v2" "network_1" {
    name = "network"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    name       = "subnet"
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.0.0/24"
  }

  resource "selectel_private_dns_zone_v1" "zone_1" {
    region     = openstack_networking_network_v2.network_1.region
    project_id = openstack_networking_network_v2.network_1.tenant_id
    domain     = "example.com."
    ttl        = 10

    records {
      domain = "database.example.com."
      type   = "A"
      ttl    = 10
      values = [
        "192.168.0.2",
      ]
    }

    records {
      domain = "mail.example.com."
      type   = "MX"
      ttl    = 10
      values = [
        "192.168.0.3",
      ]
    }
  }
  ```
</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 a subnet \{#create-networks}

<CreateNetworks />

## 3. Create a zone with records \{#create-zone-with-records}

```hcl
data "openstack_networking_network_v2" "network_1" {
  name = "tf_test_network"
}

resource "selectel_private_dns_zone_v1" "zone_1" {
  region     = openstack_networking_network_v2.network_1.region
  project_id = openstack_networking_network_v2.network_1.tenant_id
  domain     = "example.com."
  ttl        = 10

  records {
    domain = "database.example.com."
    type   = "A"
    ttl    = 10
    values = [
      "192.168.0.2",
    ]
  }

  records {
    domain = "mail.example.com."
    type   = "MX"
    ttl    = 10
    values = [
      "192.168.0.3",
    ]
  }
}
```

Where:

* `domain` — the zone domain name, for example, `example.com.`;
* `ttl` — record time to live (TTL) in seconds, for example `10`;
* `records` — a record in the zone:
  * `domain` — fully qualified domain name (FQDN), for example `database.example.com.`;
  * `type` — the record type, for example, `A`;
  * `ttl` — record time to live (TTL) in seconds, for example `10`;
  * `values` — record value, for example `192.168.0.2`.

See the detailed description of the [selectel\_private\_dns\_zone\_v1](/terraform/selectel-provider-reference/resources/private_dns_zone_v1/) resource.

## 4. Optional: add a network to the zone \{#add-network-to-zone}

```hcl
resource "openstack_networking_network_v2" "network_1" {
  dns_domain = "example.com."
}
```

Where `dns_domain` is the zone domain name you specified when [creating the zone and records](#create-zone-with-records), for example, `example.com`.

See the detailed description of the [openstack\_networking\_network\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_network_v2/) resource.

## 5. Optional: specify a port domain name \{#specify-port-domain-name}

```hcl
  resource "openstack_networking_port_v2" "port_1" {
    name       = "port"
    network_id = openstack_networking_network_v2.network_1.id
    dns_name   = "database.example.com."

    fixed_ip {
      subnet_id = openstack_networking_subnet_v2.subnet_1.id
    }
  }
```

Where `dns_name` is the partial domain name (PQDN) of the port, for example, `database`.

See the detailed description of the [openstack\_networking\_port\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_port_v2/) resource.

<Formbricks />
