使用 Azure PowerShell 管理 Azure DNS 中的 DNS 記錄和記錄集

本文說明如何使用 Azure PowerShell 來管理 DNS 區域的 DNS 記錄。 也可以使用跨平台 Azure CLIAzure 入口網站來管理 DNS 記錄。

此文章中的範例假設您已安裝 Azure PowerShell、登入,並建立 DNS 區域

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

簡介

在 Azure DNS 中建立 DNS 記錄前,您需要先了解 Azure DNS 如何將 DNS 記錄組織成 DNS 記錄集。

記錄名稱

在 Azure DNS 中,記錄是使用相對名稱來指定。 「完整」網域名稱 (FQDN) 包含區域名稱,而「相對」名稱不含區域名稱。 例如,區域 contoso.com 中的相對記錄名稱 www 產生完整記錄名稱 www.contoso.com

「頂點」記錄是 DNS 區域根目錄 (或「頂點」) 的 DNS 記錄。 例如在 DNS 區域 contoso.com 中,頂點記錄也具有完整名稱 contoso.com (有時稱為「裸」網域)。 依照慣例,相對名稱 \'\@\' 用來代表頂點記錄。

記錄類型

每一筆 DNS 記錄都有名稱和類型。 記錄根據所包含的資料而組織成各種類型。 最常見的類型為 'A' 記錄,可將名稱對應到 IPv4 位址。 另一個一般類型為 'MX' 記錄,可將名稱對應到郵件伺服器。

Azure DNS 支援所有常見的 DNS 記錄類型:A、AAAA、CAA、CNAME、MX、NS、PTR、SOA、SRV 和 TXT。 請注意,SPF 記錄是使用 TXT 記錄表示

記錄集

有時候,您需要以指定的名稱和類型建立多筆 DNS 記錄。 例如,假設 'www.contoso.com' 網站裝載於兩個不同的 IP 位址。 網站需要兩筆不同的 A 記錄,每個 IP 位址各一筆。 以下是記錄集的範例:

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

Azure DNS 使用「記錄集」來管理所有 DNS 記錄。 記錄集 (也稱為「資源」記錄集) 是指一個區域中,具有相同名稱和相同類型的 DNS 記錄集合。 大部分的記錄集只包含單一記錄。 不過,像以上的記錄集包含多筆記錄的例子也屢見不鮮。

例如,假設您已經在區域 'contoso.com' 中建立了 A 記錄 'www',指向 IP 位址 '134.170.185.46' (上述第一項記錄)。 若要建立第二筆記錄,您會將該記錄新增至現有的記錄集,而非建立額外的記錄集。

SOA 和 CNAME 記錄類型是例外狀況。 對於這些類型,DNS 標準不允許具有相同名稱的多筆記錄,因此這些記錄集只能包含單一記錄。

如需在 Azure DNS 的 DNS 記錄的詳細資訊,請參閱 DNS 區域與記錄

建立新的 DNS 區域

若要建立新的記錄集,其名稱和類型必須與任何現有的記錄不同。 如果新記錄的名稱和類型與現有記錄相同,則必須新增至現有的記錄集

在新的記錄集中建立 'A' 記錄

您可以使用 New-AzDnsRecordSet Cmdlet 來建立記錄集。 建立記錄集時,您必須指定記錄集名稱、區域、存留時間 (TTL) 和記錄類型,與要建立的記錄。

將記錄加入至記錄集的參數,根據記錄集的類型而所有不同。 例如,使用 'A' 類型的記錄集時,您需要使用參數 -IPv4Address 來指定 IP 位址。 不同的記錄類型會有額外的參數。

下列範例在 DNS 區域 contoso.com 建立具有相對名稱 www 的記錄集。 記錄集的完整名稱為 www.contoso.com。 記錄類型為 'A',且 TTL 為 3600 秒。 此記錄集都會包含一筆記錄,其中 IP 位址為 '1.2.3.4'。

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') 的記錄集。

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 也支援 'empty' 記錄集,此可作為建立 DNS 記錄前保留 DNS 名稱的預留位置。 空記錄集會顯示在 Azure DNS 控制面板中,但不會出現在 Azure DNS 名稱伺服器上。 下列範例會建立空記錄集:

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

建立其他類型的記錄

參閱如何建立 'A' 記錄的詳細資訊後,下列範例會示範如何建立 Azure DNS 所支援其他記錄類型的記錄。

在每個案例中,我們會說明如何建立包含單一記錄的記錄集。 可將 'A' 記錄的先前範例加以調整,即可建立含多個記錄的其他類型記錄集、具中繼資料的其他類型記錄集,或建立空的記錄集。

沒有關於建立 SOA 記錄集的範例,因為 SOA 是隨著各 DNS 區域一起建立和刪除。 無法另行建立或刪除 SOA 記錄。 但可以修改 SOA,如稍後範例所示。

建立含有單一記錄的 AAAA 記錄集

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

建立含有單一記錄的 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") 

建立含有單一記錄的 CNAME 記錄集

注意

DNS 標準在區域頂點不允許 CNAME 記錄 (-Name '@'),也不允許包含一個記錄以上的記錄集。

如需詳細資訊,請參閱 CNAME 記錄

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

建立含有單一記錄的 MX 記錄集

在此範例中,我們使用記錄集名稱 \'\@\' 在區域頂點建立 MX 記錄 (在此案例中為 'contoso.com')。

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

建立含有單一記錄的 NS 記錄集

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

建立含有單一記錄的 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") 

建立含有單一記錄的 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") 

建立含有單一記錄的 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。 此 cmdlet 會傳回 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

列出記錄集

您也可以使用 Get-AzDnsZone 並省略 -Name-RecordType 參數,或兩者都省略,以列出區域的記錄集。

下列範例會傳回區域中的所有記錄集︰

$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

將記錄新增至現有的記錄集

若要將記錄新增至現有的記錄集,請遵循下列三個步驟︰

  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 Cmdlet 相同,如以上其他記錄類型範例所示。

類型 '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 服務。 使用選擇性 -Overwrite 參數來停止對並行變更的 Etag 檢查

    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 Cmdlet 相同,如以上其他記錄類型範例所示。

修改現有記錄集

修改現有記錄集的步驟,與從記錄集新增或移除記錄時所採取的步驟相類似:

  1. 使用 Get-AzDnsRecordSet擷取現有的記錄集。
  2. 透過下列方式修改本機記錄集︰
    • 新增或移除記錄
    • 變更現有記錄的參數
    • 變更記錄集中繼資料和存留時間 (TTL)
  3. 使用 Set-AzDnsRecordSet Cmdlet 來認可您所做的變更。 這會以指定的記錄集取代 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 記錄

系統會自動使用每個 DNS 區域在區域頂點建立 NS 記錄集。 此記錄集包含指派給區域的 Azure DNS 名稱伺服器的名稱。

您可以將更多名稱伺服器新增至此 NS 記錄集,以支援由多個 DNS 提供者來共同代管網域。 您也可修改此記錄集的 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 Cmdlet 來刪除記錄集。 刪除記錄集時,也會刪除記錄集內的所有記錄。

注意

您無法在區域頂點 (-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

至於第三個選項,記錄集本身即可透過記錄集物件進行指定︰

$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-AzDnsRecordSetRemove-AzDnsRecordSet cmdlets 皆支援確認提示。

如果 $ConfirmPreferencePowerShell 喜好設定變數的值為 Medium 或更低,則每個 cmdlet 會提示確認。 因為 $ConfirmPreference 的預設值為 High,使用預設 PowerShell 設定時不會出現這些提示。

您可以使用 -Confirm 參數覆寫目前 $ConfirmPreference 設定。 如果您指定 -Confirm-Confirm:$True,此 cmdlet 在執行前會提示您進行確認。 如果指定 -Confirm:$False,此 Cmdlet 不會提示您進行確認。

如需 -Confirm$ConfirmPreference 的詳細資訊,請參閱有關喜好設定變數

下一步

深入了解 Azure DNS 中的區域和記錄
了解使用 Azure DNS 時,如何保護區域和記錄
檢閱 Azure DNS PowerShell 參考文件