Young Leaves

Bicep でAzure パブリックDNS ゾーンとレコードを作成する

Azure のパブリックDNS ゾーンやレコードBicep で作成して管理したいことはありませんか?今回はパブリックDNS ゾーンもBicep で作成したい人に向けて、Azure パブリックDNS ゾーンといくつかのレコードタイプをBicep で作成します。

実施環境

Azure CLI

2.62.0

Bicep CLI

0.29.47

前提条件

  • Azure CLI の実行環境があること
  • Bicep CLI がインストール済みであること

Bicep でのAzure パブリックDNS ゾーンについて

Bicep で Azure パブリック DNS ゾーンを作成するには、Microsoft.Network/dnsZones を使用します。パブリック DNS ゾーンで各種レコードを作成する場合は、Microsoft.Network/dnsZones/<作成したいレコードタイプ> を指定します。パブリック DNS ゾーンには、ドメイン名を示す name とリージョンを示す location が必須項目です。また、パブリック DNS でリージョンを指定する場合、リージョンは global を指定します。

Bicep で DNS レコードを記述する場合、レコード名、TTL、およびレコードタイプに応じた設定項目が必要です。例えば、A レコードを追加する場合は ipv4Address が必要です。少数の DNS レコードであればパラメーターファイルに記載するのも良いですが、レコード数が多くなるとパラメーターファイルが肥大化し、可視性が低下します。本記事では、DNS レコードをレコードタイプごとの JSON ファイルに分割します。定義ファイル内では loadJsonContent 関数で変数として読み込み、読み込んだレコードをループで追加することにより、複数の DNS レコードを追加します。

フォルダ構成

パブリックDNS ゾーン作成に使用する各種ファイルのフォルダ構成は以下の通りです。Bicep テンプレートファイルとパラメーターファイル、レコード用JSON ファイルを準備します。レコード用JSON ファイルは今回作成するレコード分作成していますが、不要なレコードがある場合には必要な分だけ作成してください。

.
├── main.bicep
├── parameters
│   └── main.bicepparam
└── records
    ├── Arecords.json
    ├── CNAMErecords.json
    ├── MXrecords.json
    ├── PTRrecords.json
    └── TXTrecords.json

デプロイ用のリソースグループ作成

初めにデプロイ用のリソースグループを作成します。リソースグループ名は rg-pubdnstest、リージョンは東日本リージョンで作成します。

# デプロイ用のリソースグループを作成する
az group create --name rg-pubdnstest --location japaneast

DNS レコード用JSON ファイルを作成

リソースグループ作成後、DNS レコード用JSON ファイルを作成します。今回はBicep の動作を確認する目的で複数のJSON ファイルを作成しますが、実際に作成するときは必要なJSON ファイルのみ作成してください。

[
  {
    "name": "www",
    "ttl": 600,
    "value": [
      {
        "ipv4Address": "1.2.3.4"
      }
    ]
  },
  {
    "name": "stg",
    "ttl": 600,
    "value": [
      {
        "ipv4Address": "2.3.4.5"
      },
      {
        "ipv4Address": "3.4.5.6"
      }
    ]
  }
]
{
  "name": "app",
  "ttl": 600,
  "value":  {
    "cname": "test.websites.net"
  }
}
[
  {
    "name": "@",
    "ttl": 600,
    "value": [
      {
        "exchange": "mail01.kdkwakaba.work",
        "preference": 10
      },
      {
        "exchange": "mail02.kdkwakaba.work",
        "preference": 20
      }
    ]
  }
]
[
  {
    "name": "4.3.2.1.in-addr.arpa",
    "ttl": 600,
    "value": [
      {
        "ptrdname": "www"
      }
    ]
  },
  {
    "name": "5.4.3.2.in-addr.arpa",
    "ttl": 600,
    "value": [
      {
        "ptrdname": "stg"
      }
    ]
  }
]
[
  {
    "name": "_test",
    "ttl": 600,
    "txt": [
      {
        "value": [
          "hogehoge"
        ]
      },
      {
        "value": [
          "fugafuga"
        ]
      }
    ]
  },
  {
    "name": "_foobar",
    "ttl": 600,
    "txt": [
      {
        "value": [
          "foobar"
        ]
      }
    ]
  }
]

Bicep パラメーターファイルを作成

DNS レコード用JSON ファイルを作成後、Bicep パラメーターファイルを作成します。レコード名は kdkwakaba.work で作成しますが、作成したいドメイン名を指定してください。今回はドメイン名のみ指定していますが、各環境でetag を利用する場合はパラメーターファイルに記載します。

using '../main.bicep'

@description('パブリックDNSゾーン名')
param zoneName = 'kdkwakaba.work'

Bicep テンプレートファイルを作成

Bicep パラメーターファイルを作成後、Bicep テンプレートファイルを作成します。今回は各処理をわかりやすくするためコメントを入れています。

// パラメーターファイルから値を取得する
@description('パブリックDNSゾーン名')
param zoneName string

@description('パブリックDNSゾーンのリージョン。global固定のためデフォルト値でglobalを指定')
param location string = 'global'

// JSONファイルからレコードを取得し変数に格納
var ARecordData = loadJsonContent('./records/Arecords.json')
var ARecordCount = length(ARecordData)
var PTRRecordData = loadJsonContent('./records/PTRrecords.json')
var PTRRecordCount = length(PTRRecordData)
var CNAMERecordData = loadJsonContent('./records/CNAMErecords.json')
var MXRecordData = loadJsonContent('./records/MXrecords.json')
var MXRecordCount = length(MXRecordData)
var TXTRecordData = loadJsonContent('./records/TXTrecords.json')
var TXTRecordCount = length(TXTRecordData)

// パブリックDNSゾーンを作成する
resource publicZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = {
  name: zoneName
  location: location
}

// パブリックDNSゾーンにAレコードを作成する
resource publicARecord 'Microsoft.Network/dnsZones/A@2023-07-01-preview' = [for i in range(0, ARecordCount): {
  parent: publicZone
  name: ARecordData[i].name
  properties: {
    TTL: ARecordData[i].ttl
    ARecords: ARecordData[i].value
  }
}]

// パブリックDNSゾーンにPTRレコードを作成する
resource publicPTRRecord 'Microsoft.Network/dnsZones/PTR@2023-07-01-preview' = [for i in range(0, PTRRecordCount): {
  parent: publicZone
  name: PTRRecordData[i].name
  properties: {
    TTL: PTRRecordData[i].ttl
    PTRRecords: PTRRecordData[i].value
  }
}]

// パブリックDNSゾーンにCNAMEレコードを作成する
// CNAMEを一つしかないためループを使用しない
resource publicCNAMERecord 'Microsoft.Network/dnsZones/CNAME@2023-07-01-preview' = {
  parent: publicZone
  name: CNAMERecordData.name
  properties: {
    TTL: CNAMERecordData.ttl
    CNAMERecord: CNAMERecordData.value
  }
}

// パブリックDNSゾーンにMXレコードを作成する
resource publicMXRecord 'Microsoft.Network/dnsZones/MX@2023-07-01-preview' = [for i in range(0, MXRecordCount): {
  parent: publicZone
  name: MXRecordData[i].name
  properties: {
    TTL: MXRecordData[i].ttl
    MXRecords: MXRecordData[i].value
  }
}]

// パブリックDNSゾーンにTXTレコードを作成する
resource publicTXTRecord 'Microsoft.Network/dnsZones/TXT@2023-07-01-preview' = [for i in range(0, TXTRecordCount): {
  parent: publicZone
  name: TXTRecordData[i].name
  properties: {
    TTL: TXTRecordData[i].ttl
    TXTRecords: TXTRecordData[i].txt
  }
}]

Bicep テンプレートファイルのデプロイ、確認

各種ファイルの準備後、作成予定のAzure リソースを確認します。想定したリソース、設定を確認後、Azure 上にパブリックDNS ゾーンおよびレコードをデプロイします。

# Azure上にデプロイするリソースを確認
az deployment group what-if --resource-group rg-pubdnstest --parameters parameters\main.bicepparam

# Azure上にパブリックDNSをデプロイ
az deployment group create --resource-group rg-pubdnstest --parameters parameters\main.bicepparam

デプロイ後、想定されたAzure リソースが作成されたことを確認します。画像は参考として一部のレコードのみ表示しています。

Azure リソースのクリーンアップ

動作確認後、Bicep でデプロイしたリソースを削除するためリソースグループを削除します。

# リソースグループを削除する
az group delete --name rg-pubdnstest

まとめ

  • Bicep でAzure パブリックDNS 、レコードを作成するには Microsoft.Network/dnsZones を利用する
  • DNS レコードが多い場合、レコードごとにファイルを分割し肥大化を避ける
  • 複数のDNS レコードを作成する場合、ループを利用して作成する

参考資料