Azure PowerShell を使用して Azure DNS のレコードおよびレコード セットを管理する

この記事では、Azure PowerShell を使用して DNS ゾーンの DNS レコードを管理する方法について説明します。 DNS レコードは、クロスプラットフォームの Azure CLI または Azure Portal を使用して管理することもできます。

この記事の例では、Azure PowerShell のインストール、サインイン、DNS ゾーンの作成が既に完了していることを前提としています。

Note

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、「Azure PowerShell のインストール」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

はじめに

Azure DNS で DNS レコードを作成する前に、まず、Azure DNS における DNS レコード セットでの DNS レコードの編成方法を理解する必要があります。

レコード名

Azure DNS では、相対名を使用してレコードを指定します。 "完全修飾" ドメイン名 (FQDN) にはゾーン名が含まれますが、"相対" 名には含まれません。 たとえば、contoso.com ゾーン内の相対レコード名 www によって、完全修飾レコード名 www.contoso.com が示されます。

DNS ゾーンのルート ("頂点") にある DNS レコードを apex (頂点) レコードと言います。 たとえば、DNS ゾーン contoso.com であれば、apex レコードの完全修飾名も contoso.com です (これを "ネイキッド" ドメインと呼ぶことがあります)。 慣例により、apex レコードを表すには相対名として \'\@\' を使用します。

レコードの種類

各 DNS レコードには名前と種類があります。 レコードは、含まれるデータによってさまざまな種類に分けられます。 最も一般的な種類は "A" レコードで、名前が IPv4 アドレスにマップされます。 また、"MX" レコードもよく使用される種類で、名前がメール サーバーにマップされます。

Azure DNS では、一般的な DNS レコードの種類である A、AAAA、CAA、CNAME、MX、NS、PTR、SOA、SRV、TXT をすべてサポートしています。 SPF レコードは TXT レコードを使用して表されることに注意してください。

レコード セット

場合によっては、特定の名前と種類の DNS レコードを複数作成する必要があることもあります。 たとえば、"www.contoso.com" という Web サイトが 2 つの異なる IP アドレスでホストされているとします。 この Web サイトには、IP アドレスごとに異なる A レコードが、合計 2 つ必要になります。 次に、レコード セットの例を示します。

www.contoso.com.        3600    IN    A    134.170.185.46
www.contoso.com.        3600    IN    A    134.170.188.221

Azure DNS は、"レコード セット" を使用してすべての DNS レコードを管理します。 レコード セット ("リソース" レコード セットとも呼ばれます) とは、1 つのゾーン内にある同じ名前、同じ種類の DNS レコードのコレクションです。 ほとんどのレコード セットには、1 つのレコードが含まれています。 ただし、上の例のように複数のレコードが含まれているレコード セットも珍しくはありません。

たとえば、ゾーン "contoso.com" に A レコード "www" が既に作成されているとします。この A レコードは IP アドレス "134.170.185.46" (上記の 1 つ目のレコード) を指しています。 2 つ目のレコードを作成する際は、追加のレコード セットを作成するのではなく、そのレコードを既存のレコード セットに追加します。

SOA レコードと CNAME レコードは例外です。 DNS 標準では、これらのレコードの種類で同じ名前を持つ複数のレコードを作成することが許可されていません。そのため、これらのレコード セットにはレコードを 1 つしか含めることができません。

Azure DNS における DNS レコードの詳細については、「DNS ゾーンとレコード」を参照してください。

新しい DNS レコードの作成

新しいレコード セットを作成するには、既存のレコードとは異なる名前と型を使用する必要があります。 新しいレコードの名前と種類が既存のレコードと同じである場合は、それを既存のレコード セットに追加する必要があります。

新しいレコード セットの "A" レコードの作成

レコード セットは、New-AzDnsRecordSet コマンドレットを使用して作成します。 レコード セットを作成する際には、レコード セット名、ゾーン、Time to Live (TTL)、レコードの種類、作成するレコードを指定する必要があります。

レコード セットにレコードを追加するためのパラメーターは、レコード セットの種類によって異なります。 たとえば、"A" という種類のレコード セットを使う場合、-IPv4Address パラメーターを使って IP アドレスを指定する必要があります。 レコードの種類によっては、別のパラメーターがあります。

下の例では、DNS ゾーン contoso.com に相対名 www を持つレコード セットを作成します。 レコード セットの完全修飾名は www.contoso.com です。 レコードの種類は "A" で、TTL は 3,600 秒です。 レコード セットには、"1.2.3.4" という IP アドレスの 1 つのレコードが含まれています。

New-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -IPv4Address "1.2.3.4") 

ゾーンの "頂点" (この例では "contoso.com") にレコード セットを作成するには、レコード セット名 \"\@\" (引用符を除く) を使います。

New-AzDnsRecordSet -Name "@" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -IPv4Address "1.2.3.4") 

複数のレコードを含むレコード セットを作成する必要がある場合は、まず、ローカル配列を作成してレコードを追加し、次のようにその配列を New-AzDnsRecordSet に渡す必要があります。

$aRecords = @()
$aRecords += New-AzDnsRecordConfig -IPv4Address "1.2.3.4"
$aRecords += New-AzDnsRecordConfig -IPv4Address "2.3.4.5"
New-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName MyResourceGroup -Ttl 3600 -RecordType A -DnsRecords $aRecords

レコード セット メタデータを使用すると、アプリケーション固有のデータを、キーと値のペアとして各レコード セットに関連付けることができます。 次の例は、"dept=finance" と "environment=production" という 2 つのメタデータ エントリを含むレコード セットを作成する方法を示しています。

New-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -IPv4Address "1.2.3.4") -Metadata @{ dept="finance"; environment="production" } 

Azure DNS では、DNS レコードの作成前に DNS 名を予約するためのプレースホルダーとして機能する "空" のレコード セットもサポートされています。 空のレコード セットは、Azure DNS コントロール プレーンには表示されるものの、Azure DNS ネーム サーバーには表示されません。 次の例では、空のレコード セットが作成されます。

New-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords @()

その他の種類のレコードの作成

先ほど "A" レコードの作成方法について詳しく説明しましたが、次の例では、Azure DNS でサポートされているその他の種類のレコードの作成方法を示します。

各ケースで、1 つのレコードを含むレコード セットの作成方法を説明します。 "A" レコードに関する前の例は、メタデータを使って複数のレコードを含むその他の種類のレコード セットを作成したり、空のレコード セットを作成したりする場合に応用できます。

SOA は DNS ゾーンごとに作成および削除されるため、SOA レコード セットの作成例はありません。 SOA レコードを個別に作成または削除することはできません。 ただし、後の例に示すとおり、SOA を変更することはできます。

1 つのレコードを含む AAAA レコード セットの作成

New-AzDnsRecordSet -Name "test-aaaa" -RecordType AAAA -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Ipv6Address "2607:f8b0:4009:1803::1005") 

1 つのレコードを含む CAA レコード セットの作成

New-AzDnsRecordSet -Name "test-caa" -RecordType CAA -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Caaflags 0 -CaaTag "issue" -CaaValue "ca1.contoso.com") 

1 つのレコードを含む CNAME レコード セットの作成

Note

DNS 標準では、ゾーンの頂点 (-Name '@') に CNAME レコードを作成することは許可されていません。また、複数のレコードを含むレコード セットの作成も許可されていません。

詳細については、「CNAME レコード」を参照してください。

New-AzDnsRecordSet -Name "test-cname" -RecordType CNAME -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Cname "www.contoso.com") 

1 つのレコードを含む MX レコード セットの作成

この例では、レコード セット名 \"\@\" を使ってゾーンの頂点 (この場合は "contoso.com" ) に MX レコードを作成します。

New-AzDnsRecordSet -Name "@" -RecordType MX -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Exchange "mail.contoso.com" -Preference 5) 

1 つのレコードを含む NS レコード セットの作成

New-AzDnsRecordSet -Name "test-ns" -RecordType NS -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Nsdname "ns1.contoso.com") 

1 つのレコードを含む PTR レコード セットの作成

ここで "my-arpa-zone.com" は IP 範囲を表す ARPA 逆引き参照ゾーンを表します。 このゾーンの各 PTR レコード セットは、この IP の範囲内の IP アドレスに対応します。 レコード名「10」は、このレコードによって表されるこの IP 範囲内の IP アドレスの最後のオクテットです。

New-AzDnsRecordSet -Name 10 -RecordType PTR -ZoneName "my-arpa-zone.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Ptrdname "myservice.contoso.com") 

1 つのレコードを含む SRV レコード セットの作成

SRV レコード セットを作成するときは、レコード セット名に _service_protocol を指定します。 ゾーンの頂点で SRV レコード セットを作成するときは、レコード セット名に "@" を含める必要はありません。

New-AzDnsRecordSet -Name "_sip._tls" -RecordType SRV -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Priority 0 -Weight 5 -Port 8080 -Target "sip.contoso.com") 

1 つのレコードを含む TXT レコード セットの作成

次の例は、TXT レコードを作成する方法を示しています。 TXT レコードでサポートされている文字列の最大長の詳細については、TXT レコードに関するセクションを参照してください。

New-AzDnsRecordSet -Name "test-txt" -RecordType TXT -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -Ttl 3600 -DnsRecords (New-AzDnsRecordConfig -Value "This is a TXT record") 

レコード セットの取得

既存のレコード セットを取得するには、 Get-AzDnsRecordSetを使用します。 このコマンドレットは、Azure DNS のレコード セットを表すローカル オブジェクトを返します。

New-AzDnsRecordSet と同様に、レコード セット名は、ゾーン名を除いた "相対" 名にする必要があります。 レコードの種類のほか、レコード セットを含むゾーンも指定する必要があります。

次の例は、レコード セットを取得する方法を示しています。 この例では、ゾーンは -ZoneName および -ResourceGroupName パラメーターを使用して指定されています。

$rs = Get-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

そうではなく、-Zone パラメーターを使って渡されるゾーン オブジェクトを使ってゾーンを指定する方法もあります。

$zone = Get-AzDnsZone -Name "contoso.com" -ResourceGroupName "MyResourceGroup"
$rs = Get-AzDnsRecordSet -Name "www" -RecordType A -Zone $zone

レコード セットの一覧を表示する

-Name または -RecordType パラメーターのいずれかまたは両方を省略することにより、Get-AzDnsZone を使用してゾーン内のレコード セットを一覧表示することもできます。

次の例は、ゾーン内のすべてのレコード セットを返します。

$recordsets = Get-AzDnsRecordSet -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

次の例は、レコードの種類を指定し、レコード セット名は省略して、特定の種類のレコード セットをすべて取得する方法を示しています。

$recordsets = Get-AzDnsRecordSet -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

レコードの種類を問わず、特定の名前のレコード セットをすべて取得するには、すべてのレコード セットを取得したうえで、結果をフィルター処理する必要があります。

$recordsets = Get-AzDnsRecordSet -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" | where {$_.Name.Equals("www")}

上記のどの例でも、ゾーンを指定するには、例に示した -ZoneName パラメーターと -ResourceGroupName パラメーターを使用するか、ゾーン オブジェクトを指定します。

$zone = Get-AzDnsZone -Name "contoso.com" -ResourceGroupName "MyResourceGroup"
$recordsets = Get-AzDnsRecordSet -Zone $zone

既存のレコード セットへのレコードの追加

既存のレコード セットにレコードを追加するには、次の次の 3 つの手順を実行します。

  1. 既存のレコード セットの取得

    $rs = Get-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A
    
  2. ローカル レコード セットに新しいレコードを追加します。

    Add-AzDnsRecordConfig -RecordSet $rs -Ipv4Address "5.6.7.8"
    
  3. Azure DNS サービスに反映されるように変更を更新します。

    Set-AzDnsRecordSet -RecordSet $rs
    

Set-AzDnsRecordSet を使用すると、Azure DNS 内の既存のレコード セット (およびそれに含まれるすべてのレコード) が、指定したレコード セットに "置き換えられます"。 同時変更が上書きされないように ETag チェックが使用されます。 オプションの -Overwrite スイッチを使用すると、これらのチェックを抑制できます。

一連の操作は "パイプ" することもできます。つまり、レコード セット オブジェクトをパラメーターとして渡すのではなく、パイプを使用して渡すことができます。

Get-AzDnsRecordSet -Name "www" –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A | Add-AzDnsRecordConfig -Ipv4Address "5.6.7.8" | Set-AzDnsRecordSet

上記の例は、種類が "A" の既存のレコード セットに "A" レコードを追加する方法を示しています。 同様の操作は、他の種類のレコード セットにレコードを追加するときにも使用されます。そのときは、Add-AzDnsRecordConfig-Ipv4Address パラメーターをレコードの種類それぞれに固有の他のパラメーターに置き換えます。 レコードの種類それぞれに対応したパラメーターは、上記のその他のレコードの種類の例に関するセクションに示したとおり、New-AzDnsRecordConfig コマンドレットと同じです。

種類が "CNAME" または "SOA" のレコード セットに複数のレコードを含めることはできません。 この制約は DNS 標準によるものです。 Azure DNS の制限ではありません。

既存のレコード セットからのレコードの削除

レコード セットからレコードを削除するプロセスは、既存のレコード セットにレコードを追加するプロセスに似ています。

  1. 既存のレコード セットの取得

    $rs = Get-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A
    
  2. ローカル レコード セット オブジェクトからレコードを削除します。 削除するレコードは、すべてのパラメーターにおいて既存のレコードと正確に一致する必要があります。

    Remove-AzDnsRecordConfig -RecordSet $rs -Ipv4Address "5.6.7.8"
    
  3. Azure DNS サービスに変更をコミットバックします。 同時変更の ETag チェックを抑制するには、オプションの -Overwrite スイッチを使用します。

    Set-AzDnsRecordSet -RecordSet $Rs
    

上記の操作でレコード セットから最後のレコードを削除しても、レコード セットは削除されず、空のレコード セットが残されます。 レコード セットを完全に削除するには、「レコード セットの削除」を参照してください。

レコードをレコード セットに追加する操作と同様に、レコード セットを削除する一連の操作もパイプすることがことができます。

Get-AzDnsRecordSet -Name www –ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" -RecordType A | Remove-AzDnsRecordConfig -Ipv4Address "5.6.7.8" | Set-AzDnsRecordSet

レコードの種類に固有の適切なパラメーターを Remove-AzDnsRecordSet に渡すことで、さまざまなレコードの種類がサポートされます。 レコードの種類それぞれに対応したパラメーターは、上記のその他のレコードの種類の例に関するセクションに示したとおり、New-AzDnsRecordConfig コマンドレットと同じです。

既存のレコード セットの変更

既存のレコード セットを変更する手順は、レコード セットのレコードを追加または削除するときの手順と似ています。

  1. Get-AzDnsRecordSetを使用して既存のレコード セットを取得します。
  2. 次の方法で、ローカル レコード セット オブジェクトを変更します。
    • レコードを追加または削除する
    • 既存のレコードのパラメーターを変更する
    • レコード セット メタデータと Time to Live (TTL) を変更する
  3. Set-AzDnsRecordSet コマンドレットを使用して変更をコミットします。 これにより、Azure DNS 内の既存のレコード セットは、指定したレコード セットに "置き換えられます"。

Set-AzDnsRecordSet コマンドの使用時は、同時変更が上書きされないように ETag検査が使用されます。 オプションの -Overwrite スイッチを使用すると、これらのチェックを抑制できます。

既存のレコード セット内のレコードを更新するには

この例では、既存の "A" レコードの IP アドレスを変更します。

$rs = Get-AzDnsRecordSet -name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
$rs.Records[0].Ipv4Address = "9.8.7.6"
Set-AzDnsRecordSet -RecordSet $rs

SOA レコードを変更するには

ゾーンの頂点 (-Name "@"、引用符を含む) に自動的に作成された SOA レコード セットのレコードを追加または削除することはできません。 ただし、("ホスト" を除く) SOA レコードおよびレコード セットの TTL 内のパラメーターを変更することはできます。

次の例では、SOA レコードの Email プロパティを変更する方法を示します。

$rs = Get-AzDnsRecordSet -Name "@" -RecordType SOA -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
$rs.Records[0].Email = "admin.contoso.com"
Set-AzDnsRecordSet -RecordSet $rs

ゾーンの頂点にある NS レコードを変更するには

ゾーンの頂点にある NS レコード セットは各 DNS ゾーンで自動的に作成されます。 ゾーンに割り当てられている Azure DNS ネーム サーバーの名前が含まれています。

複数の DNS プロバイダーによる共同ホスト ドメインをサポートする目的で、この NS レコード セットにネーム サーバーを追加できます。 このレコード セットの TTL とメタデータを変更することもできます。 ただし、あらかじめ入力されている Azure DNS ネーム サーバーを削除または変更することはできません。

この制限は、ゾーンの頂点にある NS レコード セットにのみ適用されます。 (子ゾーンの委任に使用される) ゾーンの他の NS レコード セットは制約なしで変更できます。

次の例は、ゾーンの頂点にある NS レコード セットに別のネーム サーバーを追加する方法を示しています。

$rs = Get-AzDnsRecordSet -Name "@" -RecordType NS -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
Add-AzDnsRecordConfig -RecordSet $rs -Nsdname ns1.myotherdnsprovider.com
Set-AzDnsRecordSet -RecordSet $rs

レコード セット メタデータを変更するには

レコード セット メタデータを使用すると、アプリケーション固有のデータを、キーと値のペアとして各レコード セットに関連付けることができます。

次の例は、既存のレコード セットのメタデータを変更する方法を示しています。

# Get the record set
$rs = Get-AzDnsRecordSet -Name www -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

# Add 'dept=finance' name-value pair
$rs.Metadata.Add('dept', 'finance') 

# Remove metadata item named 'environment'
$rs.Metadata.Remove('environment')  

# Commit changes
Set-AzDnsRecordSet -RecordSet $rs

レコード セットの削除

レコード セットは Remove-AzDnsRecordSet コマンドレットで削除できます。 レコード セットを削除すると、そのレコード セット内のレコードもすべて削除されます。

Note

ゾーンの頂点 (-Name '@') の SOA および NS レコード セットを削除することはできません。 Azure DNS はこれらをゾーンの作成時に自動的に作成し、ゾーンの削除時に自動的に削除します。

次の例は、レコード セットを削除する方法を示しています。 この例では、レコード セット名、レコード セットの種類、ゾーン名、およびリソース グループはそれぞれ明示的に指定しています。

Remove-AzDnsRecordSet -Name "www" -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"

そうではなく、レコード セットは、オブジェクトを使用して指定したゾーンのほか、名前と種類によって指定することもできます。

$zone = Get-AzDnsZone -Name "contoso.com" -ResourceGroupName "MyResourceGroup"
Remove-AzDnsRecordSet -Name "www" -RecordType A -Zone $zone

3 つ目の方法として、レコード セット オブジェクトを使用してレコード セット自体を指定することもできます。

$rs = Get-AzDnsRecordSet -Name www -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup"
Remove-AzDnsRecordSet -RecordSet $rs

レコード セット オブジェクトを使用して削除対象のレコード セットを指定した場合、ETag チェックによって同時変更の削除が防止されます。 オプションの -Overwrite スイッチを使用すると、これらのチェックを抑制できます。

レコード セット オブジェクトは、パラメーターとして渡す代わりに、パイプすることもできます。

Get-AzDnsRecordSet -Name www -RecordType A -ZoneName "contoso.com" -ResourceGroupName "MyResourceGroup" | Remove-AzDnsRecordSet

確認のプロンプト

New-AzDnsRecordSetSet-AzDnsRecordSet、および Remove-AzDnsRecordSet コマンドレットは、いずれも確認のプロンプトをサポートしています。

各コマンドレットは、$ConfirmPreference PowerShell 設定変数の値が Medium 以下である場合に、確認のプロンプトを表示します。 $ConfirmPreference の既定値は High であるため、既定の PowerShell 設定を使用しているときはこれらのプロンプトは表示されません。

現在の $ConfirmPreference 設定は -Confirm パラメーターを使用してオーバーライドできます。 -Confirm または -Confirm:$True を指定した場合は、コマンドレットによって実行前に確認のプロンプトが表示されます。 -Confirm:$False を指定した場合は、コマンドレットによって確認のプロンプトが表示されません。

-Confirm$ConfirmPreference の詳細については、「About Preference Variables (設定変数について)」を参照してください。

次のステップ

Azure DNS におけるゾーンとレコードについて確認します。
Azure DNS の使用時にゾーンとレコードを保護する方法について確認します。
Azure DNS PowerShell のリファレンス ドキュメントを確認します。