Azure DNSエイリアスレコード活用ガイド!PaaSのIP変更に自動追従する設定方法
生徒
「Azure(アジュール)でWebアプリを公開しているのですが、サーバーのIPアドレス(アイピーアドレス)が変わってしまうのが心配です。ドメインの設定はどうすれば良いですか?」
先生
「それは重要な視点ですね。AzureのPaaS(パース:サービスとしてのプラットフォーム)を使う場合、標準のAレコード(エーレコード)ではなく、エイリアスレコードを使うのが正解です。」
生徒
「エイリアスレコード?普通のDNS設定とは違うんですか?」
先生
「はい。エイリアスレコードを使えば、Azureのリソース側でIPアドレスが変わっても、DNSが自動的にそれを追いかけてくれるんですよ。具体的な仕組みを詳しく解説しますね!」
1. Azure DNSとエイリアスレコードの基本
Azure DNS(アジュール ディーエヌエス)は、Microsoft(マイクロソフト)が提供するドメイン名システム(Domain Name System)のホスティングサービスです。世界中のインフラを利用して、高速かつ安全にドメイン管理を行うことができます。
通常、Webサイトを公開する際は「Aレコード」を使ってドメイン名とIPアドレスを紐付けます。しかし、クラウド環境ではメンテナンスやプラン変更によって、サーバーのIPアドレスが変動することがあります。ここで活躍するのがエイリアスレコードです。
エイリアスレコードは、特定のAzureリソース(例えば、Public IPアドレスやTraffic Manager、Front Doorなど)を直接指し示すことができる特殊な設定です。これにより、IPアドレスが変更されても、Azure内部で自動的に検知して反映してくれるため、手動で設定を書き換える手間がなくなります。これは運用の自動化において非常に強力な機能です。
2. PaaS環境でIPアドレスが変わる理由
Azure App Service(アジュール アップ サービス)やStatic Web Apps(スタティック ウェブ アップス)などのPaaSを利用する場合、基盤となるインフラはMicrosoftが管理しています。そのため、以下のようなタイミングでIPアドレスが変わる可能性があります。
- リソースの削除と再作成を行ったとき
- デプロイスロットの切り替えを行ったとき
- サービスの価格ティアを大幅に変更したとき
- Azure側の基盤メンテナンスによる再配置
もし従来のAレコードで固定のIPアドレスを指定していた場合、IPが変わった瞬間にWebサイトにアクセスできなくなってしまいます。エイリアスレコードは、この「予期せぬ接続断」を防ぐためのベストプラクティスなのです。
3. エイリアスレコードとCNAMEの違い
「名前を別名に向けるなら、CNAME(シーネーム)レコードでも良いのでは?」と思うかもしれません。しかし、エイリアスレコードにはCNAMEにはない大きなメリットがあります。それはZone Apex(ゾーンアペックス)での利用です。
Zone Apexとは、「example.com」のようにサブドメイン(wwwなど)が付かないルートドメインのことです。DNSの標準的な仕様として、Zone ApexにCNAMEを設定することは禁止されています。しかし、Azure DNSのエイリアスレコードであれば、このルートドメインに対してAzureリソースを紐付けることが可能です。
これにより、Webサイトのトップページをサブドメインなしで運用しつつ、PaaSの恩恵を受けることができるようになります。
4. Azure CLIを使ったエイリアスレコードの作成
まずは、プログラムやスクリプトからAzure DNSを操作する方法を見てみましょう。Azure CLI(アジュール コマンドライン インターフェース)を使うと、簡単にエイリアスレコードを作成できます。
以下のコマンドは、既存のパブリックIPリソースに対してエイリアスレコードを設定する例です。
az network dns record-set a create --resource-group MyResourceGroup --zone-name example.com --name "@" --target-resource /subscriptions/0000-0000/resourceGroups/MyRG/providers/Microsoft.Network/publicIPAddresses/MyPublicIP
Finished: {"fqdn": "example.com.", "id": "...", "name": "@", "type": "Microsoft.Network/dnszones/A"}
このコマンドでは、--target-resourceオプションを使って、直接AzureのリソースIDを指定しています。これがエイリアス設定の肝(きも)となる部分です。
5. PowerShellでの自動追従設定
次に、Windows環境でよく使われるPowerShell(パワーシェル)を用いた設定方法です。自動化スクリプトを組む際に役立ちます。以下のコードは、DNSゾーンを取得し、そこにエイリアスレコードを追加する流れを示しています。
$rs = New-AzDnsRecordConfig -TargetResourceId "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/publicIPAddresses/myip"
New-AzDnsRecordSet -Name "test" -RecordType A -ResourceGroupName "MyRG" -ZoneName "example.com" -Ttl 3600 -DnsRecord $rs
このように、TargetResourceIdを指定することで、指定したIPリソースが持つ現在のIPをAzure DNSが自動的に参照するようになります。設定後は、Azureポータル上でも「エイリアス」として認識されます。
6. Python SDKを利用した高度な管理
システムのバックエンドからDNSを制御したい場合は、Python(パイソン)のSDKを利用するのが便利です。APIを通じて動的にレコードを管理できます。初心者の方でも、ライブラリを使えば複雑なHTTPリクエストを意識せずに実装できます。
from azure.identity import DefaultAzureCredential
from azure.mgmt.dns import DnsManagementClient
client = DnsManagementClient(DefaultAzureCredential(), "your-subscription-id")
record_set_params = {
"ttl": 300,
"target_resource": {
"id": "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/publicIPAddresses/myip"
},
"is_alias": True
}
client.record_sets.create_or_update("MyRG", "example.com", "app", "A", record_set_params)
is_alias: Trueというパラメータが非常に重要です。これにより、単なるAレコードではなく、リソース連動型のエイリアスとして登録されます。
7. TerraformによるInfrastructure as Codeの実現
最近のシステム開発では、Terraform(テラフォーム)などのツールを使ってインフラをコードで管理(Infrastructure as Code)することが一般的です。エイリアスレコードの設定も、以下のように宣言的に記述できます。
resource "azurerm_dns_a_record" "alias_example" {
name = "@"
zone_name = "example.com"
resource_group_name = "MyRG"
ttl = 300
target_resource_id = azurerm_public_ip.example.id
}
コードで管理することで、誰がいつ設定を変更したのかの履歴が残り、人為的なミスを減らすことができます。特に大規模なPaaS構成では、この方法が推奨されます。
8. 設定後の確認方法とトラブルシューティング
エイリアスレコードを設定した後は、正しくIPアドレスが解決されているか確認しましょう。コマンドプロンプトやターミナルでnslookupコマンドを使用します。
nslookup example.com
Server: UnKnown
Address: 192.168.1.1
Non-authoritative answer:
Name: example.com
Address: 20.185.x.x
表示されたIPアドレスが、Azureポータル上で確認できる対象リソースのIPと一致していれば成功です。もし反映されない場合は、TTL(ティーティーエル:キャッシュの保持期間)が経過するのを待つか、リソースIDが正しいか再確認してください。エイリアスレコードはAzure内部の紐付けなので、IDに1文字でも間違いがあると動作しません。
9. エイリアスレコード運用の注意点
非常に便利なエイリアスレコードですが、いくつか注意点があります。まず、エイリアスの対象にできるリソースは、DNSゾーンと同じサブスクリプション内、あるいは許可された範囲のリソースに限られます。また、すべてのAzureサービスがエイリアスに対応しているわけではありません。
主に対応しているのは、以下のリソースです。
- パブリック IP アドレス
- Traffic Manager プロファイル
- Azure Front Door
- 別の Azure DNS レコードセット
これら以外のリソースを紐付けたい場合は、依然としてCNAMEなどの従来の方法を検討する必要があります。しかし、主要なWeb関連リソースは網羅されているため、ほとんどのケースでエイリアスレコードが最適な選択肢となるでしょう。
まとめ
これまでの内容を振り返ると、Azure DNS(アジュール ディーエヌエス)におけるエイリアスレコードの活用は、現代のクラウドネイティブなシステム運用において欠かせない技術であることがわかります。特にPaaS(パース)環境では、インフラの抽象化が進んでいるため、IPアドレス(アイピーアドレス)などの物理的な識別子が変動しやすくなっています。こうした変化に対して、従来の静的なAレコード(エーレコード)で対応しようとすると、手動での更新作業が発生し、ヒューマンエラーやダウンタイムの原因となります。
エイリアスレコードを導入することで、AzureリソースとDNSレコードが論理的に結合され、リソース側の変更が即座にドメイン解決に反映されるようになります。また、Zone Apex(ゾーンアペックス)の問題、つまりルートドメインにCNAME(シーネーム)を定義できないというDNSの古典的な制約を、Azureの独自拡張によってスマートに解決できる点も大きなメリットです。
実務で役立つC#によるリソース情報取得の例
運用の自動化をさらに進めるために、C#(シーシャープ)を使って現在のAzureリソースのIPアドレスや設定状況を確認するプログラムを作成することもあります。例えば、特定のパブリックIPリソースの状態をチェックするコードは以下のようになります。
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Network;
using System;
class AzureResourceChecker
{
public static async System.Threading.Tasks.Task Main(string[] args)
{
var armClient = new ArmClient(new DefaultAzureCredential());
string resourceId = "/subscriptions/your-sub-id/resourceGroups/MyRG/providers/Microsoft.Network/publicIPAddresses/myip";
ResourceIdentifier id = new ResourceIdentifier(resourceId);
PublicIPAddressResource publicIP = armClient.GetPublicIPAddressResource(id);
var response = await publicIP.GetAsync();
if (response.Value != null)
{
Console.WriteLine($"リソース名: {response.Value.Data.Name}");
Console.WriteLine($"現在のIPアドレス: {response.Value.Data.IpAddress}");
}
}
}
上記のプログラムを実行すると、以下のような結果が得られます。エイリアスレコードが正しくこのリソースを指していれば、DNS解決結果もこのIPアドレスと一致するはずです。
リソース名: myip
現在のIPアドレス: 20.185.123.45
データベースでの管理例(SQL)
複数のドメインやプロジェクトを管理している場合、どのドメインがどのAzureリソースに関連付けられているかをデータベースで管理することもあります。以下は、管理用テーブルの構成例と、特定の環境を抽出するSQL(エスキューエル)の例です。
実行前の管理テーブルの状態:
id | domain_name | resource_type | target_resource_name | status
---+------------------+------------------+----------------------+---------
1 | example.com | PublicIP | MyPublicIP-01 | active
2 | test.net | TrafficManager | MyTM-Profile | active
3 | dev.internal | AppService | DevWebApp-Direct | inactive
4 | shop.example.jp | FrontDoor | MyFrontDoor-Prod | active
SELECT domain_name, target_resource_name
FROM dns_management_table
WHERE status = 'active' AND resource_type = 'PublicIP';
実行後の抽出結果:
domain_name | target_resource_name
-----------------+----------------------
example.com | MyPublicIP-01
レガシーシステムとの連携(COBOL)
もし、古いバッチ処理システム(COBOL:コボル)からAzure上のAPIを呼び出す際、接続先のFQDN(完全修飾ドメイン名)を管理するようなケースでも、エイリアスレコードのおかげでプログラム側の修正なしに接続先を維持できます。
IDENTIFICATION DIVISION.
PROGRAM-ID. DNS-CHECK.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TARGET-URL PIC X(50) VALUE "https://example.com/api".
01 RET-CODE PIC 9(02).
PROCEDURE DIVISION.
DISPLAY "Connecting to: " TARGET-URL.
PERFORM CALL-API.
STOP RUN.
結論として、Azure DNSエイリアスレコードは、単なる便利機能ではなく、クラウドにおける「疎結合(そけつごう)」と「高可用性(こうかようせい)」を実現するための必須コンポーネントです。インフラをコードとして扱い(IaC)、自動化された運用フローを構築することで、エンジニアはより本質的な開発業務に集中できるようになります。
生徒
「先生、ありがとうございました!エイリアスレコードを使うと、なぜIPアドレスの変更を気にしなくて済むのか、その仕組みがよくわかりました。特にルートドメインでも使えるというのは驚きです。」
先生
「そうですね。通常、ルートドメインにはCNAMEが使えないという制約がありますが、Azure DNSが内部でうまく橋渡しをしてくれるのがエイリアスレコードの凄いところなんです。Azureのプラットフォームと深く統合されているからこそできる技ですね。」
生徒
「C#(シーシャープ)やPython(パイソン)のコード例を見て、これなら自動化スクリプトにも組み込めそうだと感じました。手動でDNSを書き換えるのは怖いですし、何より面倒ですから……。」
先生
「その通りです!自動化(オートメーション)はミスの削減に直結します。Terraform(テラフォーム)などのツールを使って、インフラ構成図をそのままコードに落とし込む習慣をつけると、将来的に大規模なシステムを運用する際にも役立ちますよ。」
生徒
「はい。まずは自分のテスト環境で、Azure CLI(アジュール シーエルアイ)を使ってエイリアスレコードを作ってみることから始めてみます。nslookup(エヌエスルックアップ)でIPが変わっても追いかけられるか実験してみますね!」
先生
「素晴らしい意気込みですね。実際にIPアドレスが変わる挙動を確認するには、リソースの再作成などを試してみると良いでしょう。Azure DNSの伝播速度も体感できるはずです。頑張ってくださいね!」