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 レコードを作成する場合、ループを利用して作成する