[新機能]Route 53 でマルチバリューの回答ができるようになりました

Amazon Route 53

大栗です。

Route 53で新機能がリリースされたので調査してみました。

マルチバリューの回答とは?

Route 53ではロードバランサと異なる仕組みで負荷分散をするために1つのFQDNに対して複数のIPアドレスを回答することができました。Route 53の1つのレコードに対して複数のIPアドレスを入力します。最大で8個のレコードを登録できます。

Route_53_Management_Console

今回のアップデートでは、IPアドレス毎に別のレコードとして登録する事ができます。

Route_53_Management_Console

しかし、通常では今までのDNSの回答とマルチバリューの回答は同様となります。

$ dig singlevalue.example.com

; <<>> DiG 9.8.3-P1 <<>> singlevalue.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27544
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
singlevalue.example.com. 15 IN A	192.0.2.134
singlevalue.example.com. 15 IN A	198.51.100.180
singlevalue.example.com. 15 IN A	203.0.113.73

;; Query time: 175 msec
;; SERVER: 10.63.200.10#53(10.63.200.10)
;; WHEN: Thu Jun 22 18:03:10 2017
;; MSG SIZE  rcvd: 100
$ dig multivalue.example.com

; <<>> DiG 9.8.3-P1 <<>> multivalue.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 416
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
multivalue.example.com. 15 IN A	192.0.2.184
multivalue.example.com. 15 IN A	198.51.100.128
multivalue.example.com. 15 IN A	203.0.113.90

;; Query time: 766 msec
;; SERVER: 10.63.200.10#53(10.63.200.10)
;; WHEN: Thu Jun 22 18:03:07 2017
;; MSG SIZE  rcvd: 99

何が嬉しいの?

今までは複数IPアドレスを設定することができたのですが、1レコードに設定するため各々のIPアドレスに対してヘルスチェックをすることができませんでした。そのため、レスポンスを返せないIPアドレスへアクセスする恐れがありました。

今回のマルチバリューの設定では、別々のレコードとして登録して各々のIPアドレスに対してヘルスチェックを行えるので正常なレスポンスを返せるIPアドレスのみのリストがDNSの回答となります。そのため正常なIPアドレスに対してアクセスすることができます。

試してみる

以下のように1つのドメインに対して3インスタンス、合計6個のインスタンスで考えます。各々のインスタンスにApacheがポート80で起動しており、/index.htmlにサンプルコンテンツを配置しています。

  • 「今までの回答」でDNS登録するインスタンス
    • singlevalue01:192.0.2.1
    • singlevalue02:192.0.2.2
    • singlevalue03:192.0.2.3
  • 「マルチバリューの回答」でDNS登録するインスタンス
    • multivalue01:198.51.100.1
    • multivalue02:198.51.100.2
    • multivalue03:198.51.100.3

「今までの回答」でDNS登録

singlevalue.example.comのAレコードを登録します。

項目
Name singlevalue.example.com
Type A – IPv4 address
Alias No
TTL (Seconds) 15
Value 192.0.2.1
192.0.2.2
192.0.2.3
Routing Policy Simple

Route_53_Management_Console

Route 53のヘルスチェック作成

multivalue.example.comに登録するインスタンス3個に対して各々のヘルスチェックを作成します。

項目 値(1個目) 値(2個目) 値(3個目)
Name multivalue01_check multivalue02_check multivalue03_check
What to monitor Endpoint Endpoint Endpoint
Specify endpoint by IP address IP address IP address
Protocol HTTP HTTP HTTP
IP address 198.51.100.1 198.51.100.2 198.51.100.3
Host name (空) (空) (空)
Port 80 80 80
Path /index.html /index.html /index.html

Route_53_Management_Console

今回は通知をさせないため、次の画面『Get notified when health check fails』でのCreate alarmNoにします。

「マルチバリューの回答」でDNS登録

multivalue.example.comのAレコードを登録します。「マルチバリューの回答」ではIPアドレス毎にレコードを登録するので3レコードを登録します。Set IDは同じName、Typeの中でユニークな値を設定します。

項目 値(1個目) 値(2個目) 値(3個目)
Name multivalue.example.com multivalue.example.com multivalue.example.com
Type A – IPv4 address A – IPv4 address A – IPv4 address
Alias No No No
TTL (Seconds) 15 15 15
Value 198.51.100.1 198.51.100.2 198.51.100.3
Routing Policy Multivalue Answer Multivalue Answer Multivalue Answer
Set ID SAMPLE01 SAMPLE02 SAMPLE03
Associate with Health Check Yes Yes Yes
Health Check to Associate multivalue01_check multivalue02_check multivalue03_check

Route_53_Management_Console

DNSの回答を確認

digの回答を確認します。「今までの回答」も「マルチバリューの回答」も登録したIPアドレスが回答されます。

$ dig singlevalue.example.com

; <<>> DiG 9.8.3-P1 <<>> singlevalue.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27544
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
singlevalue.example.com. 15 IN A	192.0.2.1
singlevalue.example.com. 15 IN A	192.0.2.2
singlevalue.example.com. 15 IN A	192.0.2.3

;; Query time: 175 msec
;; SERVER: 10.63.200.10#53(10.63.200.10)
;; WHEN: Thu Jun 22 18:03:10 2017
;; MSG SIZE  rcvd: 100
$ dig multivalue.example.com

; <<>> DiG 9.8.3-P1 <<>> multivalue.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 416
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
multivalue.example.com. 15 IN A	198.51.100.2
multivalue.example.com. 15 IN A	198.51.100.3
multivalue.example.com. 15 IN A	198.51.100.1

;; Query time: 766 msec
;; SERVER: 10.63.200.10#53(10.63.200.10)
;; WHEN: Thu Jun 22 18:03:07 2017
;; MSG SIZE  rcvd: 99

アクセスすると普通にレスポンスが戻ってきます。

$ curl http://singlevalue.example.com/index.html
Hello World!
$ curl http://192.0.2.1/index.html
Hello World!
$ curl http://192.0.2.2/index.html
Hello World!
$ curl http://192.0.2.3/index.html
Hello World!
$ curl http://multivalue.example.com/index.html
Hello World!
$ curl http://198.51.100.1/index.html
Hello World!
$ curl http://198.51.100.2/index.html
Hello World!
$ curl http://198.51.100.3/index.html
Hello World!

一部レスポンスを返せない場合

一部のインスタンスがレスポンスを返せない場合に挙動を確認するため、以下のインスタンスのApacheを停止します。

  • singlevalue03:192.0.2.3
  • multivalue03:198.51.100.3
$ sudo service httpd stop
Stopping httpd:                                            [  OK  ]
$ sudo service httpd status
httpd is stopped

しばらくするとmultivalue03のヘルスチェックがUnhealthyになります

Route_53_Management_Console

ヘルスチェックがUnhealthyになった状態でdigの回答を確認します。今度は「今までの回答」と「マルチバリューの回答」で内容が異なります。「今までの回答」は変わっていませんが「マルチバリューの回答」ではUnhealthyであるmultivalue03のIPアドレス(198.51.100.3)が回答されず2個のIPが回答されます。

$ dig singlevalue.example.com

; <<>> DiG 9.8.3-P1 <<>> singlevalue.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27544
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
singlevalue.example.com. 15 IN A	192.0.2.1
singlevalue.example.com. 15 IN A	192.0.2.2
singlevalue.example.com. 15 IN A	192.0.2.3

;; Query time: 175 msec
;; SERVER: 10.63.200.10#53(10.63.200.10)
;; WHEN: Thu Jun 22 18:03:10 2017
;; MSG SIZE  rcvd: 100
$ dig multivalue.example.com

; <<>> DiG 9.8.3-P1 <<>> multivalue.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 416
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
multivalue.example.com. 15 IN A	198.51.100.1
multivalue.example.com. 15 IN A	198.51.100.2


;; Query time: 766 msec
;; SERVER: 10.63.200.10#53(10.63.200.10)
;; WHEN: Thu Jun 22 18:03:07 2017
;; MSG SIZE  rcvd: 99

アクセスすると「今までの回答」ではアクセスできないIPアドレスがありますが、「マルチバリューの回答」では全てレスポンスが戻ってきました。

$ curl http://singlevalue.example.com/index.html
Hello World!
$ curl http://192.0.2.1/index.html
Hello World!
$ curl http://192.0.2.2/index.html
Hello World!
$ curl http://192.0.2.3/index.html
curl: (7) Failed to connect to 13.112.121.128 port 80: Connection refused
$ curl http://multivalue.example.com/index.html
Hello World!
$ curl http://198.51.100.1/index.html
Hello World!
$ curl http://198.51.100.2/index.html
Hello World!

さいごに

今までも一つのドメインで複数のアドレスを回答することはできましたが、今回のアップデートにより健全なIPアドレスのみ回答する事ができるようになりました。ALB/CLBを使用できない環境で設定する時にはRoute 53を使って負荷分散する時にはアクセス先の健全性確認ができませんでした。ルーティングをWeightにすることで健全なものだけの回答にする方法もありましたが、1回のDNSリクエストで回答するIPアドレスは1個となります。

今回のアップデートでは健全なIPアドレスのリストを取得できるので、通常の利用法であるドメインへのアクセスだけでなく、サービスディスカバリなどの用途としても使用できるのではないでしょうか?様々な応用ができそうな機能だと感じました。