💬

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