[新機能]Route 53 でマルチバリューの回答ができるようになりました
大栗です。
Route 53で新機能がリリースされたので調査してみました。
- Amazon Route 53 announces support for multivalue answers in response to DNS queries
- Values for Multivalue Answer Resource Record Sets
マルチバリューの回答とは?
Route 53ではロードバランサと異なる仕組みで負荷分散をするために1つのFQDNに対して複数のIPアドレスを回答することができました。Route 53の1つのレコードに対して複数のIPアドレスを入力します。最大で8個のレコードを登録できます。
今回のアップデートでは、IPアドレス毎に別のレコードとして登録する事ができます。
しかし、通常では今までの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のヘルスチェック作成
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 |
今回は通知をさせないため、次の画面『Get notified when health check fails』でのCreate alarm
はNo
にします。
「マルチバリューの回答」で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 |
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
になります
ヘルスチェックが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アドレスのリストを取得できるので、通常の利用法であるドメインへのアクセスだけでなく、サービスディスカバリなどの用途としても使用できるのではないでしょうか?様々な応用ができそうな機能だと感じました。