VPC & ネットワーキング

VPC DNS設定 完全ガイド

enableDnsSupport と enableDnsHostnames — たった2つの設定が、VPCのDNS機能すべてを左右する

enableDnsSupport = 電話帳サービス
AWSの内線電話帳(DNS resolver 169.254.169.253)を使うかどうか。デフォルトtrue。基本的にOFFにしない。
enableDnsHostnames = 表札の自動配布
パブリックIPを持つインスタンスに、自動的にDNS名(表札)を割り当てるか。デフォルトVPCはtrue、カスタムVPCはfalse。
両方true = Route 53連携の必須条件
プライベートホストゾーンを使うには、enableDnsSupport + enableDnsHostnames の両方をtrueにする必要がある。

たとえ話:VPCは「マンション」、DNSは「管理人室の電話帳」

AWS VPCを大きなマンションだと想像してみましょう。各部屋(EC2インスタンス)には住人(アプリケーション)がいて、お互いに連絡を取り合う必要があります。

現実世界とAWSの対応表

マンションの世界 AWSの世界 ポイント
マンション全体 VPC(Virtual Private Cloud) ネットワークの境界
各部屋 EC2インスタンス 個別のサーバーリソース
管理人室の内線電話帳 AmazonProvidedDNS(169.254.169.253) 名前 → IPの変換サービス
電話帳サービスを使う / 使わない enableDnsSupport(true / false) DNS解決機能そのもの
部屋のドアに表札を出す / 出さない enableDnsHostnames(true / false) パブリックDNS名の自動付与
マンション専用の内線電話帳 Route 53 プライベートホストゾーン VPC内だけのカスタムDNS

2つの設定を詳しく理解する

DNS解決の有効化
enableDnsSupport

AWSが提供するDNSサーバー(AmazonProvidedDNS)を使用するかどうかを決定します。マンションでいうと「管理人室の内線電話帳を使えるかどうか」に相当します。

デフォルト値:true(有効)
true:VPC内インスタンスがAWSのDNSリゾルバ(169.254.169.253)を使用できる
false:AWSのDNSサーバーは使えず、カスタムDNSを自前で用意する必要あり
DNSホスト名の有効化
enableDnsHostnames

パブリックIPを持つインスタンスに自動的にパブリックDNSホスト名を割り当てるかどうかを決定します。マンションでいうと「ドアに表札を自動で出すかどうか」です。

デフォルト値:デフォルトVPC → true、カスタムVPC → false
true:パブリックIPインスタンスにDNS名(例: ec2-203-0-113-25.compute-1.amazonaws.com)を付与
false:パブリックDNSホスト名なし。プライベートホストゾーンも使用不可。

VPC内のDNS解決フロー

enableDnsSupport = true の場合、EC2インスタンスからのDNS問い合わせがどのように処理されるかを示します。

VPC DNS解決フロー(enableDnsSupport = true) VPC(10.0.0.0/16) EC2 インスタンス 10.0.1.50 AmazonProvidedDNS 169.254.169.253 (管理人室の電話帳) Route 53 プライベート ホストゾーン(内線帳) パブリックDNS解決 外部ドメイン → IPアドレス プライベートDNS解決 app.internal → 10.0.2.10 1 DNS問い合わせ 2a 2b 3 IP返却

設定の組合せと動作

2つの設定の組合せは4パターン。マンションのたとえで直感的に理解できます。

推奨パターン
DnsSupport: true DnsHostnames: true
管理人室の電話帳あり + 全部屋の表札あり
AWSのDNSリゾルバ利用可能。パブリックIPインスタンスにDNSホスト名が付与される。Route 53プライベートホストゾーンも利用可能。最も多くのユースケースに対応。
最低限パターン
DnsSupport: true DnsHostnames: false
管理人室の電話帳あり + 表札なし(部屋番号だけ)
DNS解決は動作するが、インスタンスにパブリックDNS名が付かない。プライベートホストゾーンは使用不可。カスタムVPCのデフォルト。
非実用パターン
DnsSupport: false DnsHostnames: true
管理人室閉鎖 + 表札だけある(読めない)
DNSホスト名の設定だけ有効だが、DNS解決が無効なので名前解決できない。設定に意味がなく、実質的に使われることはない。
完全無効パターン
DnsSupport: false DnsHostnames: false
管理人室閉鎖 + 表札なし(完全匿名マンション)
AWSのDNSサーバーは使えず、ホスト名も付与されない。カスタムDNSサーバーを自前で運用する特殊なケースのみ。上級者向け。

Route 53 プライベートホストゾーンの必須条件

両方trueでなければ動かない!

プライベートホストゾーンをVPCで使用するには、以下の2つの設定が両方とも true である必要があります。どちらか一方でも false だと、VPC内のインスタンスはプライベートホストゾーンのDNSレコードを解決できません。

enableDnsSupport = true
+
enableDnsHostnames = true
=
プライベートホストゾーン
利用可能

マンションに例えると:管理人室の電話帳サービスが稼働していて(DnsSupport=true)、かつ全部屋に表札が出ている(DnsHostnames=true)状態で初めて、「マンション専用の内線電話帳」(プライベートホストゾーン)に名前を登録して、他の住人がその名前で電話をかけられるようになります。

どの設定を選ぶべき? 判断フロー

VPC DNS設定 判断フローチャート AWSのDNSリゾルバを 使用しますか? はい いいえ DnsSupport = false カスタムDNS自前運用 パブリックDNS名や プライベートHZは? 必要 不要 両方 true 推奨 ★ 全機能が利用可能 DnsSupport = true のみ DNS解決は可能、名前なし

ユースケース別の推奨設定

Webアプリケーション公開
インターネット向けWebサーバーを運用。ALB/ELBでDNS名が必要。Route 53でカスタムドメインも使用。
DnsSupport: true DnsHostnames: true
マイクロサービス間通信
プライベートホストゾーンで「api.internal」「db.internal」などの名前解決。サービスディスカバリに活用。
DnsSupport: true DnsHostnames: true
閉域ネットワーク(内部のみ)
外部公開なし。プライベートサブネットのみ。DNS解決はAWSのリゾルバを使うが、パブリックDNS名は不要。
DnsSupport: true DnsHostnames: false
オンプレDNS統合(ハイブリッド)
Route 53 Resolverエンドポイントを使い、オンプレとAWS間でDNSクエリを双方向転送。
DnsSupport: true DnsHostnames: true

実装例

# VPC作成時にDNS設定を有効化
aws ec2 create-vpc \
  --cidr-block "10.0.0.0/16" \
  --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=MyVPC}]'

# enableDnsSupportを有効化(デフォルトtrue)
aws ec2 modify-vpc-attribute \
  --vpc-id vpc-0123456789abcdef0 \
  --enable-dns-support '{"Value": true}'

# enableDnsHostnamesを有効化
aws ec2 modify-vpc-attribute \
  --vpc-id vpc-0123456789abcdef0 \
  --enable-dns-hostnames '{"Value": true}'

# 現在の設定を確認
aws ec2 describe-vpc-attribute \
  --vpc-id vpc-0123456789abcdef0 \
  --attribute enableDnsSupport

aws ec2 describe-vpc-attribute \
  --vpc-id vpc-0123456789abcdef0 \
  --attribute enableDnsHostnames
AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC with DNS settings enabled'

Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: '10.0.0.0/16'
      # DNS解決を有効化(管理人室の電話帳ON)
      EnableDnsSupport: true
      # DNSホスト名を有効化(表札ON)
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVPC

  # プライベートホストゾーンの関連付け
  PrivateHostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      Name: 'internal.example.com'
      VPCs:
        - VPCId: !Ref MyVPC
          VPCRegion: !Ref 'AWS::Region'
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"

  # DNS解決を有効化(管理人室の電話帳ON)
  enable_dns_support   = true

  # DNSホスト名を有効化(表札ON)
  enable_dns_hostnames = true

  tags = {
    Name = "MyVPC"
  }
}

# プライベートホストゾーン
resource "aws_route53_zone" "internal" {
  name = "internal.example.com"

  vpc {
    vpc_id = aws_vpc.main.id
  }
}

# DNSレコード例
resource "aws_route53_record" "api" {
  zone_id = aws_route53_zone.internal.zone_id
  name    = "api.internal.example.com"
  type    = "A"
  ttl     = 300
  records = ["10.0.2.10"]
}

ベストプラクティス & アンチパターン

ベストプラクティス
新規VPC作成時は、最初から両方trueに設定する。後から変更すると既存リソースに影響する可能性がある。
プライベートホストゾーンを使う場合は、設定変更「前」にVPCアトリビュートを確認する習慣をつける。
DHCPオプションセットのDNSサーバー設定(AmazonProvidedDNS)と組み合わせて運用する。
VPC間ピアリング時は、双方のVPCでDNS設定が揃っているか確認する。
アンチパターン
enableDnsSupportをfalseにしてからプライベートホストゾーンが動かないと悩む → 電話帳を閉じたら内線帳も使えない。
カスタムVPC作成後にDnsHostnamesを有効化し忘れる → パブリックDNS名がないため外部からアクセスしにくい。
DnsSupportだけtrueにしてPrivate Hosted Zoneを使おうとする → DnsHostnamesもtrueが必須。
本番環境でDNS設定を変更して、既存の名前解決が突然壊れる → 変更前に影響範囲を検証。

よくあるトラブルと対処法

症状:DNS名前解決ができない
VPC内のEC2インスタンスからドメイン名の解決ができない。nslookupやdigコマンドが応答しない。
確認1: enableDnsSupport が true か?
確認2: DHCPオプションセットのDNSサーバーが AmazonProvidedDNS になっているか?
確認3: セキュリティグループでDNS(UDP/TCP 53)のアウトバウンドが許可されているか?
症状:プライベートホストゾーンが解決されない
Route 53プライベートホストゾーンにレコードを追加したが、VPC内から名前解決できない。
確認1: enableDnsSupport と enableDnsHostnames が両方 true か?
確認2: ホストゾーンがそのVPCに関連付けられているか?
確認3: DNSキャッシュが残っていないか?(TTL経過を待つ or キャッシュクリア)

FAQ(よくある質問)

VPC内のインスタンスがAWSの内蔵DNSリゾルバ(169.254.169.253)を使えなくなります。マンションでいうと管理人室の電話帳を閉鎖するようなもので、住人は自分で電話番号を調べる手段を持たない限り連絡が取れなくなります。カスタムDNSサーバーを自前で運用するケース以外では、falseにする理由はほぼありません。

デフォルトVPCは「すぐに使える」ことを重視して、enableDnsSupportとenableDnsHostnamesの両方がtrueで作成されます。一方、カスタムVPCはenableDnsHostnamesがfalseで作成されます。これは、セキュリティやコスト最適化のために不要な機能を明示的に有効化してほしいというAWSの設計思想によるものです。

VPCピアリング接続では、ピアリング設定の「DNS解決」オプションを有効にすることで、相手VPCのプライベートDNSホスト名をプライベートIPに解決できるようになります。ただし、両方のVPCでenableDnsSupportとenableDnsHostnamesがtrueになっていることが前提条件です。

AWSがVPC内のインスタンスに提供するDNSリゾルバのIPアドレスです。リンクローカルアドレス(169.254.x.x)を使用しているため、VPC外からはアクセスできません。VPCのCIDRレンジ+2のアドレス(例:10.0.0.2)も同じDNSリゾルバを指します。enableDnsSupport = true の場合のみ機能します。

ANS-C01(Advanced Networking Specialty)では、VPC DNS設定はRoute 53やハイブリッドDNSの文脈で頻出です。特に「プライベートホストゾーンが動かないシナリオ」で、原因として enableDnsSupport / enableDnsHostnames の設定不備が正解選択肢になるパターンが典型的です。また、VPCピアリングやTransit Gatewayと組み合わせたDNS解決の問題にも出題されます。

まとめチートシート

enableDnsSupportとは?
AWSのDNSリゾルバ(169.254.169.253)を使えるかどうか。デフォルトtrue。OFFにするケースはほぼない。
enableDnsHostnamesとは?
パブリックIPインスタンスにDNSホスト名を自動付与するか。カスタムVPCではデフォルトfalse → 手動でtrueにする。
プライベートHZの条件は?
enableDnsSupport = true かつ enableDnsHostnames = true が必須。どちらかfalseだと動かない。
迷ったらどうする?
両方trueにしておけばOK。後から「動かない」原因の多くはこの設定漏れ。

Created by SSuzuki1063

AWS SAP Learning Resources