💬
DNS Recordについて
DNSレコードの種類とその使用方法について詳しく説明します。
1. Aレコード(Address Record)
ドメイン名をIPv4アドレスに直接マッピングします。
# 基本的なAレコード
resource "google_dns_record_set" "website" {
name = "www.example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "A"
ttl = 300
rrdatas = ["203.0.113.10"]
}
# 複数IPアドレスの設定(ラウンドロビン)
resource "google_dns_record_set" "load_balanced" {
name = "api.example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "A"
ttl = 300
rrdatas = [
"203.0.113.10",
"203.0.113.11",
"203.0.113.12"
]
}
# Cloud Load Balancer用のAレコード
resource "google_dns_record_set" "lb" {
name = "lb.example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "A"
ttl = 300
rrdatas = [google_compute_global_address.lb_ip.address]
}
使用例:
# DNSルックアップの確認
dig www.example.com A
# 名前解決の確認
nslookup www.example.com
2. CNAMEレコード(Canonical Name Record)
あるドメイン名を別のドメイン名にエイリアスとして設定します。
# 基本的なCNAMEレコード
resource "google_dns_record_set" "blog" {
name = "blog.example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "CNAME"
ttl = 300
rrdatas = ["www.example.com."]
}
# 外部サービス用のCNAME
resource "google_dns_record_set" "cdn" {
name = "cdn.example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "CNAME"
ttl = 300
rrdatas = ["example.cloudfront.net."]
}
# サブドメインのリダイレクト
resource "google_dns_record_set" "redirect" {
name = "old.example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "CNAME"
ttl = 300
rrdatas = ["new.example.com."]
}
注意点:
- ルートドメイン(apex domain)にはCNAMEを設定できない
- 一つのホスト名に対して、CNAMEと他のレコードタイプを混在させない
3. MXレコード(Mail Exchange Record)
メールサーバーの設定を指定します。
# Google Workspaceのメール設定
resource "google_dns_record_set" "gmail" {
name = "example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "MX"
ttl = 3600
rrdatas = [
"1 aspmx.l.google.com.",
"5 alt1.aspmx.l.google.com.",
"5 alt2.aspmx.l.google.com.",
"10 alt3.aspmx.l.google.com.",
"10 alt4.aspmx.l.google.com."
]
}
# カスタムメールサーバー設定
resource "google_dns_record_set" "custom_mail" {
name = "example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "MX"
ttl = 3600
rrdatas = [
"10 mail1.example.com.",
"20 mail2.example.com."
]
}
# 関連するSPFレコード
resource "google_dns_record_set" "spf" {
name = "example.com."
managed_zone = google_dns_managed_zone.public_zone.name
type = "TXT"
ttl = 3600
rrdatas = ["\"v=spf1 include:_spf.google.com ~all\""]
}
4. Internal DNS Records(内部DNSレコード)
プライベートゾーンで使用する内部向けDNSレコード。
# プライベートDNSゾーンの作成
resource "google_dns_managed_zone" "private" {
name = "internal-zone"
dns_name = "internal.example."
visibility = "private"
private_visibility_config {
networks {
network_url = google_compute_network.vpc.id
}
}
}
# 内部サービスのAレコード
resource "google_dns_record_set" "internal_services" {
for_each = {
api = "10.0.1.10"
redis = "10.0.1.11"
mysql = "10.0.1.12"
kafka = "10.0.1.13"
}
name = "${each.key}.internal.example."
managed_zone = google_dns_managed_zone.private.name
type = "A"
ttl = 300
rrdatas = [each.value]
}
# 内部ロードバランサー用のAレコード
resource "google_dns_record_set" "internal_lb" {
name = "lb.internal.example."
managed_zone = google_dns_managed_zone.private.name
type = "A"
ttl = 300
rrdatas = [google_compute_address.internal_lb.address]
}
# 内部サービスのCNAME
resource "google_dns_record_set" "service_alias" {
name = "service.internal.example."
managed_zone = google_dns_managed_zone.private.name
type = "CNAME"
ttl = 300
rrdatas = ["api.internal.example."]
}
5. レコードの組み合わせ例
# Webサービスの完全な設定例
resource "google_dns_managed_zone" "main" {
name = "main-zone"
dns_name = "example.com."
description = "Main public zone"
}
# Webサイト
resource "google_dns_record_set" "website" {
name = "www.example.com."
managed_zone = google_dns_managed_zone.main.name
type = "A"
ttl = 300
rrdatas = [google_compute_global_address.lb_ip.address]
}
# メール設定
resource "google_dns_record_set" "mail" {
name = "example.com."
managed_zone = google_dns_managed_zone.main.name
type = "MX"
ttl = 3600
rrdatas = ["10 mail.example.com."]
}
# サブドメイン
resource "google_dns_record_set" "subdomain" {
name = "blog.example.com."
managed_zone = google_dns_managed_zone.main.name
type = "CNAME"
ttl = 300
rrdatas = ["ghs.google.com."]
}
6. 検証とトラブルシューティング
# レコードの確認
dig @8.8.8.8 www.example.com A
dig @8.8.8.8 example.com MX
dig @8.8.8.8 blog.example.com CNAME
# 内部DNSの確認(GCEインスタンスから)
nslookup api.internal.example
nslookup service.internal.example
# DNSキャッシュのクリア(Linux)
systemd-resolve --flush-caches
# Windows DNSキャッシュのクリア
ipconfig /flushdns
これらのDNSレコードを適切に組み合わせることで、効果的なドメイン管理が可能になります。
Discussion