route53のネガティブキャッシュについて

aws_logoDNS にはネガティブキャッシュの仕組みがあり、存在しないドメイン(NXDOMAIN)を問い合わせた時は、そのドメインが存在しないということを一定期間キャッシュしてくれる。

ドメイン追加前にうっかりフライングで新規ドメインを名前解決しようとするとネガティブキャッシュされていまい、ドメイン追加してもキャッシュが expire されるまでは名前解決できなくなってしまう。

一般的な DNS サービスでは、SOA の minimum 値がネガティブキャッシュ期間となる。

Amazon の DNS サービス route 53 はネガティブキャッシュ期間を次のルールで決定している。

The minimum time to live (TTL). This value helps define the length of time that an NXDOMAIN result, which indicates that a domain does not exist, should be cached by a DNS resolver… The duration of negative caching is the lesser of the SOA record’s TTL or the value of the minimum TTL field.

via AWS Documentation ≫ Amazon Route 53 ≫ Developer Guide ≫ What Is Amazon Route 53? ≫ NS and SOA Records that Amazon Route 53 Creates for a Hosted Zone
http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/SOA-NSrecords.html

minimum の設定

AWS Management Console では

Route 53 => Hosted Zones => SOA Record の編集画面にある“TTL(Seconds)” の箇所で設定する。

dns_route53_ttl

negative cache の確認

現在の SOA の TTL を確認

$ dig -t soa example.com

; <<>> DiG 9.8.1-P1 <<>> -t soa example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35410
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.com.                    IN      SOA

;; ANSWER SECTION:
example.com.             900     IN      SOA     ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; AUTHORITY SECTION:
example.com.             172800  IN      NS      ns-1531.awsdns-63.org.
example.com.             172800  IN      NS      ns-1767.awsdns-28.co.uk.
example.com.             172800  IN      NS      ns-366.awsdns-45.com.
example.com.             172800  IN      NS      ns-578.awsdns-08.net.

;; Query time: 63 msec
;; SERVER: 205.251.193.110#53(205.251.193.110)
;; WHEN: Thu May 22 01:01:39 2014
;; MSG SIZE  rcvd: 226

まず確認すべきは SOA レコード。

example.com.             900     IN      SOA     ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
  • SOA レコードの TTL は 900
  • minimum TTL は 86400

となっている。

900 < 86400 なので、NXDOMAIN のネガティブキャッシュ期間は 900 sec となるはず。

登録されていないAレコードを検索

$ dig -t a foo.example.com

; <<>> DiG 9.8.1-P1 <<>> -t a foo.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24517
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;foo.example.com.                        IN      A

;; AUTHORITY SECTION:
example.com.             900     IN      SOA     ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 62 msec
;; SERVER: 205.251.193.110#53(205.251.193.110)
;; WHEN: Thu May 22 01:02:48 2014
;; MSG SIZE  rcvd: 110

存在しない foo.example.com の A レコードを検索。

TTL は 900 となっている。

期待通り。

SOA の TTL を変更

SOA レコードの TTL を route53 デフォルトの 900 から 300 に変えてみる。

$ aws route53 list-resource-record-sets --hosted-zone-id DUMMY
{
    "ResourceRecordSets": [
        {
            ...
        },
        {
            "ResourceRecords": [
                {
                    "Value": "ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                }
            ],
            "Type": "SOA",
            "Name": "example.com.",
            "TTL": 300
        }
    ]
}
$ dig -t a bar.example.com

; <<>> DiG 9.8.1-P1 <<>> -t a bar.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 53567
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;bar.example.com.                        IN      A

;; AUTHORITY SECTION:
example.com.             300     IN      SOA     ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 13 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Thu May 22 01:04:23 2014
;; MSG SIZE  rcvd: 110

存在しない bar.example.com の A レコードを検索。

TTL は 900 ではなく 300 となっている。

期待通り。

TTL に大きな値を設定

SOA レコードの TTL を 172800 に変更してみる。
minimum TTL は 86400 なので 86400 < 172800 となり、ネガティブキャッシュの TTL は 86400 となるはずだが、、、

$ aws route53 list-resource-record-sets --hosted-zone-id DUMMY
{
    "ResourceRecordSets": [
        {
            ...
        },
        {
            "ResourceRecords": [
                {
                    "Value": "ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                }
            ],
            "Type": "SOA",
            "Name": "example.com.",
            "TTL": 172800
        }
    ]
}
$ dig -t a baz.example.com                               
; <<>> DiG 9.8.1-P1 <<>> -t a baz.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 5254
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;baz.example.com.                        IN      A

;; AUTHORITY SECTION:
example.com.             1200    IN      SOA     ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 277 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Thu May 22 01:09:58 2014
;; MSG SIZE  rcvd: 110

確認すると 1200 となっている。

2006年2月当時のこのへんの情報によると

最新のDNSキャッシュサーバの実装では、SOAのminimum値がどんなに大きな値でも一定の上限(3600~10800)を超えない範囲の時間を、ネガティブキャッシュの期間として処理しています。

ということだそうなので、 route53 のバックエンドシステムは上限を 1200 にしているのだろう。

references

Leave a comment